Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<PartDefSymbol> 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());
});
}

}
Loading