From b91555b37e8c38cd2478a66468949580c1f1ed5c Mon Sep 17 00:00:00 2001 From: Denitsa Nikolova Date: Wed, 3 Jun 2026 11:14:48 +0200 Subject: [PATCH 1/2] changed grammar, fix for import.sysml --- .../main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 b/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 index 69b2e9fb9..0e82fe234 100644 --- a/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 +++ b/language/src/main/grammars/de/monticore/lang/SysMLImportsAndPackages.mc4 @@ -7,7 +7,7 @@ component grammar SysMLImportsAndPackages extends SysMLBasis { * From PrivateImportTest.sysml: "import all" overrides private import. */ SysMLImportStatement extends MCImportStatement implements SysMLElement = - Modifier UserDefinedKeyword* "import" ["all"]? MCQualifiedName + ("private" |"public"| "protected") UserDefinedKeyword* "import" ["all"]? MCQualifiedName (("::" | ".") (Star:["*"] | Recursive:["**"]))* ("[" filter:Expression "]")? ("as" Name)? From df677520144428f9d4a712caa3d2db891712caab Mon Sep 17 00:00:00 2001 From: Denitsa Nikolova Date: Wed, 1 Jul 2026 14:45:09 +0200 Subject: [PATCH 2/2] coco to be reviewed --- .../DefsAndUsagesHaveTheSameTypeCoCo.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 language/src/main/java/de/monticore/lang/sysmlv2/cocos/DefsAndUsagesHaveTheSameTypeCoCo.java diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/cocos/DefsAndUsagesHaveTheSameTypeCoCo.java b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/DefsAndUsagesHaveTheSameTypeCoCo.java new file mode 100644 index 000000000..5ce06fd0e --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlv2/cocos/DefsAndUsagesHaveTheSameTypeCoCo.java @@ -0,0 +1,98 @@ +package de.monticore.lang.sysmlv2.cocos; + +import de.monticore.lang.sysmlbasis._ast.ASTSysMLTyping; +import de.monticore.lang.sysmlparts._ast.ASTAttributeUsage; +import de.monticore.lang.sysmlparts._ast.ASTEnumUsage; +import de.monticore.lang.sysmlparts._ast.ASTPartUsage; +import de.monticore.lang.sysmlparts._ast.ASTPortUsage; +import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTAttributeUsageCoCo; +import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTEnumUsageCoCo; +import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPartUsageCoCo; +import de.monticore.lang.sysmlparts._cocos.SysMLPartsASTPortUsageCoCo; +import de.se_rwth.commons.logging.Log; + +public class DefsAndUsagesHaveTheSameTypeCoCo + implements SysMLPartsASTPartUsageCoCo, SysMLPartsASTPortUsageCoCo, + SysMLPartsASTAttributeUsageCoCo, SysMLPartsASTEnumUsageCoCo { + + @Override + public void check(ASTPartUsage node) { + boolean ok = node.getSpecializationList().stream() + .filter(t -> t instanceof ASTSysMLTyping) + .anyMatch(t -> node.getEnclosingScope() + .resolvePartDef(t.getSuperTypes(0).printType()) + .isPresent()); + + if (!ok) { + Log.error("0xCOCO002 No valid PartDef found for ASTSysMLTyping", + node.get_SourcePositionStart()); + } + + + /* node.getSymbol().getTypesList().stream() + .filter(t -> !(t.getTypeInfo() instanceof PartDef2TypeSymbolAdapter))// This type actually came from a part def + .forEach(t -> Log.error( + "0xCOCO001 Part usages must be typed by part definitions, but found: " + + t.print(), + node.get_SourcePositionStart(), + node.get_SourcePositionEnd()));*/ + } + + @Override + public void check(ASTPortUsage node) { + boolean ok = node.getSpecializationList().stream() + .filter(t -> t instanceof ASTSysMLTyping) + .anyMatch(t -> node.getEnclosingScope() + .resolvePortDef(t.getSuperTypes(0).printType()) + .isPresent()); + + if (!ok) { + Log.error("0xCOCO002 No valid PortDef found for ASTSysMLTyping", + node.get_SourcePositionStart()); + }; + + } + @Override + public void check(ASTAttributeUsage node) { + + node.getSpecializationList().stream() + .filter(ASTSysMLTyping.class::isInstance) + .forEach(t -> { + + String typeName = t.getSuperTypes(0).printType(); + + boolean valid = + node.getEnclosingScope() + .resolveAttributeDef(typeName) + .isPresent() + + || node.getEnclosingScope() + .resolveType(typeName) + .isPresent(); + + if (!valid) { + Log.error( + "0xCOCO003 Attribute usages may only be typed by an attribute definition " + + "or a valid type (e.g. ScalarValues::Boolean).", + node.get_SourcePositionStart(), + node.get_SourcePositionEnd()); + } + }); + } + + @Override + public void check(ASTEnumUsage node) { + boolean ok = node.getSpecializationList().stream() + .filter(t -> t instanceof ASTSysMLTyping) + .anyMatch(t -> node.getEnclosingScope() + .resolveEnumDef(t.getSuperTypes(0).printType()) + .isPresent()); + + if (!ok) { + Log.error("0xCOCO002 No valid EnumDef found for ASTSysMLTyping", + node.get_SourcePositionStart()); + } + + } + +}