From 091f995a409a728df40130b674a6a200d2e5a0ad Mon Sep 17 00:00:00 2001 From: Peter Donovan Date: Sun, 4 Jun 2023 14:23:34 -0700 Subject: [PATCH] Dignify the "empty list of all reactors" hack. --- core/src/main/java/org/lflang/ModelInfo.java | 13 ++---------- .../synthesis/LinguaFrancaSynthesis.java | 5 ++--- .../federated/extensions/CExtension.java | 7 +++---- .../federated/extensions/TSExtension.java | 5 ++--- .../federated/generator/FedGenerator.java | 2 +- .../org/lflang/generator/ReactorInstance.java | 21 +++++++++++++------ .../generator/c/TypeParameterizedReactor.java | 2 +- .../tests/compiler/LetInferenceTests.java | 4 +++- 8 files changed, 29 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/org/lflang/ModelInfo.java b/core/src/main/java/org/lflang/ModelInfo.java index fd4e05d6d3..17ee7cfb76 100644 --- a/core/src/main/java/org/lflang/ModelInfo.java +++ b/core/src/main/java/org/lflang/ModelInfo.java @@ -108,21 +108,12 @@ public void update(Model model, ErrorReporter reporter) { var main = model.getReactors().stream().filter(it -> it.isMain() || it.isFederated()).findFirst(); if (main.isPresent()) { - var inst = - new ReactorInstance( - main.get(), - reporter, - List.of()); // FIXME: This might work, but it breaks invariants. + var inst = new ReactorInstance(main.get(), reporter); topLevelReactorInstances.add(inst); } else { model .getReactors() - .forEach( - it -> - topLevelReactorInstances.add( - new ReactorInstance( - it, reporter, - List.of()))); // FIXME: This might work, but it breaks invariants. + .forEach(it -> topLevelReactorInstances.add(new ReactorInstance(it, reporter))); } // don't store the graph into a field, only the cycles. for (ReactorInstance top : topLevelReactorInstances) { diff --git a/core/src/main/java/org/lflang/diagram/synthesis/LinguaFrancaSynthesis.java b/core/src/main/java/org/lflang/diagram/synthesis/LinguaFrancaSynthesis.java index cbe57a34e6..45f3342a0a 100644 --- a/core/src/main/java/org/lflang/diagram/synthesis/LinguaFrancaSynthesis.java +++ b/core/src/main/java/org/lflang/diagram/synthesis/LinguaFrancaSynthesis.java @@ -303,8 +303,7 @@ public KNode transform(final Model model) { Reactor main = IterableExtensions.findFirst(model.getReactors(), _utilityExtensions::isMainOrFederated); if (main != null) { - ReactorInstance reactorInstance = - new ReactorInstance(main, new SynthesisErrorReporter(), List.of()); + ReactorInstance reactorInstance = new ReactorInstance(main, new SynthesisErrorReporter()); rootNode .getChildren() .addAll(createReactorNode(reactorInstance, true, null, null, new HashMap<>())); @@ -320,7 +319,7 @@ public KNode transform(final Model model) { for (Reactor reactor : model.getReactors()) { if (reactor == main) continue; ReactorInstance reactorInstance = - new ReactorInstance(reactor, new SynthesisErrorReporter(), List.of()); + new ReactorInstance(reactor, new SynthesisErrorReporter()); reactorNodes.addAll( createReactorNode( reactorInstance, diff --git a/core/src/main/java/org/lflang/federated/extensions/CExtension.java b/core/src/main/java/org/lflang/federated/extensions/CExtension.java index d41dc823b3..121cf5d817 100644 --- a/core/src/main/java/org/lflang/federated/extensions/CExtension.java +++ b/core/src/main/java/org/lflang/federated/extensions/CExtension.java @@ -593,7 +593,7 @@ private String generateInitializeTriggers( var federatedReactor = FedASTUtils.findFederatedReactor(federate.instantiation.eResource()); var oldFederatedReactorName = federatedReactor.getName(); federatedReactor.setName(federate.name); - var main = new ReactorInstance(federatedReactor, errorReporter, 1, List.of()); + var main = new ReactorInstance(federatedReactor, errorReporter, 1); code.pr(CExtensionUtils.initializeTriggersForNetworkActions(federate, main)); code.pr(CExtensionUtils.initializeTriggerForControlReactions(main, main, federate)); federatedReactor.setName(oldFederatedReactorName); @@ -773,9 +773,8 @@ private String generateCodeForPhysicalActions( new ReactorInstance( FedASTUtils.findFederatedReactor(federate.instantiation.eResource()), errorReporter, - 1, - List.of()); - var instance = new ReactorInstance(federateClass, main, errorReporter, List.of()); + 1); + var instance = new ReactorInstance(federateClass, main, errorReporter); var outputDelayMap = federate.findOutputsConnectedToPhysicalActions(instance); var minDelay = TimeValue.MAX_VALUE; Output outputFound = null; diff --git a/core/src/main/java/org/lflang/federated/extensions/TSExtension.java b/core/src/main/java/org/lflang/federated/extensions/TSExtension.java index c04c6672d9..14df96afb5 100644 --- a/core/src/main/java/org/lflang/federated/extensions/TSExtension.java +++ b/core/src/main/java/org/lflang/federated/extensions/TSExtension.java @@ -159,9 +159,8 @@ private TimeValue getMinOutputDelay( new ReactorInstance( FedASTUtils.findFederatedReactor(federate.instantiation.eResource()), errorReporter, - 1, - List.of()); - var instance = new ReactorInstance(federateClass, main, errorReporter, List.of()); + 1); + var instance = new ReactorInstance(federateClass, main, errorReporter); var outputDelayMap = federate.findOutputsConnectedToPhysicalActions(instance); var minOutputDelay = TimeValue.MAX_VALUE; Output outputFound = null; diff --git a/core/src/main/java/org/lflang/federated/generator/FedGenerator.java b/core/src/main/java/org/lflang/federated/generator/FedGenerator.java index 0a83d880a4..6656a489f8 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedGenerator.java +++ b/core/src/main/java/org/lflang/federated/generator/FedGenerator.java @@ -481,7 +481,7 @@ private void replaceFederateConnectionsWithProxies(Reactor federation) { // to duplicate the rather complicated logic in that class. We specify a depth of 1, // so it only creates the reactors immediately within the top level, not reactors // that those contain. - ReactorInstance mainInstance = new ReactorInstance(federation, errorReporter, List.of()); + ReactorInstance mainInstance = new ReactorInstance(federation, errorReporter); for (ReactorInstance child : mainInstance.children) { for (PortInstance output : child.outputs) { diff --git a/core/src/main/java/org/lflang/generator/ReactorInstance.java b/core/src/main/java/org/lflang/generator/ReactorInstance.java index a793f39442..5a1fdf4b8d 100644 --- a/core/src/main/java/org/lflang/generator/ReactorInstance.java +++ b/core/src/main/java/org/lflang/generator/ReactorInstance.java @@ -91,6 +91,17 @@ public class ReactorInstance extends NamedInstance { */ public ReactorInstance(Reactor reactor, ErrorReporter reporter, List reactors) { this(ASTUtils.createInstantiation(reactor), null, reporter, -1, reactors); + assert !reactors.isEmpty(); + } + + /** + * Create a new instantiation hierarchy that starts with the given top-level reactor. + * + * @param reactor The top-level reactor. + * @param reporter The error reporter. + */ + public ReactorInstance(Reactor reactor, ErrorReporter reporter) { + this(ASTUtils.createInstantiation(reactor), null, reporter, -1, List.of()); } /** @@ -101,9 +112,8 @@ public ReactorInstance(Reactor reactor, ErrorReporter reporter, List re * @param reporter The error reporter. * @param desiredDepth The depth to which to go, or -1 to construct the full hierarchy. */ - public ReactorInstance( - Reactor reactor, ErrorReporter reporter, int desiredDepth, List reactors) { - this(ASTUtils.createInstantiation(reactor), null, reporter, desiredDepth, reactors); + public ReactorInstance(Reactor reactor, ErrorReporter reporter, int desiredDepth) { + this(ASTUtils.createInstantiation(reactor), null, reporter, desiredDepth, List.of()); } /** @@ -114,9 +124,8 @@ public ReactorInstance( * @param parent The parent reactor instance. * @param reporter The error reporter. */ - public ReactorInstance( - Reactor reactor, ReactorInstance parent, ErrorReporter reporter, List reactors) { - this(ASTUtils.createInstantiation(reactor), parent, reporter, -1, reactors); + public ReactorInstance(Reactor reactor, ReactorInstance parent, ErrorReporter reporter) { + this(ASTUtils.createInstantiation(reactor), parent, reporter, -1, List.of()); } ////////////////////////////////////////////////////// diff --git a/core/src/main/java/org/lflang/generator/c/TypeParameterizedReactor.java b/core/src/main/java/org/lflang/generator/c/TypeParameterizedReactor.java index ac2ce6572d..b026525e82 100644 --- a/core/src/main/java/org/lflang/generator/c/TypeParameterizedReactor.java +++ b/core/src/main/java/org/lflang/generator/c/TypeParameterizedReactor.java @@ -134,7 +134,7 @@ public String uniqueName() { return "_" + uniqueName(resolved) + typeParams.stream() - .map(it -> it + "_" + typeArgs.get(it)) + .map(it -> typeArgs.get(it).getId()) // FIXME: may be more than just an ID .collect(Collectors.joining("_")); } diff --git a/core/src/test/java/org/lflang/tests/compiler/LetInferenceTests.java b/core/src/test/java/org/lflang/tests/compiler/LetInferenceTests.java index 38387ac8a4..244d2a35bb 100644 --- a/core/src/test/java/org/lflang/tests/compiler/LetInferenceTests.java +++ b/core/src/test/java/org/lflang/tests/compiler/LetInferenceTests.java @@ -27,6 +27,7 @@ import static org.lflang.ast.ASTUtils.toDefinition; +import java.util.List; import javax.inject.Inject; import org.eclipse.emf.common.util.TreeIterator; import org.eclipse.emf.ecore.EObject; @@ -125,7 +126,8 @@ public void testLet() throws Exception { } ReactorInstance mainInstance = - new ReactorInstance(toDefinition(mainDef.getReactorClass()), new DefaultErrorReporter()); + new ReactorInstance( + toDefinition(mainDef.getReactorClass()), new DefaultErrorReporter()); for (ReactorInstance reactorInstance : mainInstance.children) { if (reactorInstance.isGeneratedDelay()) {