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 bb49c544..bd56a1f4 100644 --- a/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java +++ b/language/src/main/java/de/monticore/lang/sysmlv2/SysMLv2Tool.java @@ -46,6 +46,7 @@ import de.monticore.lang.sysmlv2.symboltable.completers.DirectionCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.IdentifierCompletion; import de.monticore.lang.sysmlv2.symboltable.completers.RequirementClassificationCompleter; +import de.monticore.lang.sysmlv2.symboltable.completers.RequirementScopeBySubjectsCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.SpecializationCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.StateUsageCompleter; import de.monticore.lang.sysmlv2.symboltable.completers.TypesCompleter; @@ -221,6 +222,9 @@ public void completeSymbolTable(ASTSysMLModel node) { traverser.add4SysMLParts(new CausalityCompleter()); traverser.add4SysMLStates(new StateUsageCompleter()); + // expose requirements subjects attr. to requirements scope + traverser.add4SysMLConstraints(new RequirementScopeBySubjectsCompleter()); + // Visiting artifact scope _and_ the AST requires two calls if (node.getEnclosingScope() != null) { node.getEnclosingScope().accept(traverser); diff --git a/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/RequirementScopeBySubjectsCompleter.java b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/RequirementScopeBySubjectsCompleter.java new file mode 100644 index 00000000..ef014f04 --- /dev/null +++ b/language/src/main/java/de/monticore/lang/sysmlv2/symboltable/completers/RequirementScopeBySubjectsCompleter.java @@ -0,0 +1,56 @@ +package de.monticore.lang.sysmlv2.symboltable.completers; + +import de.monticore.lang.sysmlconstraints._ast.ASTRequirementUsage; +import de.monticore.lang.sysmlconstraints._visitor.SysMLConstraintsVisitor2; +import de.monticore.lang.sysmlparts._symboltable.PartDefSymbol; +import de.monticore.lang.sysmlv2.SysMLv2Mill; +import de.monticore.lang.sysmlv2._symboltable.ISysMLv2Scope; +import de.monticore.lang.sysmlv2._symboltable.SysMLv2Scope; +import de.se_rwth.commons.logging.Log; + +import java.util.Optional; + +public class RequirementScopeBySubjectsCompleter implements SysMLConstraintsVisitor2 { + + @Override + public void endVisit(ASTRequirementUsage node) { + if(!node.isPresentRequirementSubject()) { + return; + } + + // retrieve requirement subjects data + var reqSubject = node.getRequirementSubject(); + var reqSubjectName = reqSubject.getName(); + + // retrieve the subject within the enclosing scope of our RequirementUsage + ISysMLv2Scope usageEnclosingScope = ((ISysMLv2Scope) node.getEnclosingScope()); + Optional subjectSym = usageEnclosingScope.resolvePartDef(reqSubjectName); + + if (!subjectSym.isPresent()) { + // that should better be called in explicit CoCo later, and we just return + // here + Log.warn("0x10113 Subject not found.", node.get_SourcePositionStart()); + return; + } + + var subjectScope = ((SysMLv2Scope) subjectSym.get().getSpannedScope()); + var reqScope = ((SysMLv2Scope) node.getSymbol().getSpannedScope()); + + // we copy the ports from the subject to the requirement + subjectScope.getLocalPortUsageSymbols().forEach(portUsage -> { + var portUsageBuilder = SysMLv2Mill.portUsageSymbolBuilder() + .setTypesList(portUsage.getTypesList()) + .setConjugatedTypesList(portUsage.getConjugatedTypesList()) + .setStrong(portUsage.isStrong()) + .setName(portUsage.getName()) + .setFullName(portUsage.getFullName()) + .setPackageName(portUsage.getPackageName()) + .setAccessModifier(portUsage.getAccessModifier()) + .setStereoinfo(portUsage.getStereoinfo()) + .setEnclosingScope(reqScope) + .setSpannedScope(SysMLv2Mill.scope()); + reqScope.add(portUsageBuilder.build()); + }); + } + +}