From 9ac9c84d4e0957846989a5b9d41020474405ab37 Mon Sep 17 00:00:00 2001 From: Justus R Date: Tue, 21 Apr 2026 19:47:17 +0200 Subject: [PATCH 1/8] prototype for supporting imports within sysmlscopes --- .../grammars/de/monticore/lang/SysMLBasis.mc4 | 16 +++++ .../lang/SysMLImportsAndPackages.mc4 | 6 +- .../grammars/de/monticore/lang/SysMLParts.mc4 | 5 +- .../sysmlbasis/TESTSymbolWithImports.java | 15 +++++ .../_symboltable/SysMLPackageSymbolDeSer.java | 19 ++++++ .../_symboltable/PartDefSymbolDeSer.java | 13 ++++ .../monticore/lang/sysmlv2/SysMLv2Tool.java | 3 + .../completers/ImportCompleter.java | 62 +++++++++++++++++++ .../java/symboltable/ImportResolveTest.java | 1 + 9 files changed, 137 insertions(+), 3 deletions(-) create mode 100644 language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java create mode 100644 language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java create mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java diff --git a/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 index fc9c1016..96920135 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 @@ -38,6 +38,22 @@ component grammar SysMLBasis ) )? "]" ; + /* + * ################################################################## + * SysML Namespaces + * ################################################################## + */ + + // SysML Namespace: Artifact, Namespace-body + // or in some special constellations: ConstraintReference, ... + interface SysMLNamespace + = SysMLElement*; + + // Body block, e.g. namespaces not on the root of a modelfile + // this would be used in resolving and also to store imorts to symbol + /** symbol scope SysMLNamespaceBody extends SysMLNamespace = + "{" SysMLElement* "}" ; */ + /* * ################################################################## * SysML Basis Symbole diff --git a/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 index 2e426e08..437038c5 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 @@ -21,12 +21,16 @@ component grammar SysMLImportsAndPackages extends SysMLBasis { SysMLElement* "}" | ";") ; - symbol scope SysMLPackage implements SysMLElement = + symbol scope SysMLPackage implements SysMLElement, SysMLNamespace = ["standard"]? ["library"]? "package" SysMLIdentifier? Name? ("{" SysMLElement* "}" | ";") ; + symbolrule SysMLPackage implements de.monticore.lang.sysmlbasis.TESTSymbolWithImports = + imports:de.monticore.symboltable.ImportStatement* + ; + /** * A package may also contain filter conditions that filter the imports for the package. A filter condition is a * Boolean-valued, model-level evaluable expression declared using the keyword filter followed by a Boolean-valued, diff --git a/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 index 48f02081..cde1d570 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 @@ -16,7 +16,7 @@ component grammar SysMLParts extends SysMLBasis { * ################################################################## */ - symbol scope PartDef implements SysMLType = + symbol scope PartDef implements SysMLType, SysMLNamespace = Modifier UserDefinedKeyword* "part" "def" SysMLIdentifier? Name SysMLCardinality? Specialization* ("{" @@ -25,7 +25,8 @@ component grammar SysMLParts extends SysMLBasis { enum SysMLReqType = "UNKNOWN" | "HLR" | "LLR" | "MIXED" ; - symbolrule PartDef = + symbolrule PartDef implements de.monticore.lang.sysmlbasis.TESTSymbolWithImports = + imports:de.monticore.symboltable.ImportStatement* directRefinements:de.monticore.types.check.SymTypeExpression* requirementType:SysMLReqType; diff --git a/language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java b/language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java new file mode 100644 index 00000000..a9b3b1dd --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java @@ -0,0 +1,15 @@ +package de.monticore.lang.sysmlbasis; + +import java.util.List; + +public interface TESTSymbolWithImports { + + // Demo interface welches wir im resolve verwenden. Wir markieren hier + // nur symbole, welche imports unterstützen e.g. PartDef, Packages + + + List getImportsList(); + + void setImportsList(List imports); + +} diff --git a/language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java b/language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java new file mode 100644 index 00000000..e15d1378 --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java @@ -0,0 +1,19 @@ +package de.monticore.lang.sysmlimportsandpackages._symboltable; + +import de.monticore.symboltable.ImportStatement; +import de.monticore.symboltable.serialization.json.JsonObject; + +import java.util.List; + +public class SysMLPackageSymbolDeSer extends SysMLPackageSymbolDeSerTOP { + @Override + protected void serializeImports(List imports, + SysMLImportsAndPackagesSymbols2Json s2j) { + + } + + @Override + protected List deserializeImports(JsonObject symbolJson) { + return List.of(); + } +} diff --git a/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java b/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java index 295b8dad..a25fa455 100644 --- a/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java +++ b/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java @@ -1,6 +1,7 @@ package de.monticore.lang.sysmlparts._symboltable; import de.monticore.lang.sysmlparts._ast.ASTSysMLReqType; +import de.monticore.symboltable.ImportStatement; import de.monticore.symboltable.serialization.json.JsonObject; import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SymTypeExpressionDeSer; @@ -9,6 +10,12 @@ public class PartDefSymbolDeSer extends PartDefSymbolDeSerTOP { + @Override + protected void serializeImports(List imports, + SysMLPartsSymbols2Json s2j) { + //todo + } + @Override protected void serializeDirectRefinements(List refinementFQNs, SysMLPartsSymbols2Json s2j) { SymTypeExpressionDeSer.serializeMember(s2j.getJsonPrinter(), "directRefinements", refinementFQNs); @@ -19,6 +26,12 @@ protected void serializeRequirementType(ASTSysMLReqType requirementType, SysMLPa s2j.getJsonPrinter().member("requirementType", requirementType.name().toString()); } + @Override + protected List deserializeImports(JsonObject symbolJson) { + //todo + return List.of(); + } + @Override protected List deserializeDirectRefinements(JsonObject symbolJson) { return SymTypeExpressionDeSer.deserializeListMember( "directRefinements", symbolJson); diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java index 3b637e83..e7dc2e37 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java @@ -44,6 +44,7 @@ import de.monticore.lang.sysmlv2.symboltable.completers.DirectRefinementCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.DirectionCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.IdentifierCompletion; +import de.monticore.lang.sysmlv2.symboltable.completers.ImportCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.RequirementClassificationCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.SpecializationCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.StateUsageCompleter; @@ -202,6 +203,8 @@ public void completeSymbolTable(ASTSysMLModel node) { traverser.add4SysMLParts(new ConvertEnumUsagesToFields()); traverser.add4SysMLParts(new SysMLPartsCompleter()); traverser.add4SysMLParts(new IdentifierCompletion()); + traverser.add4SysMLBasis(new ImportCompleter()); + traverser.add4SysMLImportsAndPackages(new ImportCompleter()); // Visiting artifact scope _and_ the AST requires two calls if (node.getEnclosingScope() != null) { diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java new file mode 100644 index 00000000..cbfbfbf8 --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java @@ -0,0 +1,62 @@ +package de.monticore.lang.sysmlv2.symboltable.completers; + +import de.monticore.lang.sysmlbasis.TESTSymbolWithImports; +import de.monticore.lang.sysmlbasis._ast.ASTSysMLNamespace; +import de.monticore.lang.sysmlbasis._visitor.SysMLBasisVisitor2; +import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLImportStatement; +import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLPackage; +import de.monticore.lang.sysmlimportsandpackages._visitor.SysMLImportsAndPackagesVisitor2; +import de.monticore.symboltable.ImportStatement; + +import java.util.ArrayList; +import java.util.stream.Collectors; + +public class ImportCompleter implements SysMLBasisVisitor2, + SysMLImportsAndPackagesVisitor2 { + + @Override + public void visit(ASTSysMLPackage node) { + if(node instanceof ASTSysMLNamespace && // check wäre nötig wenn der visit-typ abstrahier wird + node.isPresentSymbol() && + node.getSymbol() instanceof TESTSymbolWithImports) { // check wäre nötig wenn der visit-typ abstrahier wird + + var elementsSysMlElements = node.getSysMLElementList(); + + var imports = elementsSysMlElements + .stream() + .filter(e -> e instanceof ASTSysMLImportStatement) + .map(e -> (ASTSysMLImportStatement) e) + .map(i -> + new ImportStatement(i.getMCQualifiedName().getQName(), + i.isStar() || i.isRecursive())) + .collect(Collectors.toCollection(ArrayList::new)); + + node.getSymbol().setImportsList(imports); + } + } + +// @Override +// public void visit(ASTSysMLElement node) { +// if(!(node instanceof ASTSysMLNamespace) || +// node.getEnclosingScope() == null || +// +// !node.getEnclosingScope().isPresentSpanningSymbol() || +// !(node.getEnclosingScope().getSpanningSymbol() instanceof NamespaceSymbol)) { +// return; +// } +// +// var elementsSysMlElements = ((ASTSysMLNamespace) node).getSysMLElementList(); +// +// var imports = elementsSysMlElements +// .stream() +// .filter(e -> e instanceof ASTSysMLImportStatement) +// .map(e -> (ASTSysMLImportStatement) e) +// .map(i -> +// new ImportStatement(i.getMCQualifiedName().getQName(), +// i.isStar() || i.isRecursive())) +// .collect(Collectors.toCollection(ArrayList::new)); +// +// ((NamespaceSymbol) node.getEnclosingScope().getSpanningSymbol()) +// .setImportsList(imports); +// } +} diff --git a/language/src/test/java/symboltable/ImportResolveTest.java b/language/src/test/java/symboltable/ImportResolveTest.java index 8568bc63..7b7316c5 100644 --- a/language/src/test/java/symboltable/ImportResolveTest.java +++ b/language/src/test/java/symboltable/ImportResolveTest.java @@ -177,6 +177,7 @@ public void testArtifactsScopeRecursiveImport() throws IOException { @Test() public void testSysMLScopeImport() throws IOException { LogStub.init(); + LogStub.initDEBUG(); var tool = new SysMLv2Tool(); tool.init(); From b04223da4d28f2026ea1b75a4e7c5e117de12231 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 13:41:49 +0200 Subject: [PATCH 2/8] rework on basis of ast traversal for import collecting, removing interfaces --- .../grammars/de/monticore/lang/SysMLBasis.mc4 | 16 --------- .../lang/SysMLImportsAndPackages.mc4 | 6 +--- .../grammars/de/monticore/lang/SysMLParts.mc4 | 5 ++- .../_symboltable/SysMLPackageSymbolDeSer.java | 19 ---------- .../_symboltable/PartDefSymbolDeSer.java | 12 ------- .../monticore/lang/sysmlv2/SysMLv2Tool.java | 2 -- .../sysmlv2/_symboltable/ISysMLv2Scope.java | 1 - .../completers/ImportCompleter.java | 35 +++++++++---------- 8 files changed, 20 insertions(+), 76 deletions(-) delete mode 100644 language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java diff --git a/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 index 96920135..fc9c1016 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLBasis.mc4 @@ -38,22 +38,6 @@ component grammar SysMLBasis ) )? "]" ; - /* - * ################################################################## - * SysML Namespaces - * ################################################################## - */ - - // SysML Namespace: Artifact, Namespace-body - // or in some special constellations: ConstraintReference, ... - interface SysMLNamespace - = SysMLElement*; - - // Body block, e.g. namespaces not on the root of a modelfile - // this would be used in resolving and also to store imorts to symbol - /** symbol scope SysMLNamespaceBody extends SysMLNamespace = - "{" SysMLElement* "}" ; */ - /* * ################################################################## * SysML Basis Symbole diff --git a/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 index 437038c5..2e426e08 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 @@ -21,16 +21,12 @@ component grammar SysMLImportsAndPackages extends SysMLBasis { SysMLElement* "}" | ";") ; - symbol scope SysMLPackage implements SysMLElement, SysMLNamespace = + symbol scope SysMLPackage implements SysMLElement = ["standard"]? ["library"]? "package" SysMLIdentifier? Name? ("{" SysMLElement* "}" | ";") ; - symbolrule SysMLPackage implements de.monticore.lang.sysmlbasis.TESTSymbolWithImports = - imports:de.monticore.symboltable.ImportStatement* - ; - /** * A package may also contain filter conditions that filter the imports for the package. A filter condition is a * Boolean-valued, model-level evaluable expression declared using the keyword filter followed by a Boolean-valued, diff --git a/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 index cde1d570..48f02081 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLParts.mc4 @@ -16,7 +16,7 @@ component grammar SysMLParts extends SysMLBasis { * ################################################################## */ - symbol scope PartDef implements SysMLType, SysMLNamespace = + symbol scope PartDef implements SysMLType = Modifier UserDefinedKeyword* "part" "def" SysMLIdentifier? Name SysMLCardinality? Specialization* ("{" @@ -25,8 +25,7 @@ component grammar SysMLParts extends SysMLBasis { enum SysMLReqType = "UNKNOWN" | "HLR" | "LLR" | "MIXED" ; - symbolrule PartDef implements de.monticore.lang.sysmlbasis.TESTSymbolWithImports = - imports:de.monticore.symboltable.ImportStatement* + symbolrule PartDef = directRefinements:de.monticore.types.check.SymTypeExpression* requirementType:SysMLReqType; diff --git a/language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java b/language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java deleted file mode 100644 index e15d1378..00000000 --- a/language/src/main/java/de/monticore/lang/sysmlimportsandpackages/_symboltable/SysMLPackageSymbolDeSer.java +++ /dev/null @@ -1,19 +0,0 @@ -package de.monticore.lang.sysmlimportsandpackages._symboltable; - -import de.monticore.symboltable.ImportStatement; -import de.monticore.symboltable.serialization.json.JsonObject; - -import java.util.List; - -public class SysMLPackageSymbolDeSer extends SysMLPackageSymbolDeSerTOP { - @Override - protected void serializeImports(List imports, - SysMLImportsAndPackagesSymbols2Json s2j) { - - } - - @Override - protected List deserializeImports(JsonObject symbolJson) { - return List.of(); - } -} diff --git a/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java b/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java index a25fa455..c65fb1a0 100644 --- a/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java +++ b/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java @@ -10,12 +10,6 @@ public class PartDefSymbolDeSer extends PartDefSymbolDeSerTOP { - @Override - protected void serializeImports(List imports, - SysMLPartsSymbols2Json s2j) { - //todo - } - @Override protected void serializeDirectRefinements(List refinementFQNs, SysMLPartsSymbols2Json s2j) { SymTypeExpressionDeSer.serializeMember(s2j.getJsonPrinter(), "directRefinements", refinementFQNs); @@ -26,12 +20,6 @@ protected void serializeRequirementType(ASTSysMLReqType requirementType, SysMLPa s2j.getJsonPrinter().member("requirementType", requirementType.name().toString()); } - @Override - protected List deserializeImports(JsonObject symbolJson) { - //todo - return List.of(); - } - @Override protected List deserializeDirectRefinements(JsonObject symbolJson) { return SymTypeExpressionDeSer.deserializeListMember( "directRefinements", symbolJson); diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java index e7dc2e37..741b5e4e 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java @@ -203,8 +203,6 @@ public void completeSymbolTable(ASTSysMLModel node) { traverser.add4SysMLParts(new ConvertEnumUsagesToFields()); traverser.add4SysMLParts(new SysMLPartsCompleter()); traverser.add4SysMLParts(new IdentifierCompletion()); - traverser.add4SysMLBasis(new ImportCompleter()); - traverser.add4SysMLImportsAndPackages(new ImportCompleter()); // Visiting artifact scope _and_ the AST requires two calls if (node.getEnclosingScope() != null) { diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java index 71eecaa9..18871048 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java @@ -138,7 +138,6 @@ public void visit(ASTSysMLImportStatement node) { return new ArrayList<>(result); } - /** * @see ISysMLv2Scope#continueTypeWithEnclosingScope(boolean, String, AccessModifier, Predicate) */ diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java index cbfbfbf8..e15d4d48 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java @@ -1,7 +1,6 @@ package de.monticore.lang.sysmlv2.symboltable.completers; import de.monticore.lang.sysmlbasis.TESTSymbolWithImports; -import de.monticore.lang.sysmlbasis._ast.ASTSysMLNamespace; import de.monticore.lang.sysmlbasis._visitor.SysMLBasisVisitor2; import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLImportStatement; import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLPackage; @@ -16,23 +15,23 @@ public class ImportCompleter implements SysMLBasisVisitor2, @Override public void visit(ASTSysMLPackage node) { - if(node instanceof ASTSysMLNamespace && // check wäre nötig wenn der visit-typ abstrahier wird - node.isPresentSymbol() && - node.getSymbol() instanceof TESTSymbolWithImports) { // check wäre nötig wenn der visit-typ abstrahier wird - - var elementsSysMlElements = node.getSysMLElementList(); - - var imports = elementsSysMlElements - .stream() - .filter(e -> e instanceof ASTSysMLImportStatement) - .map(e -> (ASTSysMLImportStatement) e) - .map(i -> - new ImportStatement(i.getMCQualifiedName().getQName(), - i.isStar() || i.isRecursive())) - .collect(Collectors.toCollection(ArrayList::new)); - - node.getSymbol().setImportsList(imports); - } +// if(node instanceof ASTSysMLNamespace && // check wäre nötig wenn der visit-typ abstrahier wird +// node.isPresentSymbol() && +// node.getSymbol() instanceof TESTSymbolWithImports) { // check wäre nötig wenn der visit-typ abstrahier wird +// +// var elementsSysMlElements = node.getSysMLElementList(); +// +// var imports = elementsSysMlElements +// .stream() +// .filter(e -> e instanceof ASTSysMLImportStatement) +// .map(e -> (ASTSysMLImportStatement) e) +// .map(i -> +// new ImportStatement(i.getMCQualifiedName().getQName(), +// i.isStar() || i.isRecursive())) +// .collect(Collectors.toCollection(ArrayList::new)); +// +// node.getSymbol().setImportsList(imports); +// } } // @Override From 0eb5cb22d1474b6fde0df9af0e9301367984b091 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 13:58:32 +0200 Subject: [PATCH 3/8] cleanup of first iteration test leftovers --- .../sysmlbasis/TESTSymbolWithImports.java | 15 ----- .../_symboltable/PartDefSymbolDeSer.java | 1 - .../monticore/lang/sysmlv2/SysMLv2Tool.java | 1 - .../completers/ImportCompleter.java | 61 ------------------- 4 files changed, 78 deletions(-) delete mode 100644 language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java delete mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java diff --git a/language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java b/language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java deleted file mode 100644 index a9b3b1dd..00000000 --- a/language/src/main/java/de/monticore/lang/sysmlbasis/TESTSymbolWithImports.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.monticore.lang.sysmlbasis; - -import java.util.List; - -public interface TESTSymbolWithImports { - - // Demo interface welches wir im resolve verwenden. Wir markieren hier - // nur symbole, welche imports unterstützen e.g. PartDef, Packages - - - List getImportsList(); - - void setImportsList(List imports); - -} diff --git a/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java b/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java index c65fb1a0..295b8dad 100644 --- a/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java +++ b/language/src/main/java/de/monticore/lang/sysmlparts/_symboltable/PartDefSymbolDeSer.java @@ -1,7 +1,6 @@ package de.monticore.lang.sysmlparts._symboltable; import de.monticore.lang.sysmlparts._ast.ASTSysMLReqType; -import de.monticore.symboltable.ImportStatement; import de.monticore.symboltable.serialization.json.JsonObject; import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SymTypeExpressionDeSer; diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java index 741b5e4e..3b637e83 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java @@ -44,7 +44,6 @@ import de.monticore.lang.sysmlv2.symboltable.completers.DirectRefinementCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.DirectionCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.IdentifierCompletion; -import de.monticore.lang.sysmlv2.symboltable.completers.ImportCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.RequirementClassificationCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.SpecializationCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.StateUsageCompleter; diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java deleted file mode 100644 index e15d4d48..00000000 --- a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/ImportCompleter.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.monticore.lang.sysmlv2.symboltable.completers; - -import de.monticore.lang.sysmlbasis.TESTSymbolWithImports; -import de.monticore.lang.sysmlbasis._visitor.SysMLBasisVisitor2; -import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLImportStatement; -import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLPackage; -import de.monticore.lang.sysmlimportsandpackages._visitor.SysMLImportsAndPackagesVisitor2; -import de.monticore.symboltable.ImportStatement; - -import java.util.ArrayList; -import java.util.stream.Collectors; - -public class ImportCompleter implements SysMLBasisVisitor2, - SysMLImportsAndPackagesVisitor2 { - - @Override - public void visit(ASTSysMLPackage node) { -// if(node instanceof ASTSysMLNamespace && // check wäre nötig wenn der visit-typ abstrahier wird -// node.isPresentSymbol() && -// node.getSymbol() instanceof TESTSymbolWithImports) { // check wäre nötig wenn der visit-typ abstrahier wird -// -// var elementsSysMlElements = node.getSysMLElementList(); -// -// var imports = elementsSysMlElements -// .stream() -// .filter(e -> e instanceof ASTSysMLImportStatement) -// .map(e -> (ASTSysMLImportStatement) e) -// .map(i -> -// new ImportStatement(i.getMCQualifiedName().getQName(), -// i.isStar() || i.isRecursive())) -// .collect(Collectors.toCollection(ArrayList::new)); -// -// node.getSymbol().setImportsList(imports); -// } - } - -// @Override -// public void visit(ASTSysMLElement node) { -// if(!(node instanceof ASTSysMLNamespace) || -// node.getEnclosingScope() == null || -// -// !node.getEnclosingScope().isPresentSpanningSymbol() || -// !(node.getEnclosingScope().getSpanningSymbol() instanceof NamespaceSymbol)) { -// return; -// } -// -// var elementsSysMlElements = ((ASTSysMLNamespace) node).getSysMLElementList(); -// -// var imports = elementsSysMlElements -// .stream() -// .filter(e -> e instanceof ASTSysMLImportStatement) -// .map(e -> (ASTSysMLImportStatement) e) -// .map(i -> -// new ImportStatement(i.getMCQualifiedName().getQName(), -// i.isStar() || i.isRecursive())) -// .collect(Collectors.toCollection(ArrayList::new)); -// -// ((NamespaceSymbol) node.getEnclosingScope().getSpanningSymbol()) -// .setImportsList(imports); -// } -} From 320e2efb9ab14bf32a014cc4681767a913c00059 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 13:59:58 +0200 Subject: [PATCH 4/8] removing debug logs from tests --- language/src/test/java/symboltable/ImportResolveTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/language/src/test/java/symboltable/ImportResolveTest.java b/language/src/test/java/symboltable/ImportResolveTest.java index 7b7316c5..8568bc63 100644 --- a/language/src/test/java/symboltable/ImportResolveTest.java +++ b/language/src/test/java/symboltable/ImportResolveTest.java @@ -177,7 +177,6 @@ public void testArtifactsScopeRecursiveImport() throws IOException { @Test() public void testSysMLScopeImport() throws IOException { LogStub.init(); - LogStub.initDEBUG(); var tool = new SysMLv2Tool(); tool.init(); From dd4feda3f5298a59917a95463f97fd16dbcb29d5 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 15:30:51 +0200 Subject: [PATCH 5/8] continueWithEnclosing Merged, to include functions and variables --- .../sysmlv2/_symboltable/ISysMLv2Scope.java | 83 +++++++++++++++---- 1 file changed, 66 insertions(+), 17 deletions(-) diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java index 18871048..31f88256 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java @@ -44,11 +44,11 @@ import de.monticore.symbols.basicsymbols._symboltable.TypeSymbol; import de.monticore.symbols.basicsymbols._symboltable.VariableSymbol; import de.monticore.symboltable.IScopeSpanningSymbol; +import de.monticore.symboltable.ISymbol; import de.monticore.symboltable.ImportStatement; import de.monticore.symboltable.modifiers.AccessModifier; import de.monticore.types.check.SymTypeExpression; import de.monticore.types.check.SymTypeExpressionFactory; -import de.se_rwth.commons.logging.Log; import java.util.ArrayList; import java.util.Arrays; @@ -57,6 +57,7 @@ import java.util.List; import java.util.Optional; import java.util.Set; +import java.util.function.BiFunction; import java.util.function.Predicate; import static de.se_rwth.commons.Names.getQualifier; @@ -98,25 +99,73 @@ public interface ISysMLv2Scope extends ISysMLv2ScopeTOP { */ @Override default List continueTypeWithEnclosingScope( - boolean foundSymbols, - String name, - AccessModifier modifier, - Predicate predicate + boolean foundSymbols, + String name, + AccessModifier modifier, + Predicate predicate ) { - final LinkedHashSet result = new LinkedHashSet<>(); - if ( - checkIfContinueWithEnclosingScope(foundSymbols) - && getEnclosingScope() != null - ) { + return continueWithEnclosingScope(foundSymbols, + name, + (foundInIteration, qualifiedName) -> + getEnclosingScope().resolveTypeMany(foundInIteration, qualifiedName, modifier, predicate)); + } + + @Override + default List continueVariableWithEnclosingScope( + boolean foundSymbols, + String name, + AccessModifier modifier, + Predicate predicate + ) { + return this.continueWithEnclosingScope(foundSymbols, + name, + (foundInIteration, qualifiedName) -> + getEnclosingScope().resolveVariableMany(foundInIteration, qualifiedName, modifier, predicate)); + } + + @Override + default List continueFunctionWithEnclosingScope( + boolean foundSymbols, + String name, + AccessModifier modifier, + Predicate predicate + ) { + return continueWithEnclosingScope(foundSymbols, + name, + (foundInIteration, qualifiedName) -> + getEnclosingScope().resolveFunctionMany(foundInIteration, qualifiedName, modifier, predicate)); + } + + /** + * Generic continueWithEnclosing for multiple symbols + * @param foundSymbols + * @param name + * @param resolver the resolveMany call for the specific Type T + * @return + * @param Symboltype to be processes, also used within resolver + */ + default List continueWithEnclosingScope( + boolean foundSymbols, + String name, + BiFunction> resolver + ) { + final LinkedHashSet result = new LinkedHashSet<>(); + if (checkIfContinueWithEnclosingScope(foundSymbols) + && getEnclosingScope() != null) { var importStatements = new LinkedList(); + + // collect import statements based on enclosing scopes AST-Imports if(getEnclosingScope().isPresentAstNode()) { var visitor = new SysMLImportsAndPackagesVisitor2() { @Override public void visit(ASTSysMLImportStatement node) { + // collect imports located directly within the enclosing scope if (getEnclosingScope().equals(node.getEnclosingScope())) { - importStatements.add(new ImportStatement(node.getMCQualifiedName().getQName(), - node.isStar() || node.isRecursive())); + importStatements.add(new ImportStatement( + node.getMCQualifiedName().getQName(), + node.isStar() || node.isRecursive()) + ); } } }; @@ -127,12 +176,12 @@ public void visit(ASTSysMLImportStatement node) { Set potentialNames = calcQNamesForEnclosingScope(name, importStatements); + // Hier wird die abstrakte Resolver-Funktion genutzt for (String potentialName : potentialNames) { - result.addAll(getEnclosingScope().resolveTypeMany( foundSymbols, - potentialName, - modifier, - predicate) - ); + // The provided resolver is calling the exact resolveManyTYPE + var resolvedFromEnclosing = resolver.apply(foundSymbols, potentialName); + foundSymbols = foundSymbols | resolvedFromEnclosing.size() > 0; + result.addAll(resolvedFromEnclosing); } } From 0af5390aa40781989fccca3298fb55b9cd0de69e Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 15:56:45 +0200 Subject: [PATCH 6/8] fixed unecessary reformatting --- .../lang/sysmlv2/_symboltable/ISysMLv2Scope.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java index 31f88256..d99c5b10 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java @@ -99,10 +99,10 @@ public interface ISysMLv2Scope extends ISysMLv2ScopeTOP { */ @Override default List continueTypeWithEnclosingScope( - boolean foundSymbols, - String name, - AccessModifier modifier, - Predicate predicate + boolean foundSymbols, + String name, + AccessModifier modifier, + Predicate predicate ) { return continueWithEnclosingScope(foundSymbols, name, From 71c90b06dd754a9ce40523d841aead387fd0dc67 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 19:59:43 +0200 Subject: [PATCH 7/8] fixed rebased, introduced docs --- .../sysmlv2/_symboltable/ISysMLv2Scope.java | 111 +++--------------- .../_symboltable/SysMLv2ScopesGenitor.java | 5 +- 2 files changed, 19 insertions(+), 97 deletions(-) diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java index d99c5b10..0d25356f 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java @@ -110,6 +110,9 @@ default List continueTypeWithEnclosingScope( getEnclosingScope().resolveTypeMany(foundInIteration, qualifiedName, modifier, predicate)); } + /** + * @see ISysMLv2Scope#continueTypeWithEnclosingScope + */ @Override default List continueVariableWithEnclosingScope( boolean foundSymbols, @@ -123,6 +126,9 @@ default List continueVariableWithEnclosingScope( getEnclosingScope().resolveVariableMany(foundInIteration, qualifiedName, modifier, predicate)); } + /** + * @see ISysMLv2Scope#continueTypeWithEnclosingScope + */ @Override default List continueFunctionWithEnclosingScope( boolean foundSymbols, @@ -137,11 +143,15 @@ default List continueFunctionWithEnclosingScope( } /** - * Generic continueWithEnclosing for multiple symbols - * @param foundSymbols - * @param name - * @param resolver the resolveMany call for the specific Type T - * @return + * Generic continueWithEnclosing for multiple symbols. The structure is the + * same for all resolutions. We Abstract the SymbolType as T and introduce a + * Function argument where we will pass the specific Type-Dependent resolve + * call. + * + * @param foundSymbols marker if we have already found matching symbols + * @param name The name of the symbol we are searching + * @param resolver the resolveManyT call for the specific Type T + * @return The List of retrieved symbols * @param Symboltype to be processes, also used within resolver */ default List continueWithEnclosingScope( @@ -187,97 +197,6 @@ public void visit(ASTSysMLImportStatement node) { return new ArrayList<>(result); } - /** - * @see ISysMLv2Scope#continueTypeWithEnclosingScope(boolean, String, AccessModifier, Predicate) - */ - @Override - default List continueVariableWithEnclosingScope( - boolean foundSymbols, - String name, - AccessModifier modifier, - Predicate predicate - ) { - final LinkedHashSet result = new LinkedHashSet<>(); - if ( - checkIfContinueWithEnclosingScope(foundSymbols) - && getEnclosingScope() != null - ) { - - var importStatements = new LinkedList(); - if(getEnclosingScope().isPresentAstNode()) { - var visitor = new SysMLImportsAndPackagesVisitor2() { - @Override - public void visit(ASTSysMLImportStatement node) { - if (getEnclosingScope().equals(node.getEnclosingScope())) { - importStatements.add(new ImportStatement(node.getMCQualifiedName().getQName(), - node.isStar() || node.isRecursive())); - } - } - }; - var traverser = SysMLv2Mill.inheritanceTraverser(); - traverser.add4SysMLImportsAndPackages(visitor); - getEnclosingScope().getAstNode().accept(traverser); - } - - Set potentialNames = calcQNamesForEnclosingScope(name, importStatements); - - for (String potentialName : potentialNames) { - result.addAll(getEnclosingScope().resolveVariableMany( foundSymbols, - potentialName, - modifier, - predicate) - ); - } - } - - return new ArrayList<>(result); - } - - /** - * @see ISysMLv2Scope#continueTypeWithEnclosingScope(boolean, String, AccessModifier, Predicate) - */ - @Override - default List continueFunctionWithEnclosingScope( - boolean foundSymbols, - String name, - AccessModifier modifier, - Predicate predicate - ) { - final LinkedHashSet result = new LinkedHashSet<>(); - if ( - checkIfContinueWithEnclosingScope(foundSymbols) - && (getEnclosingScope() != null) - ) { - - var importStatements = new LinkedList(); - if(getEnclosingScope().isPresentAstNode()) { - var visitor = new SysMLImportsAndPackagesVisitor2() { - @Override - public void visit(ASTSysMLImportStatement node) { - if (getEnclosingScope().equals(node.getEnclosingScope())) { - importStatements.add(new ImportStatement(node.getMCQualifiedName().getQName(), - node.isStar() || node.isRecursive())); - } - } - }; - var traverser = SysMLv2Mill.inheritanceTraverser(); - traverser.add4SysMLImportsAndPackages(visitor); - getEnclosingScope().getAstNode().accept(traverser); - } - - Set potentialNames = calcQNamesForEnclosingScope(name, importStatements); - - for (String potentialName : potentialNames) { - result.addAll(getEnclosingScope().resolveFunctionMany( foundSymbols, - potentialName, - modifier, - predicate) - ); - } - } - - return new ArrayList<>(result); - } /** * This method is essentially copied from artifact scopes. See explanation diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java index 66007190..d03f0702 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java @@ -10,5 +10,8 @@ public class SysMLv2ScopesGenitor extends SysMLv2ScopesGenitorTOP { - + @Override + protected void initArtifactScopeHP1(ISysMLv2ArtifactScope scope) { + super.initArtifactScopeHP1(scope); + } } From 22f0f000d4efb1c925a7e2fd0245baa3a1b66c40 Mon Sep 17 00:00:00 2001 From: Justus R Date: Wed, 22 Apr 2026 20:04:29 +0200 Subject: [PATCH 8/8] formatting, deleted unused scopesgenitor --- .../sysmlv2/_symboltable/ISysMLv2Scope.java | 16 ++++++++-------- .../_symboltable/SysMLv2ScopesGenitor.java | 17 ----------------- 2 files changed, 8 insertions(+), 25 deletions(-) delete mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java index 0d25356f..0e3bc215 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/ISysMLv2Scope.java @@ -115,10 +115,10 @@ default List continueTypeWithEnclosingScope( */ @Override default List continueVariableWithEnclosingScope( - boolean foundSymbols, - String name, - AccessModifier modifier, - Predicate predicate + boolean foundSymbols, + String name, + AccessModifier modifier, + Predicate predicate ) { return this.continueWithEnclosingScope(foundSymbols, name, @@ -131,10 +131,10 @@ default List continueVariableWithEnclosingScope( */ @Override default List continueFunctionWithEnclosingScope( - boolean foundSymbols, - String name, - AccessModifier modifier, - Predicate predicate + boolean foundSymbols, + String name, + AccessModifier modifier, + Predicate predicate ) { return continueWithEnclosingScope(foundSymbols, name, diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java b/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java deleted file mode 100644 index d03f0702..00000000 --- a/language/src/main/java/de/monticore/lang/sysmlv2/_symboltable/SysMLv2ScopesGenitor.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.monticore.lang.sysmlv2._symboltable; - -import de.monticore.lang.sysmlimportsandpackages._ast.ASTSysMLImportStatement; -import de.monticore.lang.sysmlv2._ast.ASTSysMLModel; -import de.monticore.symboltable.ImportStatement; -import de.se_rwth.commons.logging.Log; - -import java.util.ArrayList; -import java.util.stream.Collectors; - -public class SysMLv2ScopesGenitor extends SysMLv2ScopesGenitorTOP { - - @Override - protected void initArtifactScopeHP1(ISysMLv2ArtifactScope scope) { - super.initArtifactScopeHP1(scope); - } -}