diff --git a/cc/src/main/grammars/de/monticore/lang/ComponentConnector.mc4 b/cc/src/main/grammars/de/monticore/lang/ComponentConnector.mc4 index e0ccf2a1..55af991a 100644 --- a/cc/src/main/grammars/de/monticore/lang/ComponentConnector.mc4 +++ b/cc/src/main/grammars/de/monticore/lang/ComponentConnector.mc4 @@ -159,6 +159,17 @@ component grammar ComponentConnector /** * Requirements: Wir berücksichtigen primär die Namen der Requirements */ - interface symbol Requirement = Name; + interface symbol Requirement = + name:Name + [isStateInvariant:"invariant"]? + subject:MildComponent + assumptions:Expression* + guarantee:Expression + ; + + symbolrule Requirement = + assumptions:Expression* + guarantee:Expression + ; } diff --git a/cc/src/main/java/de/monticore/lang/componentconnector/_symboltable/RequirementSymbolDeSer.java b/cc/src/main/java/de/monticore/lang/componentconnector/_symboltable/RequirementSymbolDeSer.java new file mode 100644 index 00000000..d85afdc8 --- /dev/null +++ b/cc/src/main/java/de/monticore/lang/componentconnector/_symboltable/RequirementSymbolDeSer.java @@ -0,0 +1,33 @@ +package de.monticore.lang.componentconnector._symboltable; + +import de.monticore.expressions.expressionsbasis._ast.ASTExpression; +import de.monticore.symboltable.serialization.json.JsonObject; + +import java.util.List; + +public class RequirementSymbolDeSer extends RequirementSymbolDeSerTOP { + + @Override + protected void serializeAssumptions(List assumptions, + ComponentConnectorSymbols2Json s2j) { + // not implemented + } + + @Override + protected void serializeGuarantee(ASTExpression guarantee, + ComponentConnectorSymbols2Json s2j) { + // not implemented + } + + @Override + protected List deserializeAssumptions(JsonObject symbolJson) { + // not implemented + return List.of(); + } + + @Override + protected ASTExpression deserializeGuarantee(JsonObject symbolJson) { + // not implemented + return null; + } +} diff --git a/gradle.properties b/gradle.properties index fa0e56fe..9726f10e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -25,4 +25,4 @@ assertj_version = 3.21.0 junit_version = 5.8.2 # Version of published artifacts -version = 7.8.27 +version = 7.8.28 diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/adapters/Requirement2RequirementCCAdapter.java b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/adapters/Requirement2RequirementCCAdapter.java index a54e28e5..fa08a7a6 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/adapters/Requirement2RequirementCCAdapter.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/adapters/Requirement2RequirementCCAdapter.java @@ -1,13 +1,62 @@ /* (c) https://github.com/MontiCore/monticore */ package de.monticore.lang.sysmlv2.symboltable.adapters; +import de.monticore.expressions.expressionsbasis._ast.ASTExpression; +import de.monticore.lang.componentconnector._symboltable.MildComponentSymbol; import de.monticore.lang.componentconnector._symboltable.RequirementSymbol; +import de.monticore.lang.sysmlconstraints._ast.ASTConstraintUsage; +import de.monticore.lang.sysmlconstraints._ast.ASTRequirementSubject; import de.monticore.lang.sysmlconstraints._symboltable.RequirementUsageSymbol; +import de.monticore.lang.sysmlv2._symboltable.SysMLv2Scope; + +import java.util.List; public class Requirement2RequirementCCAdapter extends RequirementSymbol { + private RequirementUsageSymbol adaptee; + public Requirement2RequirementCCAdapter(RequirementUsageSymbol requirementUsageSymbol) { super(requirementUsageSymbol.getFullName()); + this.adaptee = requirementUsageSymbol; } + public MildComponentSymbol getSubject() { + var subject = this.adaptee.getAstNode().getSysMLElementList() + .stream() + .filter(e -> e instanceof ASTRequirementSubject) + .map(e -> (ASTRequirementSubject) e) + .map(s -> s.getSymbol()) + .findFirst().orElse(null); + + if(subject.getTypesList().size() != 1) { + return null; + } + + var subjectTypeName = subject.getTypes(0).printFullName(); + return ((SysMLv2Scope) this.adaptee.getEnclosingScope()) + .resolveMildComponent(subjectTypeName) + .orElse(null); + } + + @Override + public List getAssumptionsList() { + return this.adaptee.getAstNode().getSysMLElementList() + .stream() + .filter(e -> e instanceof ASTConstraintUsage) + .map(e -> (ASTConstraintUsage) e) + .filter(usage -> usage.isAssume()) + .map(ASTConstraintUsage::getExpression) + .collect(java.util.stream.Collectors.toList()); + } + + @Override + public ASTExpression getGuarantee() { + return this.adaptee.getAstNode().getSysMLElementList() + .stream() + .filter(e -> e instanceof ASTConstraintUsage) + .map(e -> (ASTConstraintUsage) e) + .filter(usage -> usage.isAssert()) + .map(ASTConstraintUsage::getExpression) + .findFirst().orElse(null); + } }