From f58ee50ed7df615385e5d587638204341f6be83a Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Sun, 8 Sep 2024 19:05:46 -0700 Subject: [PATCH 01/33] Added angular bracket import for reusable reactors module --- .../src/main/java/org/lflang/LinguaFranca.xtext | 4 +++- core/src/main/java/org/lflang/ast/IsEqual.java | 1 + core/src/main/java/org/lflang/ast/ToLf.java | 3 ++- core/src/main/java/org/lflang/ast/ToSExpr.java | 3 ++- .../org/lflang/scoping/LFScopeProviderImpl.java | 17 ++++++++++++++--- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index ba45b3bd0c..19acb14b47 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -64,7 +64,7 @@ Model: /** * Import declaration. */ -Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; +Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | importPackage=LIB_PATH) ';'?; ReactorDecl: Reactor | ImportedReactor; @@ -431,6 +431,8 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; +terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '>'; + terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; terminal ANY_OTHER: .; diff --git a/core/src/main/java/org/lflang/ast/IsEqual.java b/core/src/main/java/org/lflang/ast/IsEqual.java index 8eec27a430..afe1568f96 100644 --- a/core/src/main/java/org/lflang/ast/IsEqual.java +++ b/core/src/main/java/org/lflang/ast/IsEqual.java @@ -99,6 +99,7 @@ public Boolean caseModel(Model object) { public Boolean caseImport(Import object) { return new ComparisonMachine<>(object, Import.class) .equalAsObjects(Import::getImportURI) + .equalAsObjects(Import::getImportPackage) .listsEquivalent(Import::getReactorClasses) .conclusion; } diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 3b1b1e48df..dda8524aa7 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -398,7 +398,8 @@ public MalleableString caseImport(Import object) { // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) .append(" from \"") - .append(object.getImportURI()) + // TODO: Check if angular brackets (< >) are required + .append(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()) .append("\"") .get(); } diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index a514d98234..dd013dd9fa 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,8 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - new SAtom<>(object.getImportURI()), + // TODO: Check if angular brackets (< >) are required + new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 3455c1d822..7f55a01ef5 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -26,16 +26,23 @@ package org.lflang.scoping; import static java.util.Collections.emptyList; -import static org.lflang.ast.ASTUtils.*; +import static org.lflang.ast.ASTUtils.allActions; +import static org.lflang.ast.ASTUtils.allInputs; +import static org.lflang.ast.ASTUtils.allOutputs; +import static org.lflang.ast.ASTUtils.allParameters; +import static org.lflang.ast.ASTUtils.allTimers; +import static org.lflang.ast.ASTUtils.allWatchdogs; +import static org.lflang.ast.ASTUtils.toDefinition; -import com.google.inject.Inject; import java.util.ArrayList; + import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.naming.SimpleNameProvider; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; + import org.lflang.lf.Assignment; import org.lflang.lf.Connection; import org.lflang.lf.Deadline; @@ -51,6 +58,8 @@ import org.lflang.lf.VarRef; import org.lflang.lf.Watchdog; +import com.google.inject.Inject; + /** * This class enforces custom rules. In particular, it resolves references to parameters, ports, * actions, and timers. Ports can be referenced across at most one level of hierarchy. Parameters, @@ -104,7 +113,9 @@ public IScope getScope(EObject context, EReference reference) { * statement. */ protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { - String importURI = ((Import) context.eContainer()).getImportURI(); + String importURI = ((Import) context.eContainer()).getImportURI() != null + ? ((Import) context.eContainer()).getImportURI() + : ((Import) context.eContainer()).getImportPackage().replace("<", "").replace(">", ""); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { From 4319ead4ecebcd85e237309d50bcbd7ea3928f5d Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Sun, 8 Sep 2024 19:05:46 -0700 Subject: [PATCH 02/33] Added angular bracket import for reusable reactors module --- .../src/main/java/org/lflang/LinguaFranca.xtext | 4 +++- core/src/main/java/org/lflang/ast/IsEqual.java | 1 + core/src/main/java/org/lflang/ast/ToLf.java | 3 ++- core/src/main/java/org/lflang/ast/ToSExpr.java | 3 ++- .../org/lflang/scoping/LFScopeProviderImpl.java | 17 ++++++++++++++--- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index ba45b3bd0c..19acb14b47 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -64,7 +64,7 @@ Model: /** * Import declaration. */ -Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; +Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | importPackage=LIB_PATH) ';'?; ReactorDecl: Reactor | ImportedReactor; @@ -431,6 +431,8 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; +terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '>'; + terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; terminal ANY_OTHER: .; diff --git a/core/src/main/java/org/lflang/ast/IsEqual.java b/core/src/main/java/org/lflang/ast/IsEqual.java index 8eec27a430..afe1568f96 100644 --- a/core/src/main/java/org/lflang/ast/IsEqual.java +++ b/core/src/main/java/org/lflang/ast/IsEqual.java @@ -99,6 +99,7 @@ public Boolean caseModel(Model object) { public Boolean caseImport(Import object) { return new ComparisonMachine<>(object, Import.class) .equalAsObjects(Import::getImportURI) + .equalAsObjects(Import::getImportPackage) .listsEquivalent(Import::getReactorClasses) .conclusion; } diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 3b1b1e48df..dda8524aa7 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -398,7 +398,8 @@ public MalleableString caseImport(Import object) { // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) .append(" from \"") - .append(object.getImportURI()) + // TODO: Check if angular brackets (< >) are required + .append(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()) .append("\"") .get(); } diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index a514d98234..dd013dd9fa 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,8 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - new SAtom<>(object.getImportURI()), + // TODO: Check if angular brackets (< >) are required + new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 3455c1d822..7f55a01ef5 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -26,16 +26,23 @@ package org.lflang.scoping; import static java.util.Collections.emptyList; -import static org.lflang.ast.ASTUtils.*; +import static org.lflang.ast.ASTUtils.allActions; +import static org.lflang.ast.ASTUtils.allInputs; +import static org.lflang.ast.ASTUtils.allOutputs; +import static org.lflang.ast.ASTUtils.allParameters; +import static org.lflang.ast.ASTUtils.allTimers; +import static org.lflang.ast.ASTUtils.allWatchdogs; +import static org.lflang.ast.ASTUtils.toDefinition; -import com.google.inject.Inject; import java.util.ArrayList; + import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.naming.SimpleNameProvider; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; + import org.lflang.lf.Assignment; import org.lflang.lf.Connection; import org.lflang.lf.Deadline; @@ -51,6 +58,8 @@ import org.lflang.lf.VarRef; import org.lflang.lf.Watchdog; +import com.google.inject.Inject; + /** * This class enforces custom rules. In particular, it resolves references to parameters, ports, * actions, and timers. Ports can be referenced across at most one level of hierarchy. Parameters, @@ -104,7 +113,9 @@ public IScope getScope(EObject context, EReference reference) { * statement. */ protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { - String importURI = ((Import) context.eContainer()).getImportURI(); + String importURI = ((Import) context.eContainer()).getImportURI() != null + ? ((Import) context.eContainer()).getImportURI() + : ((Import) context.eContainer()).getImportPackage().replace("<", "").replace(">", ""); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { From e6f4cbc73d16111feaf1b4ab8e142e567f3b5380 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Mon, 9 Sep 2024 11:46:58 -0700 Subject: [PATCH 03/33] Update core/src/main/java/org/lflang/ast/ToSExpr.java --- core/src/main/java/org/lflang/ast/ToSExpr.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index dd013dd9fa..1a2196d333 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,6 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - // TODO: Check if angular brackets (< >) are required new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } From c25b2f3d7ed5cdc40cb924f0ad73a33de9fb819e Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 10 Sep 2024 13:50:23 -0700 Subject: [PATCH 04/33] Fix bug in ToLf.java; Added test for new import statement --- core/src/main/java/org/lflang/ast/ToLf.java | 6 ++---- test/Python/src/ImportLibrary.lf | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 test/Python/src/ImportLibrary.lf diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index dda8524aa7..8304cf143a 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -397,10 +397,8 @@ public MalleableString caseImport(Import object) { .append("import ") // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) - .append(" from \"") - // TODO: Check if angular brackets (< >) are required - .append(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()) - .append("\"") + .append(" from ") + .append(object.getImportURI() != null ? "\"" + object.getImportURI() + "\"" : object.getImportPackage()) .get(); } diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf new file mode 100644 index 0000000000..ddb3d5348c --- /dev/null +++ b/test/Python/src/ImportLibrary.lf @@ -0,0 +1,17 @@ +target Python + +import Count from + +reactor Printer { + input i + + reaction(i) {= + print(f"Count: {i.value}") + =} +} + +main reactor { + c = new Count() + p = new Printer() + c.out -> p.i +} From 65762673c550b6ba788f5cff8c3f2bd3976a3825 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 10 Sep 2024 16:30:52 -0700 Subject: [PATCH 05/33] Fix bug in the LinguaFranca.text file --- core/src/main/java/org/lflang/LinguaFranca.xtext | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index 19acb14b47..978337f4c3 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -431,7 +431,7 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; -terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '>'; +terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '<' | '>' | '\t' | '\r' | '\n') )* '>'; terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; From 781a55221ed8ab6af518cd06dcedeab2e0fa2206 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 10 Sep 2024 17:04:30 -0700 Subject: [PATCH 06/33] Extend support for new import statements in federated LF programs; Add test case for federated LF program using new imports --- .../federated/generator/FedImportEmitter.java | 16 +++++++++++++--- test/Python/src/FederatedImportLibrary.lf | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/Python/src/FederatedImportLibrary.lf diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 59b2fae58b..72e49c09b9 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -4,7 +4,9 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; + import org.eclipse.emf.ecore.util.EcoreUtil; + import org.lflang.ast.FormattingUtil; import org.lflang.generator.CodeBuilder; import org.lflang.lf.Import; @@ -31,9 +33,17 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi .forEach( i -> { visitedImports.add(i); - Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); - i.setImportURI( - fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + if(i.getImportURI() != null) { + Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); + i.setImportURI( + fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + } + else { + Path importPath = fileConfig.srcPath.resolve(i.getImportPackage().replace("<", "").replace(">", "")).toAbsolutePath(); + i.setImportPackage( + "<" + fileConfig.getSrcPath().relativize(importPath).toString() + ">"); + } + }); var importStatements = new CodeBuilder(); diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf new file mode 100644 index 0000000000..88c19dc8d3 --- /dev/null +++ b/test/Python/src/FederatedImportLibrary.lf @@ -0,0 +1,17 @@ +target Python + +import Count from + +reactor Printer { + input i + + reaction(i) {= + print(f"Count: {i.value}") + =} +} + +federated reactor { + c = new Count() + p = new Printer() + c.out -> p.i +} From d8c0ac6fcd0143a46fa2aaf3fbecdf59dbe6527c Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Wed, 11 Sep 2024 16:42:42 -0700 Subject: [PATCH 07/33] Add the new terminal LIB_PATH to Token --- core/src/main/java/org/lflang/LinguaFranca.xtext | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index 978337f4c3..709e475baf 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -393,7 +393,7 @@ SignedInt: ; Literal: - STRING | CHAR_LIT | SignedFloat | SignedInt | Boolean + STRING | CHAR_LIT |SignedFloat | SignedInt | Boolean ; Boolean: @@ -516,7 +516,7 @@ Body: // the end of a target-code segment. Token: // Non-constant terminals - ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | + ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | LIB_PATH | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | // Keywords 'target' | 'import' | 'main' | 'realtime' | 'reactor' | 'state' | 'time' | 'mutable' | 'input' | 'output' | 'timer' | 'action' | 'reaction' | From 88070a226fd1f636fc60af016aaf95d782c203ce Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Wed, 11 Sep 2024 16:44:42 -0700 Subject: [PATCH 08/33] Add the new terminal LIB_PATH to Token --- core/src/main/java/org/lflang/LinguaFranca.xtext | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index 709e475baf..af66d4e467 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -393,7 +393,7 @@ SignedInt: ; Literal: - STRING | CHAR_LIT |SignedFloat | SignedInt | Boolean + STRING | CHAR_LIT | SignedFloat | SignedInt | Boolean ; Boolean: From 6dafb858fe35a719be98b8407739d645c736dd4a Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Mon, 16 Sep 2024 10:59:43 -0700 Subject: [PATCH 09/33] Resolved conflict in LunguaFranca.xtext by removing the LIB_PATH terminal; Refined importPackage management across affected files --- core/src/main/java/org/lflang/LinguaFranca.xtext | 6 ++---- .../org/lflang/federated/generator/FedImportEmitter.java | 2 +- .../main/java/org/lflang/scoping/LFScopeProviderImpl.java | 2 +- test/Python/src/FederatedImportLibrary.lf | 1 + test/Python/src/ImportLibrary.lf | 1 + 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index af66d4e467..b34c5be13d 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -64,7 +64,7 @@ Model: /** * Import declaration. */ -Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | importPackage=LIB_PATH) ';'?; +Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | '<' importPackage=Path '>') ';'?; ReactorDecl: Reactor | ImportedReactor; @@ -431,8 +431,6 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; -terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '<' | '>' | '\t' | '\r' | '\n') )* '>'; - terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; terminal ANY_OTHER: .; @@ -516,7 +514,7 @@ Body: // the end of a target-code segment. Token: // Non-constant terminals - ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | LIB_PATH | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | + ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | // Keywords 'target' | 'import' | 'main' | 'realtime' | 'reactor' | 'state' | 'time' | 'mutable' | 'input' | 'output' | 'timer' | 'action' | 'reaction' | diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 72e49c09b9..f3ac953e73 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -39,7 +39,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); } else { - Path importPath = fileConfig.srcPath.resolve(i.getImportPackage().replace("<", "").replace(">", "")).toAbsolutePath(); + Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); i.setImportPackage( "<" + fileConfig.getSrcPath().relativize(importPath).toString() + ">"); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 7f55a01ef5..f39b64146b 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -115,7 +115,7 @@ public IScope getScope(EObject context, EReference reference) { protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { String importURI = ((Import) context.eContainer()).getImportURI() != null ? ((Import) context.eContainer()).getImportURI() - : ((Import) context.eContainer()).getImportPackage().replace("<", "").replace(">", ""); + : ((Import) context.eContainer()).getImportPackage(); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf index 88c19dc8d3..c5ac273da4 100644 --- a/test/Python/src/FederatedImportLibrary.lf +++ b/test/Python/src/FederatedImportLibrary.lf @@ -1,3 +1,4 @@ +# Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs target Python import Count from diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf index ddb3d5348c..5c98680ddb 100644 --- a/test/Python/src/ImportLibrary.lf +++ b/test/Python/src/ImportLibrary.lf @@ -1,3 +1,4 @@ +# Test the new import statement with the import path enclosed in angle brackets target Python import Count from From 5c8dd4edaa2cf4777bb0539139c01020d9315075 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Mon, 16 Sep 2024 14:56:01 -0700 Subject: [PATCH 10/33] Corrected formatting and updated import statements for generated files in federated LF programs --- core/src/main/java/org/lflang/ast/ToLf.java | 5 ++++- .../src/main/java/org/lflang/ast/ToSExpr.java | 3 ++- .../federated/generator/FedImportEmitter.java | 20 ++++++++----------- .../lflang/scoping/LFScopeProviderImpl.java | 7 ++++--- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 8304cf143a..da23c44560 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -398,7 +398,10 @@ public MalleableString caseImport(Import object) { // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) .append(" from ") - .append(object.getImportURI() != null ? "\"" + object.getImportURI() + "\"" : object.getImportPackage()) + .append( + object.getImportURI() != null + ? "\"" + object.getImportURI() + "\"" + : object.getImportPackage()) .get(); } diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index 1a2196d333..a2047f5280 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,8 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), + new SAtom<>( + object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index f3ac953e73..2f0fbd3c43 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -4,9 +4,7 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; - import org.eclipse.emf.ecore.util.EcoreUtil; - import org.lflang.ast.FormattingUtil; import org.lflang.generator.CodeBuilder; import org.lflang.lf.Import; @@ -33,17 +31,15 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi .forEach( i -> { visitedImports.add(i); - if(i.getImportURI() != null) { - Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); - i.setImportURI( - fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + if (i.getImportURI() != null) { + Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); + i.setImportURI( + fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + } else { + Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); + i.setImportPackage( + "\"" + fileConfig.getSrcPath().relativize(importPath).toString() + "\""); } - else { - Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); - i.setImportPackage( - "<" + fileConfig.getSrcPath().relativize(importPath).toString() + ">"); - } - }); var importStatements = new CodeBuilder(); diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index f39b64146b..3f9032dc8d 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -113,9 +113,10 @@ public IScope getScope(EObject context, EReference reference) { * statement. */ protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { - String importURI = ((Import) context.eContainer()).getImportURI() != null - ? ((Import) context.eContainer()).getImportURI() - : ((Import) context.eContainer()).getImportPackage(); + String importURI = + ((Import) context.eContainer()).getImportURI() != null + ? ((Import) context.eContainer()).getImportURI() + : ((Import) context.eContainer()).getImportPackage(); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { From e3ce6cf854bc6fb0ed0d53b24ddff25658825473 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 18:13:19 -0700 Subject: [PATCH 11/33] Solved formatting error --- core/src/main/java/org/lflang/ast/ToLf.java | 2 +- .../main/java/org/lflang/scoping/LFScopeProviderImpl.java | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index da23c44560..5f32920d9b 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -401,7 +401,7 @@ public MalleableString caseImport(Import object) { .append( object.getImportURI() != null ? "\"" + object.getImportURI() + "\"" - : object.getImportPackage()) + : "<" + object.getImportPackage() + ">") .get(); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 3f9032dc8d..87650dd212 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -34,15 +34,14 @@ import static org.lflang.ast.ASTUtils.allWatchdogs; import static org.lflang.ast.ASTUtils.toDefinition; +import com.google.inject.Inject; import java.util.ArrayList; - import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.naming.SimpleNameProvider; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; - import org.lflang.lf.Assignment; import org.lflang.lf.Connection; import org.lflang.lf.Deadline; @@ -58,8 +57,6 @@ import org.lflang.lf.VarRef; import org.lflang.lf.Watchdog; -import com.google.inject.Inject; - /** * This class enforces custom rules. In particular, it resolves references to parameters, ports, * actions, and timers. Ports can be referenced across at most one level of hierarchy. Parameters, From f05c567cf7ad9503c52d11af09520b5a6ccb367e Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 19:10:40 -0700 Subject: [PATCH 12/33] Removed quotes in setImportPackage --- .../java/org/lflang/federated/generator/FedImportEmitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 2f0fbd3c43..9022f6ae4e 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -38,7 +38,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi } else { Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); i.setImportPackage( - "\"" + fileConfig.getSrcPath().relativize(importPath).toString() + "\""); + fileConfig.getSrcPath().relativize(importPath).toString()); } }); From ab4391bbbfc1f611713d3bc60feb23593260932a Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 19:28:52 -0700 Subject: [PATCH 13/33] Fix format --- .../java/org/lflang/federated/generator/FedImportEmitter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 9022f6ae4e..e4cc0f276d 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -37,8 +37,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); } else { Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); - i.setImportPackage( - fileConfig.getSrcPath().relativize(importPath).toString()); + i.setImportPackage(fileConfig.getSrcPath().relativize(importPath).toString()); } }); From c36bf05c5d02c76f0784f1f2530ea829dc27748a Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 20:11:51 -0700 Subject: [PATCH 14/33] Enhanced tests for new import statement --- test/Python/src/FederatedImportLibrary.lf | 4 +++- test/Python/src/ImportLibrary.lf | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf index c5ac273da4..a7aefe1f47 100644 --- a/test/Python/src/FederatedImportLibrary.lf +++ b/test/Python/src/FederatedImportLibrary.lf @@ -1,5 +1,7 @@ # Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs -target Python +target Python { + timeout: 2 sec +} import Count from diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf index 5c98680ddb..5f98f750b4 100644 --- a/test/Python/src/ImportLibrary.lf +++ b/test/Python/src/ImportLibrary.lf @@ -1,5 +1,7 @@ # Test the new import statement with the import path enclosed in angle brackets -target Python +target Python { + timeout: 2 sec +} import Count from From 3da89fc8f3ff941a04a9ff4d9abdc369cab49444 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 20:21:22 -0700 Subject: [PATCH 15/33] Enhanced tests for new import statement; Fix formatting --- test/Python/src/FederatedImportLibrary.lf | 2 +- test/Python/src/ImportLibrary.lf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf index a7aefe1f47..17d500aa93 100644 --- a/test/Python/src/FederatedImportLibrary.lf +++ b/test/Python/src/FederatedImportLibrary.lf @@ -1,6 +1,6 @@ # Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs target Python { - timeout: 2 sec + timeout: 2 sec } import Count from diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf index 5f98f750b4..962a616a6b 100644 --- a/test/Python/src/ImportLibrary.lf +++ b/test/Python/src/ImportLibrary.lf @@ -1,6 +1,6 @@ # Test the new import statement with the import path enclosed in angle brackets target Python { - timeout: 2 sec + timeout: 2 sec } import Count from From 9af3158f6186b841c6def36305b2da9bb714f0c0 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Sun, 8 Sep 2024 19:05:46 -0700 Subject: [PATCH 16/33] Added angular bracket import for reusable reactors module --- .../src/main/java/org/lflang/LinguaFranca.xtext | 4 +++- core/src/main/java/org/lflang/ast/IsEqual.java | 1 + core/src/main/java/org/lflang/ast/ToLf.java | 3 ++- core/src/main/java/org/lflang/ast/ToSExpr.java | 3 ++- .../org/lflang/scoping/LFScopeProviderImpl.java | 17 ++++++++++++++--- 5 files changed, 22 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index ba45b3bd0c..19acb14b47 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -64,7 +64,7 @@ Model: /** * Import declaration. */ -Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; +Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | importPackage=LIB_PATH) ';'?; ReactorDecl: Reactor | ImportedReactor; @@ -431,6 +431,8 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; +terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '>'; + terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; terminal ANY_OTHER: .; diff --git a/core/src/main/java/org/lflang/ast/IsEqual.java b/core/src/main/java/org/lflang/ast/IsEqual.java index 8eec27a430..afe1568f96 100644 --- a/core/src/main/java/org/lflang/ast/IsEqual.java +++ b/core/src/main/java/org/lflang/ast/IsEqual.java @@ -99,6 +99,7 @@ public Boolean caseModel(Model object) { public Boolean caseImport(Import object) { return new ComparisonMachine<>(object, Import.class) .equalAsObjects(Import::getImportURI) + .equalAsObjects(Import::getImportPackage) .listsEquivalent(Import::getReactorClasses) .conclusion; } diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 3b1b1e48df..dda8524aa7 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -398,7 +398,8 @@ public MalleableString caseImport(Import object) { // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) .append(" from \"") - .append(object.getImportURI()) + // TODO: Check if angular brackets (< >) are required + .append(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()) .append("\"") .get(); } diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index a514d98234..dd013dd9fa 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,8 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - new SAtom<>(object.getImportURI()), + // TODO: Check if angular brackets (< >) are required + new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 3455c1d822..7f55a01ef5 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -26,16 +26,23 @@ package org.lflang.scoping; import static java.util.Collections.emptyList; -import static org.lflang.ast.ASTUtils.*; +import static org.lflang.ast.ASTUtils.allActions; +import static org.lflang.ast.ASTUtils.allInputs; +import static org.lflang.ast.ASTUtils.allOutputs; +import static org.lflang.ast.ASTUtils.allParameters; +import static org.lflang.ast.ASTUtils.allTimers; +import static org.lflang.ast.ASTUtils.allWatchdogs; +import static org.lflang.ast.ASTUtils.toDefinition; -import com.google.inject.Inject; import java.util.ArrayList; + import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.naming.SimpleNameProvider; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; + import org.lflang.lf.Assignment; import org.lflang.lf.Connection; import org.lflang.lf.Deadline; @@ -51,6 +58,8 @@ import org.lflang.lf.VarRef; import org.lflang.lf.Watchdog; +import com.google.inject.Inject; + /** * This class enforces custom rules. In particular, it resolves references to parameters, ports, * actions, and timers. Ports can be referenced across at most one level of hierarchy. Parameters, @@ -104,7 +113,9 @@ public IScope getScope(EObject context, EReference reference) { * statement. */ protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { - String importURI = ((Import) context.eContainer()).getImportURI(); + String importURI = ((Import) context.eContainer()).getImportURI() != null + ? ((Import) context.eContainer()).getImportURI() + : ((Import) context.eContainer()).getImportPackage().replace("<", "").replace(">", ""); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { From 5ec94228c474c8f0f5c2b8ec53025a03cde10ed0 Mon Sep 17 00:00:00 2001 From: Marten Lohstroh Date: Mon, 9 Sep 2024 11:46:58 -0700 Subject: [PATCH 17/33] Update core/src/main/java/org/lflang/ast/ToSExpr.java --- core/src/main/java/org/lflang/ast/ToSExpr.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index dd013dd9fa..1a2196d333 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,6 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - // TODO: Check if angular brackets (< >) are required new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } From 95366ab484bc4333c997fe5a4d2f7f98d1fb4797 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 10 Sep 2024 13:50:23 -0700 Subject: [PATCH 18/33] Fix bug in ToLf.java; Added test for new import statement --- core/src/main/java/org/lflang/ast/ToLf.java | 6 ++---- test/Python/src/ImportLibrary.lf | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 test/Python/src/ImportLibrary.lf diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index dda8524aa7..8304cf143a 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -397,10 +397,8 @@ public MalleableString caseImport(Import object) { .append("import ") // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) - .append(" from \"") - // TODO: Check if angular brackets (< >) are required - .append(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()) - .append("\"") + .append(" from ") + .append(object.getImportURI() != null ? "\"" + object.getImportURI() + "\"" : object.getImportPackage()) .get(); } diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf new file mode 100644 index 0000000000..ddb3d5348c --- /dev/null +++ b/test/Python/src/ImportLibrary.lf @@ -0,0 +1,17 @@ +target Python + +import Count from + +reactor Printer { + input i + + reaction(i) {= + print(f"Count: {i.value}") + =} +} + +main reactor { + c = new Count() + p = new Printer() + c.out -> p.i +} From aab992df10497d9cce7e40bd358cb6e06fcfc5a6 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 10 Sep 2024 16:30:52 -0700 Subject: [PATCH 19/33] Fix bug in the LinguaFranca.text file --- core/src/main/java/org/lflang/LinguaFranca.xtext | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index 19acb14b47..978337f4c3 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -431,7 +431,7 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; -terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '>'; +terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '<' | '>' | '\t' | '\r' | '\n') )* '>'; terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; From fabf6b559e59cb45047e480f80454ff5e121a615 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 10 Sep 2024 17:04:30 -0700 Subject: [PATCH 20/33] Extend support for new import statements in federated LF programs; Add test case for federated LF program using new imports --- .../federated/generator/FedImportEmitter.java | 16 +++++++++++++--- test/Python/src/FederatedImportLibrary.lf | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 3 deletions(-) create mode 100644 test/Python/src/FederatedImportLibrary.lf diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 59b2fae58b..72e49c09b9 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -4,7 +4,9 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; + import org.eclipse.emf.ecore.util.EcoreUtil; + import org.lflang.ast.FormattingUtil; import org.lflang.generator.CodeBuilder; import org.lflang.lf.Import; @@ -31,9 +33,17 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi .forEach( i -> { visitedImports.add(i); - Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); - i.setImportURI( - fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + if(i.getImportURI() != null) { + Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); + i.setImportURI( + fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + } + else { + Path importPath = fileConfig.srcPath.resolve(i.getImportPackage().replace("<", "").replace(">", "")).toAbsolutePath(); + i.setImportPackage( + "<" + fileConfig.getSrcPath().relativize(importPath).toString() + ">"); + } + }); var importStatements = new CodeBuilder(); diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf new file mode 100644 index 0000000000..88c19dc8d3 --- /dev/null +++ b/test/Python/src/FederatedImportLibrary.lf @@ -0,0 +1,17 @@ +target Python + +import Count from + +reactor Printer { + input i + + reaction(i) {= + print(f"Count: {i.value}") + =} +} + +federated reactor { + c = new Count() + p = new Printer() + c.out -> p.i +} From 031ac4e9c02e994996ea06dbb4f9ae2d804cb736 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Wed, 11 Sep 2024 16:42:42 -0700 Subject: [PATCH 21/33] Add the new terminal LIB_PATH to Token --- core/src/main/java/org/lflang/LinguaFranca.xtext | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index 978337f4c3..709e475baf 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -393,7 +393,7 @@ SignedInt: ; Literal: - STRING | CHAR_LIT | SignedFloat | SignedInt | Boolean + STRING | CHAR_LIT |SignedFloat | SignedInt | Boolean ; Boolean: @@ -516,7 +516,7 @@ Body: // the end of a target-code segment. Token: // Non-constant terminals - ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | + ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | LIB_PATH | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | // Keywords 'target' | 'import' | 'main' | 'realtime' | 'reactor' | 'state' | 'time' | 'mutable' | 'input' | 'output' | 'timer' | 'action' | 'reaction' | From 82ccc7f21d22218e5a92e3e36deb8f51dafe2037 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Wed, 11 Sep 2024 16:44:42 -0700 Subject: [PATCH 22/33] Add the new terminal LIB_PATH to Token --- core/src/main/java/org/lflang/LinguaFranca.xtext | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index 709e475baf..af66d4e467 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -393,7 +393,7 @@ SignedInt: ; Literal: - STRING | CHAR_LIT |SignedFloat | SignedInt | Boolean + STRING | CHAR_LIT | SignedFloat | SignedInt | Boolean ; Boolean: From 5ac1d15f752f2a43d47ede59759743c799d55795 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Mon, 16 Sep 2024 10:59:43 -0700 Subject: [PATCH 23/33] Resolved conflict in LunguaFranca.xtext by removing the LIB_PATH terminal; Refined importPackage management across affected files --- core/src/main/java/org/lflang/LinguaFranca.xtext | 6 ++---- .../org/lflang/federated/generator/FedImportEmitter.java | 2 +- .../main/java/org/lflang/scoping/LFScopeProviderImpl.java | 2 +- test/Python/src/FederatedImportLibrary.lf | 1 + test/Python/src/ImportLibrary.lf | 1 + 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index af66d4e467..b34c5be13d 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -64,7 +64,7 @@ Model: /** * Import declaration. */ -Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | importPackage=LIB_PATH) ';'?; +Import: 'import' reactorClasses+=ImportedReactor (',' reactorClasses+=ImportedReactor)* 'from' (importURI=STRING | '<' importPackage=Path '>') ';'?; ReactorDecl: Reactor | ImportedReactor; @@ -431,8 +431,6 @@ terminal STRING: '"' ( '\\' . | !('\\' | '"' | '\t' | '\r' | '\n') )* '"' | '"""' -> '"""' ; -terminal LIB_PATH: '<' ( '\\' . | !('\\' | '"' | '<' | '>' | '\t' | '\r' | '\n') )* '>'; - terminal CHAR_LIT: "'" ( '\\' . | !('\\' | "'" | '\t' | '\r' | '\n') ) "'"; terminal ANY_OTHER: .; @@ -516,7 +514,7 @@ Body: // the end of a target-code segment. Token: // Non-constant terminals - ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | LIB_PATH | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | + ID | INT | FLOAT_EXP_SUFFIX | LT_ANNOT | CPP_RAW_STR | STRING | CHAR_LIT | ML_COMMENT | SL_COMMENT | WS | ANY_OTHER | // Keywords 'target' | 'import' | 'main' | 'realtime' | 'reactor' | 'state' | 'time' | 'mutable' | 'input' | 'output' | 'timer' | 'action' | 'reaction' | diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 72e49c09b9..f3ac953e73 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -39,7 +39,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); } else { - Path importPath = fileConfig.srcPath.resolve(i.getImportPackage().replace("<", "").replace(">", "")).toAbsolutePath(); + Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); i.setImportPackage( "<" + fileConfig.getSrcPath().relativize(importPath).toString() + ">"); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 7f55a01ef5..f39b64146b 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -115,7 +115,7 @@ public IScope getScope(EObject context, EReference reference) { protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { String importURI = ((Import) context.eContainer()).getImportURI() != null ? ((Import) context.eContainer()).getImportURI() - : ((Import) context.eContainer()).getImportPackage().replace("<", "").replace(">", ""); + : ((Import) context.eContainer()).getImportPackage(); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf index 88c19dc8d3..c5ac273da4 100644 --- a/test/Python/src/FederatedImportLibrary.lf +++ b/test/Python/src/FederatedImportLibrary.lf @@ -1,3 +1,4 @@ +# Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs target Python import Count from diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf index ddb3d5348c..5c98680ddb 100644 --- a/test/Python/src/ImportLibrary.lf +++ b/test/Python/src/ImportLibrary.lf @@ -1,3 +1,4 @@ +# Test the new import statement with the import path enclosed in angle brackets target Python import Count from From 52cfaf6c406a1d7d988f23f1dfa1c08120dff7bc Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Mon, 16 Sep 2024 14:56:01 -0700 Subject: [PATCH 24/33] Corrected formatting and updated import statements for generated files in federated LF programs --- core/src/main/java/org/lflang/ast/ToLf.java | 5 ++++- .../src/main/java/org/lflang/ast/ToSExpr.java | 3 ++- .../federated/generator/FedImportEmitter.java | 20 ++++++++----------- .../lflang/scoping/LFScopeProviderImpl.java | 7 ++++--- 4 files changed, 18 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index 8304cf143a..da23c44560 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -398,7 +398,10 @@ public MalleableString caseImport(Import object) { // TODO: This is a place where we can use conditional parentheses. .append(list(", ", "", "", false, true, true, object.getReactorClasses())) .append(" from ") - .append(object.getImportURI() != null ? "\"" + object.getImportURI() + "\"" : object.getImportPackage()) + .append( + object.getImportURI() != null + ? "\"" + object.getImportURI() + "\"" + : object.getImportPackage()) .get(); } diff --git a/core/src/main/java/org/lflang/ast/ToSExpr.java b/core/src/main/java/org/lflang/ast/ToSExpr.java index 1a2196d333..a2047f5280 100644 --- a/core/src/main/java/org/lflang/ast/ToSExpr.java +++ b/core/src/main/java/org/lflang/ast/ToSExpr.java @@ -217,7 +217,8 @@ public SExpr caseImport(Import object) { // reactorClasses+=ImportedReactor)* 'from' importURI=STRING ';'?; return sList( "import", - new SAtom<>(object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), + new SAtom<>( + object.getImportURI() != null ? object.getImportURI() : object.getImportPackage()), sList("reactors", object.getReactorClasses())); } diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index f3ac953e73..2f0fbd3c43 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -4,9 +4,7 @@ import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; - import org.eclipse.emf.ecore.util.EcoreUtil; - import org.lflang.ast.FormattingUtil; import org.lflang.generator.CodeBuilder; import org.lflang.lf.Import; @@ -33,17 +31,15 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi .forEach( i -> { visitedImports.add(i); - if(i.getImportURI() != null) { - Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); - i.setImportURI( - fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + if (i.getImportURI() != null) { + Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); + i.setImportURI( + fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); + } else { + Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); + i.setImportPackage( + "\"" + fileConfig.getSrcPath().relativize(importPath).toString() + "\""); } - else { - Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); - i.setImportPackage( - "<" + fileConfig.getSrcPath().relativize(importPath).toString() + ">"); - } - }); var importStatements = new CodeBuilder(); diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index f39b64146b..3f9032dc8d 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -113,9 +113,10 @@ public IScope getScope(EObject context, EReference reference) { * statement. */ protected IScope getScopeForImportedReactor(ImportedReactor context, EReference reference) { - String importURI = ((Import) context.eContainer()).getImportURI() != null - ? ((Import) context.eContainer()).getImportURI() - : ((Import) context.eContainer()).getImportPackage(); + String importURI = + ((Import) context.eContainer()).getImportURI() != null + ? ((Import) context.eContainer()).getImportURI() + : ((Import) context.eContainer()).getImportPackage(); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { From fe878a5672e5d3c9a1c183edc6823db6397790e2 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 18:13:19 -0700 Subject: [PATCH 25/33] Solved formatting error --- core/src/main/java/org/lflang/ast/ToLf.java | 2 +- .../main/java/org/lflang/scoping/LFScopeProviderImpl.java | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/lflang/ast/ToLf.java b/core/src/main/java/org/lflang/ast/ToLf.java index da23c44560..5f32920d9b 100644 --- a/core/src/main/java/org/lflang/ast/ToLf.java +++ b/core/src/main/java/org/lflang/ast/ToLf.java @@ -401,7 +401,7 @@ public MalleableString caseImport(Import object) { .append( object.getImportURI() != null ? "\"" + object.getImportURI() + "\"" - : object.getImportPackage()) + : "<" + object.getImportPackage() + ">") .get(); } diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 3f9032dc8d..87650dd212 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -34,15 +34,14 @@ import static org.lflang.ast.ASTUtils.allWatchdogs; import static org.lflang.ast.ASTUtils.toDefinition; +import com.google.inject.Inject; import java.util.ArrayList; - import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.xtext.naming.SimpleNameProvider; import org.eclipse.xtext.scoping.IScope; import org.eclipse.xtext.scoping.Scopes; import org.eclipse.xtext.scoping.impl.SelectableBasedScope; - import org.lflang.lf.Assignment; import org.lflang.lf.Connection; import org.lflang.lf.Deadline; @@ -58,8 +57,6 @@ import org.lflang.lf.VarRef; import org.lflang.lf.Watchdog; -import com.google.inject.Inject; - /** * This class enforces custom rules. In particular, it resolves references to parameters, ports, * actions, and timers. Ports can be referenced across at most one level of hierarchy. Parameters, From 3dadae8ce1fe5b54884dfc35e9b0eca18548a345 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 19:10:40 -0700 Subject: [PATCH 26/33] Removed quotes in setImportPackage --- .../java/org/lflang/federated/generator/FedImportEmitter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 2f0fbd3c43..9022f6ae4e 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -38,7 +38,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi } else { Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); i.setImportPackage( - "\"" + fileConfig.getSrcPath().relativize(importPath).toString() + "\""); + fileConfig.getSrcPath().relativize(importPath).toString()); } }); From 63457326a1c55a7280d75b170d4a4ef1c3080e31 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 19:28:52 -0700 Subject: [PATCH 27/33] Fix format --- .../java/org/lflang/federated/generator/FedImportEmitter.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 9022f6ae4e..e4cc0f276d 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -37,8 +37,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); } else { Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); - i.setImportPackage( - fileConfig.getSrcPath().relativize(importPath).toString()); + i.setImportPackage(fileConfig.getSrcPath().relativize(importPath).toString()); } }); From feee84be5d2ac4cf40e59bc33c2408a520f096c5 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 20:11:51 -0700 Subject: [PATCH 28/33] Enhanced tests for new import statement --- test/Python/src/FederatedImportLibrary.lf | 4 +++- test/Python/src/ImportLibrary.lf | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf index c5ac273da4..a7aefe1f47 100644 --- a/test/Python/src/FederatedImportLibrary.lf +++ b/test/Python/src/FederatedImportLibrary.lf @@ -1,5 +1,7 @@ # Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs -target Python +target Python { + timeout: 2 sec +} import Count from diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf index 5c98680ddb..5f98f750b4 100644 --- a/test/Python/src/ImportLibrary.lf +++ b/test/Python/src/ImportLibrary.lf @@ -1,5 +1,7 @@ # Test the new import statement with the import path enclosed in angle brackets -target Python +target Python { + timeout: 2 sec +} import Count from From 338726ebaba87468530fa5a089e54e27bfb0064d Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 17 Sep 2024 20:21:22 -0700 Subject: [PATCH 29/33] Enhanced tests for new import statement; Fix formatting --- test/Python/src/FederatedImportLibrary.lf | 2 +- test/Python/src/ImportLibrary.lf | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf index a7aefe1f47..17d500aa93 100644 --- a/test/Python/src/FederatedImportLibrary.lf +++ b/test/Python/src/FederatedImportLibrary.lf @@ -1,6 +1,6 @@ # Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs target Python { - timeout: 2 sec + timeout: 2 sec } import Count from diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf index 5f98f750b4..962a616a6b 100644 --- a/test/Python/src/ImportLibrary.lf +++ b/test/Python/src/ImportLibrary.lf @@ -1,6 +1,6 @@ # Test the new import statement with the import path enclosed in angle brackets target Python { - timeout: 2 sec + timeout: 2 sec } import Count from From 67be8686f684c1c6c0bbfcdb36ba5c34e72b10a1 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 24 Sep 2024 15:26:16 -0700 Subject: [PATCH 30/33] =?UTF-8?q?Added=20full=20support=20for=20the=20new?= =?UTF-8?q?=20import=20statement=20structure=20for=20Lingo=20libraries=20(?= =?UTF-8?q?=E2=80=98=E2=80=99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lflang/LFResourceDescriptionStrategy.java | 13 ++- .../main/java/org/lflang/LinguaFranca.xtext | 2 +- .../federated/generator/FedImportEmitter.java | 20 ++-- .../lflang/scoping/LFGlobalScopeProvider.java | 2 +- .../lflang/scoping/LFScopeProviderImpl.java | 4 +- .../main/java/org/lflang/util/ImportUtil.java | 99 +++++++++++++++++++ test/Python/src/FederatedImportLibrary.lf | 20 ---- test/Python/src/ImportLibrary.lf | 20 ---- .../FederatedTestImportPackages.lf | 20 ++++ .../src/lingo_imports/TestImportPackages.lf | 20 ++++ .../library-test/src/lib/Import.lf | 12 +++ 11 files changed, 180 insertions(+), 52 deletions(-) create mode 100644 core/src/main/java/org/lflang/util/ImportUtil.java delete mode 100644 test/Python/src/FederatedImportLibrary.lf delete mode 100644 test/Python/src/ImportLibrary.lf create mode 100644 test/Python/src/lingo_imports/FederatedTestImportPackages.lf create mode 100644 test/Python/src/lingo_imports/TestImportPackages.lf create mode 100644 test/Python/target/lfc_include/library-test/src/lib/Import.lf diff --git a/core/src/main/java/org/lflang/LFResourceDescriptionStrategy.java b/core/src/main/java/org/lflang/LFResourceDescriptionStrategy.java index 487e63374b..db055a7df8 100644 --- a/core/src/main/java/org/lflang/LFResourceDescriptionStrategy.java +++ b/core/src/main/java/org/lflang/LFResourceDescriptionStrategy.java @@ -35,6 +35,7 @@ import org.eclipse.xtext.scoping.impl.ImportUriResolver; import org.eclipse.xtext.util.IAcceptor; import org.lflang.lf.Model; +import org.lflang.util.ImportUtil; /** * Resource description strategy designed to limit global scope to only those files that were @@ -77,7 +78,17 @@ public boolean createEObjectDescriptions( */ private void createEObjectDescriptionForModel( Model model, IAcceptor acceptor) { - var uris = model.getImports().stream().map(uriResolver).collect(Collectors.joining(DELIMITER)); + var uris = + model.getImports().stream() + .map( + importObj -> { + return (importObj.getImportURI() != null) + ? importObj.getImportURI() + : ImportUtil.buildPackageURI( + importObj.getImportPackage(), + model.eResource()); // Use the resolved import string + }) + .collect(Collectors.joining(DELIMITER)); var userData = Map.of(INCLUDES, uris); QualifiedName qname = QualifiedName.create(model.eResource().getURI().toString()); acceptor.accept(EObjectDescription.create(qname, model, userData)); diff --git a/core/src/main/java/org/lflang/LinguaFranca.xtext b/core/src/main/java/org/lflang/LinguaFranca.xtext index b34c5be13d..a52f9fec23 100644 --- a/core/src/main/java/org/lflang/LinguaFranca.xtext +++ b/core/src/main/java/org/lflang/LinguaFranca.xtext @@ -478,7 +478,7 @@ Code: ; FSName: - (ID | '.' | '_')+ + (ID | '.' | '_' | '-')+ ; // Absolute or relative directory path in Windows, Linux, or MacOS. Path: diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index e4cc0f276d..8ffe120af1 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -9,6 +9,7 @@ import org.lflang.generator.CodeBuilder; import org.lflang.lf.Import; import org.lflang.lf.Model; +import org.lflang.util.ImportUtil; /** * Helper class to generate import statements for a federate. @@ -31,14 +32,17 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi .forEach( i -> { visitedImports.add(i); - if (i.getImportURI() != null) { - Path importPath = fileConfig.srcPath.resolve(i.getImportURI()).toAbsolutePath(); - i.setImportURI( - fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); - } else { - Path importPath = fileConfig.srcPath.resolve(i.getImportPackage()).toAbsolutePath(); - i.setImportPackage(fileConfig.getSrcPath().relativize(importPath).toString()); - } + Path importPath = + fileConfig + .srcPath + .resolve( + i.getImportURI() != null + ? i.getImportURI() + : ImportUtil.buildPackageURIfromSrc( + i.getImportPackage(), fileConfig.srcPath.toString())) + .toAbsolutePath(); + i.setImportURI( + fileConfig.getSrcPath().relativize(importPath).toString().replace('\\', '/')); }); var importStatements = new CodeBuilder(); diff --git a/core/src/main/java/org/lflang/scoping/LFGlobalScopeProvider.java b/core/src/main/java/org/lflang/scoping/LFGlobalScopeProvider.java index 18c7a3a8af..6c58f67665 100644 --- a/core/src/main/java/org/lflang/scoping/LFGlobalScopeProvider.java +++ b/core/src/main/java/org/lflang/scoping/LFGlobalScopeProvider.java @@ -39,7 +39,7 @@ /** * Global scope provider that limits access to only those files that were explicitly imported. * - *

Adapted from from Xtext manual, Chapter 8.7. + *

Adapted from Xtext manual, Chapter 8.7. * * @author Marten Lohstroh * @see xtext diff --git a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java index 87650dd212..e45c25137c 100644 --- a/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java +++ b/core/src/main/java/org/lflang/scoping/LFScopeProviderImpl.java @@ -56,6 +56,7 @@ import org.lflang.lf.ReactorDecl; import org.lflang.lf.VarRef; import org.lflang.lf.Watchdog; +import org.lflang.util.ImportUtil; /** * This class enforces custom rules. In particular, it resolves references to parameters, ports, @@ -113,7 +114,8 @@ protected IScope getScopeForImportedReactor(ImportedReactor context, EReference String importURI = ((Import) context.eContainer()).getImportURI() != null ? ((Import) context.eContainer()).getImportURI() - : ((Import) context.eContainer()).getImportPackage(); + : ImportUtil.buildPackageURI( + ((Import) context.eContainer()).getImportPackage(), context.eResource()); var importedURI = scopeProvider.resolve(importURI == null ? "" : importURI, context.eResource()); if (importedURI != null) { diff --git a/core/src/main/java/org/lflang/util/ImportUtil.java b/core/src/main/java/org/lflang/util/ImportUtil.java new file mode 100644 index 0000000000..ef52e39e5f --- /dev/null +++ b/core/src/main/java/org/lflang/util/ImportUtil.java @@ -0,0 +1,99 @@ +package org.lflang.util; + +import java.nio.file.Path; +import java.nio.file.Paths; +import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.resource.Resource; + +/** + * Utility class for handling package-related URIs in the context of LF (Lingua Franca) libraries. + * This class provides methods to build URIs for accessing library files based on their location in + * a project structure, specifically targeting the "target/lfc_include" directory for library + * inclusion. + */ +public class ImportUtil { + + /** + * Builds a package URI based on the provided URI string and resource. It traverses upwards from + * the current resource URI until it finds the "src/" directory, then constructs the final URI + * pointing to the library file within the "target/lfc_include" directory. + * + * @param uriStr A string representing the URI of the file. It must contain both the library name + * and file name, separated by a '/'. + * @param resource The resource from which the URI resolution should start. + * @return The constructed package URI as a string. + * @throws IllegalArgumentException if the URI string does not contain both library and file + * names. + */ + public static String buildPackageURI(String uriStr, Resource resource) { + URI currentURI = URI.createURI("."); + URI rootURI = currentURI.resolve(resource.getURI()); + StringBuilder pathBuilder = new StringBuilder(); + + String[] uriParts = uriStr.split("/"); + + if (uriParts.length < 2) { + throw new IllegalArgumentException("URI must contain both library name and file name."); + } + + // Traverse upwards until we reach the "src/" directory + while (!rootURI.toString().endsWith("src/")) { + currentURI = URI.createURI(".."); + rootURI = currentURI.resolve(resource.getURI()); + pathBuilder.append("../"); + } + + pathBuilder + .append("../target/lfc_include/") + .append(uriParts[0]) + .append("/src/lib/") + .append(uriParts[1]); + + return pathBuilder.toString(); + } + + /** + * Builds a package URI based on the provided URI string and source path. This method works + * similarly to the `buildPackageURI`, but it accepts a direct source path instead of a resource. + * It traverses upwards to locate the "src/" directory and then constructs the URI pointing to the + * library file. + * + * @param uriStr A string representing the URI of the file. It must contain both the library name + * and file name, separated by a '/'. + * @param src The source path from which the URI resolution should start. + * @return The constructed package URI as a string. + * @throws IllegalArgumentException if the URI string or source path is null, empty, or does not + * contain both the library name and file name. + */ + public static String buildPackageURIfromSrc(String uriStr, String src) { + if (uriStr == null || src == null || uriStr.trim().isEmpty() || src.trim().isEmpty()) { + throw new IllegalArgumentException("URI string and source path must not be null or empty."); + } + + String[] uriParts = uriStr.trim().split("/"); + + if (uriParts.length < 2) { + throw new IllegalArgumentException("URI must contain both library name and file name."); + } + + // Use the src path to create a base path + Path rootPath = Paths.get(src).toAbsolutePath(); + + // Traverse upwards until we reach the "src/" directory + while (!rootPath.endsWith("src")) { + rootPath = rootPath.getParent(); + if (rootPath == null) { + throw new IllegalArgumentException("The 'src' directory was not found in the given path."); + } + } + + Path finalPath = + rootPath + .resolveSibling("target/lfc_include/") + .resolve(uriParts[0].trim()) // library name + .resolve("src/lib") + .resolve(uriParts[1].trim()); // file name + + return finalPath.toString(); + } +} diff --git a/test/Python/src/FederatedImportLibrary.lf b/test/Python/src/FederatedImportLibrary.lf deleted file mode 100644 index 17d500aa93..0000000000 --- a/test/Python/src/FederatedImportLibrary.lf +++ /dev/null @@ -1,20 +0,0 @@ -# Test the new import statement, with the import path enclosed in angle brackets, in federated LF programs -target Python { - timeout: 2 sec -} - -import Count from - -reactor Printer { - input i - - reaction(i) {= - print(f"Count: {i.value}") - =} -} - -federated reactor { - c = new Count() - p = new Printer() - c.out -> p.i -} diff --git a/test/Python/src/ImportLibrary.lf b/test/Python/src/ImportLibrary.lf deleted file mode 100644 index 962a616a6b..0000000000 --- a/test/Python/src/ImportLibrary.lf +++ /dev/null @@ -1,20 +0,0 @@ -# Test the new import statement with the import path enclosed in angle brackets -target Python { - timeout: 2 sec -} - -import Count from - -reactor Printer { - input i - - reaction(i) {= - print(f"Count: {i.value}") - =} -} - -main reactor { - c = new Count() - p = new Printer() - c.out -> p.i -} diff --git a/test/Python/src/lingo_imports/FederatedTestImportPackages.lf b/test/Python/src/lingo_imports/FederatedTestImportPackages.lf new file mode 100644 index 0000000000..6c642bae6f --- /dev/null +++ b/test/Python/src/lingo_imports/FederatedTestImportPackages.lf @@ -0,0 +1,20 @@ +# Test the new import statement for Lingo downloaded packages with the import path enclosed in angle brackets +target Python { + timeout: 2 sec +} + +import Count from + +reactor Actuator { + input results + + reaction(results) {= + print(f"Count: {results.value}") + =} +} + +federated reactor { + count = new Count() + act = new Actuator() + count.out -> act.results +} diff --git a/test/Python/src/lingo_imports/TestImportPackages.lf b/test/Python/src/lingo_imports/TestImportPackages.lf new file mode 100644 index 0000000000..fc0915f160 --- /dev/null +++ b/test/Python/src/lingo_imports/TestImportPackages.lf @@ -0,0 +1,20 @@ +# Test the new import statement for Lingo downloaded packages with the import path enclosed in angle brackets +target Python { + timeout: 2 sec +} + +import Count from + +reactor Actuator { + input results + + reaction(results) {= + print(f"Count: {results.value}") + =} +} + +main reactor { + count = new Count() + act = new Actuator() + count.out -> act.results +} diff --git a/test/Python/target/lfc_include/library-test/src/lib/Import.lf b/test/Python/target/lfc_include/library-test/src/lib/Import.lf new file mode 100644 index 0000000000..97ca1fb73f --- /dev/null +++ b/test/Python/target/lfc_include/library-test/src/lib/Import.lf @@ -0,0 +1,12 @@ +target Python + +reactor Count(offset=0, period = 1 sec) { + state count = 1 + output out + timer t(offset, period) + + reaction(t) -> out {= + out.set(self.count) + self.count += 1 + =} +} \ No newline at end of file From a32c7ed28ba9c3e7cc9373125c3aa224f82cfa01 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Sun, 29 Sep 2024 21:11:20 -0700 Subject: [PATCH 31/33] Enhance path handling in ImportUtil.java and add new test --- .../main/java/org/lflang/util/ImportUtil.java | 62 +++++++++++-------- test/Python/src/LingoFederatedImport.lf | 21 +++++++ .../FederatedTestImportPackages.lf | 1 + 3 files changed, 57 insertions(+), 27 deletions(-) create mode 100644 test/Python/src/LingoFederatedImport.lf diff --git a/core/src/main/java/org/lflang/util/ImportUtil.java b/core/src/main/java/org/lflang/util/ImportUtil.java index ef52e39e5f..2fdaf5e4f3 100644 --- a/core/src/main/java/org/lflang/util/ImportUtil.java +++ b/core/src/main/java/org/lflang/util/ImportUtil.java @@ -2,7 +2,6 @@ import java.nio.file.Path; import java.nio.file.Paths; -import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; /** @@ -15,7 +14,7 @@ public class ImportUtil { /** * Builds a package URI based on the provided URI string and resource. It traverses upwards from - * the current resource URI until it finds the "src/" directory, then constructs the final URI + * the current resource URI until it finds the "src" directory, then constructs the final URI * pointing to the library file within the "target/lfc_include" directory. * * @param uriStr A string representing the URI of the file. It must contain both the library name @@ -26,30 +25,37 @@ public class ImportUtil { * names. */ public static String buildPackageURI(String uriStr, Resource resource) { - URI currentURI = URI.createURI("."); - URI rootURI = currentURI.resolve(resource.getURI()); - StringBuilder pathBuilder = new StringBuilder(); + Path rootPath = Paths.get(resource.getURI().toString()).toAbsolutePath(); - String[] uriParts = uriStr.split("/"); + Path uriPath = Paths.get(uriStr.trim()); - if (uriParts.length < 2) { + if (uriPath.getNameCount() < 2) { throw new IllegalArgumentException("URI must contain both library name and file name."); } + // Initialize the path as the current directory + Path finalPath = Paths.get(""); + // Traverse upwards until we reach the "src/" directory - while (!rootURI.toString().endsWith("src/")) { - currentURI = URI.createURI(".."); - rootURI = currentURI.resolve(resource.getURI()); - pathBuilder.append("../"); + while (!rootPath.endsWith("src")) { + rootPath = rootPath.getParent(); + if (rootPath == null) { + throw new IllegalArgumentException("The 'src' directory was not found in the given path."); + } + finalPath = finalPath.resolve(".."); } - pathBuilder - .append("../target/lfc_include/") - .append(uriParts[0]) - .append("/src/lib/") - .append(uriParts[1]); + // Build the final path + finalPath = + finalPath + .resolve("target") + .resolve("lfc_include") + .resolve(uriPath.getName(0)) + .resolve("src") + .resolve("lib") + .resolve(uriPath.getName(1)); - return pathBuilder.toString(); + return finalPath.toString(); } /** @@ -60,24 +66,24 @@ public static String buildPackageURI(String uriStr, Resource resource) { * * @param uriStr A string representing the URI of the file. It must contain both the library name * and file name, separated by a '/'. - * @param src The source path from which the URI resolution should start. + * @param root The root path from which the URI resolution should start. * @return The constructed package URI as a string. * @throws IllegalArgumentException if the URI string or source path is null, empty, or does not * contain both the library name and file name. */ - public static String buildPackageURIfromSrc(String uriStr, String src) { - if (uriStr == null || src == null || uriStr.trim().isEmpty() || src.trim().isEmpty()) { + public static String buildPackageURIfromSrc(String uriStr, String root) { + if (uriStr == null || root == null || uriStr.trim().isEmpty() || root.trim().isEmpty()) { throw new IllegalArgumentException("URI string and source path must not be null or empty."); } - String[] uriParts = uriStr.trim().split("/"); + Path uriPath = Paths.get(uriStr.trim()); - if (uriParts.length < 2) { + if (uriPath.getNameCount() < 2) { throw new IllegalArgumentException("URI must contain both library name and file name."); } // Use the src path to create a base path - Path rootPath = Paths.get(src).toAbsolutePath(); + Path rootPath = Paths.get(root).toAbsolutePath(); // Traverse upwards until we reach the "src/" directory while (!rootPath.endsWith("src")) { @@ -89,10 +95,12 @@ public static String buildPackageURIfromSrc(String uriStr, String src) { Path finalPath = rootPath - .resolveSibling("target/lfc_include/") - .resolve(uriParts[0].trim()) // library name - .resolve("src/lib") - .resolve(uriParts[1].trim()); // file name + .resolveSibling("target") + .resolve("lfc_include") + .resolve(uriPath.getName(0)) // library name + .resolve("src") + .resolve("lib") + .resolve(uriPath.getName(1)); // file name return finalPath.toString(); } diff --git a/test/Python/src/LingoFederatedImport.lf b/test/Python/src/LingoFederatedImport.lf new file mode 100644 index 0000000000..5b3a4fadd6 --- /dev/null +++ b/test/Python/src/LingoFederatedImport.lf @@ -0,0 +1,21 @@ +# Test the new import statement for Lingo downloaded packages with the import path enclosed in angle brackets +# Version 1: The LF file is located in "src". +target Python { + timeout: 2 sec +} + +import Count from + +reactor Actuator { + input results + + reaction(results) {= + print(f"Count: {results.value}") + =} +} + +federated reactor { + count = new Count() + act = new Actuator() + count.out -> act.results +} diff --git a/test/Python/src/lingo_imports/FederatedTestImportPackages.lf b/test/Python/src/lingo_imports/FederatedTestImportPackages.lf index 6c642bae6f..4081aa29ba 100644 --- a/test/Python/src/lingo_imports/FederatedTestImportPackages.lf +++ b/test/Python/src/lingo_imports/FederatedTestImportPackages.lf @@ -1,4 +1,5 @@ # Test the new import statement for Lingo downloaded packages with the import path enclosed in angle brackets +# Version 2: The LF file is now located in a subdirectory under "src". target Python { timeout: 2 sec } From d5bdd9ae0cfdc5db57f6531846ce178c841a0e9a Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Sun, 29 Sep 2024 22:22:58 -0700 Subject: [PATCH 32/33] Change ImportUtil.buildPackageURIfromSrc to return a Path object instead of a String --- .../java/org/lflang/federated/generator/FedImportEmitter.java | 3 ++- core/src/main/java/org/lflang/util/ImportUtil.java | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java index 8ffe120af1..883bc8d327 100644 --- a/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java +++ b/core/src/main/java/org/lflang/federated/generator/FedImportEmitter.java @@ -1,6 +1,7 @@ package org.lflang.federated.generator; import java.nio.file.Path; +import java.nio.file.Paths; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; @@ -37,7 +38,7 @@ String generateImports(FederateInstance federate, FederationFileConfig fileConfi .srcPath .resolve( i.getImportURI() != null - ? i.getImportURI() + ? Paths.get(i.getImportURI()) : ImportUtil.buildPackageURIfromSrc( i.getImportPackage(), fileConfig.srcPath.toString())) .toAbsolutePath(); diff --git a/core/src/main/java/org/lflang/util/ImportUtil.java b/core/src/main/java/org/lflang/util/ImportUtil.java index 2fdaf5e4f3..60cf383be3 100644 --- a/core/src/main/java/org/lflang/util/ImportUtil.java +++ b/core/src/main/java/org/lflang/util/ImportUtil.java @@ -71,7 +71,7 @@ public static String buildPackageURI(String uriStr, Resource resource) { * @throws IllegalArgumentException if the URI string or source path is null, empty, or does not * contain both the library name and file name. */ - public static String buildPackageURIfromSrc(String uriStr, String root) { + public static Path buildPackageURIfromSrc(String uriStr, String root) { if (uriStr == null || root == null || uriStr.trim().isEmpty() || root.trim().isEmpty()) { throw new IllegalArgumentException("URI string and source path must not be null or empty."); } @@ -102,6 +102,6 @@ public static String buildPackageURIfromSrc(String uriStr, String root) { .resolve("lib") .resolve(uriPath.getName(1)); // file name - return finalPath.toString(); + return finalPath; } } From 6427abb106c4a1a92cc791f3c5b574bfc5c77a09 Mon Sep 17 00:00:00 2001 From: vinzbarbuto Date: Tue, 1 Oct 2024 16:37:03 -0700 Subject: [PATCH 33/33] Changed path in ImportUtil from 'target/lfc_include' to 'build/lfc_include' --- .gitignore | 3 +++ core/src/main/java/org/lflang/util/ImportUtil.java | 8 ++++---- .../lfc_include/library-test/src/lib/Import.lf | 0 3 files changed, 7 insertions(+), 4 deletions(-) rename test/Python/{target => build}/lfc_include/library-test/src/lib/Import.lf (100%) diff --git a/.gitignore b/.gitignore index da8902f971..193c7b8a77 100644 --- a/.gitignore +++ b/.gitignore @@ -170,3 +170,6 @@ gradle-app.setting *.jar core/model/ +# Exclude all build directories except test/Python/build for testing purposes +!test/Python/build/ + diff --git a/core/src/main/java/org/lflang/util/ImportUtil.java b/core/src/main/java/org/lflang/util/ImportUtil.java index 60cf383be3..b7de0a16d4 100644 --- a/core/src/main/java/org/lflang/util/ImportUtil.java +++ b/core/src/main/java/org/lflang/util/ImportUtil.java @@ -7,7 +7,7 @@ /** * Utility class for handling package-related URIs in the context of LF (Lingua Franca) libraries. * This class provides methods to build URIs for accessing library files based on their location in - * a project structure, specifically targeting the "target/lfc_include" directory for library + * a project structure, specifically targeting the "build/lfc_include" directory for library * inclusion. */ public class ImportUtil { @@ -15,7 +15,7 @@ public class ImportUtil { /** * Builds a package URI based on the provided URI string and resource. It traverses upwards from * the current resource URI until it finds the "src" directory, then constructs the final URI - * pointing to the library file within the "target/lfc_include" directory. + * pointing to the library file within the "build/lfc_include" directory. * * @param uriStr A string representing the URI of the file. It must contain both the library name * and file name, separated by a '/'. @@ -48,7 +48,7 @@ public static String buildPackageURI(String uriStr, Resource resource) { // Build the final path finalPath = finalPath - .resolve("target") + .resolve("build") .resolve("lfc_include") .resolve(uriPath.getName(0)) .resolve("src") @@ -95,7 +95,7 @@ public static Path buildPackageURIfromSrc(String uriStr, String root) { Path finalPath = rootPath - .resolveSibling("target") + .resolveSibling("build") .resolve("lfc_include") .resolve(uriPath.getName(0)) // library name .resolve("src") diff --git a/test/Python/target/lfc_include/library-test/src/lib/Import.lf b/test/Python/build/lfc_include/library-test/src/lib/Import.lf similarity index 100% rename from test/Python/target/lfc_include/library-test/src/lib/Import.lf rename to test/Python/build/lfc_include/library-test/src/lib/Import.lf