From 4f16ace5baa9e5a03e013d4c16fb27d2b1e42419 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Sun, 30 Jun 2024 08:34:09 -0700 Subject: [PATCH 1/3] Fix #2286 --- .../org/lflang/generator/GeneratorBase.java | 5 +-- .../org/lflang/generator/GeneratorUtils.java | 32 +++++++++++++------ test/C/src/target/ImportedCMakeInclude.lf | 8 +++++ 3 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 test/C/src/target/ImportedCMakeInclude.lf diff --git a/core/src/main/java/org/lflang/generator/GeneratorBase.java b/core/src/main/java/org/lflang/generator/GeneratorBase.java index d8b3d2d7d4..0713b863be 100644 --- a/core/src/main/java/org/lflang/generator/GeneratorBase.java +++ b/core/src/main/java/org/lflang/generator/GeneratorBase.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.stream.Collectors; import org.eclipse.core.resources.IMarker; import org.eclipse.emf.ecore.EObject; @@ -227,7 +228,7 @@ public void doGenerate(Resource resource, LFGeneratorContext context) { // to validate, which happens in setResources(). setReactorsAndInstantiationGraph(context.getMode()); - List allResources = GeneratorUtils.getResources(reactors); + Set allResources = GeneratorUtils.getResources(reactors); GeneratorUtils.accommodatePhysicalActionsIfPresent( allResources, @@ -413,7 +414,7 @@ protected void checkWatchdogSupport(boolean isSupported) { * Finds and transforms connections into forwarding reactions iff the connections have the same * destination as other connections or reaction in mutually exclusive modes. */ - private void transformConflictingConnectionsInModalReactors(List resources) { + private void transformConflictingConnectionsInModalReactors(Set resources) { for (Resource r : resources) { var transform = ASTUtils.findConflictingConnectionsInModalReactors(r); if (!transform.isEmpty()) { diff --git a/core/src/main/java/org/lflang/generator/GeneratorUtils.java b/core/src/main/java/org/lflang/generator/GeneratorUtils.java index 77240613e6..f7d6a07855 100644 --- a/core/src/main/java/org/lflang/generator/GeneratorUtils.java +++ b/core/src/main/java/org/lflang/generator/GeneratorUtils.java @@ -1,8 +1,8 @@ package org.lflang.generator; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; +import java.util.LinkedHashSet; +import java.util.Set; + import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -13,6 +13,7 @@ import org.lflang.generator.LFGeneratorContext.Mode; import org.lflang.lf.Action; import org.lflang.lf.ActionOrigin; +import org.lflang.lf.ImportedReactor; import org.lflang.lf.Instantiation; import org.lflang.lf.Reactor; import org.lflang.lf.TargetDecl; @@ -40,7 +41,7 @@ public static TargetDecl findTargetDecl(Resource resource) { * targetConfig}. This is a helper function for setTargetConfig. It should not be used elsewhere. */ public static void accommodatePhysicalActionsIfPresent( - List resources, + Set resources, boolean setsKeepAliveOptionAutomatically, TargetConfig targetConfig, MessageReporter messageReporter) { @@ -84,17 +85,28 @@ public static Iterable findAll(Resource resource, Class nodeType) { * @param reactors The reactors for which to find containing resources. * @return the resources that provide the given reactors. */ - public static List getResources(Iterable reactors) { - HashSet visited = new HashSet<>(); - List resources = new ArrayList<>(); + public static Set getResources(Iterable reactors) { + Set visited = new LinkedHashSet<>(); for (Reactor r : reactors) { Resource resource = r.eResource(); if (!visited.contains(resource)) { - visited.add(resource); - resources.add(resource); + addInheritedResources(r, visited); + } + } + return visited; + } + + public static void addInheritedResources(Reactor reactor, Set resources) { + resources.add(reactor.eResource()); + for (var s : reactor.getSuperClasses()) { + if (!resources.contains(s)) { + if (s instanceof ImportedReactor i) { + addInheritedResources(i.getReactorClass(), resources); + } else if (s instanceof Reactor r) { + addInheritedResources(r, resources); + } } } - return resources; } /** diff --git a/test/C/src/target/ImportedCMakeInclude.lf b/test/C/src/target/ImportedCMakeInclude.lf new file mode 100644 index 0000000000..b19fa87069 --- /dev/null +++ b/test/C/src/target/ImportedCMakeInclude.lf @@ -0,0 +1,8 @@ +target C { + timeout: 1ms +} +import Foo from "./CMakeInclude.lf" +reactor Bar extends Foo { } +main reactor { + r = new Foo() +} \ No newline at end of file From 55cc49606014d9fb22feb179f90dbd8b5f120f3c Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Sun, 30 Jun 2024 08:41:23 -0700 Subject: [PATCH 2/3] Added test and comments --- .../main/java/org/lflang/generator/GeneratorUtils.java | 6 +++--- test/C/src/target/ImportedCMakeInclude.lf | 10 +++++++--- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/lflang/generator/GeneratorUtils.java b/core/src/main/java/org/lflang/generator/GeneratorUtils.java index f7d6a07855..5db8c0c2f9 100644 --- a/core/src/main/java/org/lflang/generator/GeneratorUtils.java +++ b/core/src/main/java/org/lflang/generator/GeneratorUtils.java @@ -2,7 +2,6 @@ import java.util.LinkedHashSet; import java.util.Set; - import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; @@ -80,7 +79,7 @@ public static Iterable findAll(Resource resource, Class nodeType) { } /** - * Return the resources that provide the given reactors. + * Return the resources that provide the given reactors and their ancestors. * * @param reactors The reactors for which to find containing resources. * @return the resources that provide the given reactors. @@ -96,7 +95,8 @@ public static Set getResources(Iterable reactors) { return visited; } - public static void addInheritedResources(Reactor reactor, Set resources) { + /** Collect all resources associated with reactor through class inheritance. */ + private static void addInheritedResources(Reactor reactor, Set resources) { resources.add(reactor.eResource()); for (var s : reactor.getSuperClasses()) { if (!resources.contains(s)) { diff --git a/test/C/src/target/ImportedCMakeInclude.lf b/test/C/src/target/ImportedCMakeInclude.lf index b19fa87069..bc922d7429 100644 --- a/test/C/src/target/ImportedCMakeInclude.lf +++ b/test/C/src/target/ImportedCMakeInclude.lf @@ -1,8 +1,12 @@ target C { - timeout: 1ms + timeout: 1 ms } + import Foo from "./CMakeInclude.lf" -reactor Bar extends Foo { } + +reactor Bar extends Foo { +} + main reactor { r = new Foo() -} \ No newline at end of file +} From 45fa77419fab495f87048e140251836d4d9f8994 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Sun, 30 Jun 2024 08:56:09 -0700 Subject: [PATCH 3/3] Shave off one more line --- core/src/main/java/org/lflang/generator/GeneratorUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/generator/GeneratorUtils.java b/core/src/main/java/org/lflang/generator/GeneratorUtils.java index 5db8c0c2f9..bda5a5cf2e 100644 --- a/core/src/main/java/org/lflang/generator/GeneratorUtils.java +++ b/core/src/main/java/org/lflang/generator/GeneratorUtils.java @@ -87,8 +87,7 @@ public static Iterable findAll(Resource resource, Class nodeType) { public static Set getResources(Iterable reactors) { Set visited = new LinkedHashSet<>(); for (Reactor r : reactors) { - Resource resource = r.eResource(); - if (!visited.contains(resource)) { + if (!visited.contains(r.eResource())) { addInheritedResources(r, visited); } }