Skip to content
Merged
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 @@ -41,9 +41,9 @@ standard library package TransitionPerformances {

feature accNum: Natural [1] = if isEmpty(trigger) ? 0 else 1;
step accept: AcceptPerformance[accNum] subsets timeEnclosedOccurrences, acceptPerformances {
in feature redefines receiver = triggerTarget;
feature redefines acceptedTransfer = trigger;
}
binding accept.receiver = triggerTarget;

private succession [*] guard then [accNum] accept;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,9 +41,9 @@ standard library package TransitionPerformances {

feature accNum: Natural [1] = if isEmpty(trigger) ? 0 else 1;
step accept: AcceptPerformance[accNum] subsets timeEnclosedOccurrences, acceptPerformances {
in feature redefines receiver = triggerTarget;
feature redefines acceptedTransfer = trigger;
}
binding accept.receiver = triggerTarget;

private succession [*] guard then [accNum] accept;
}
Expand Down
2 changes: 2 additions & 0 deletions org.omg.sysml.xpect.tests/library.systems/Actions.sysml
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ standard library package Actions {
/*
* The subactions of this Action that are AssignmentActions.
*/

in target;
}

abstract action ifSubactions : IfThenAction[0..*] :> subactions, ifThenActions {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
*****************************************************************************/
package org.omg.sysml.xtext.validation

import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.emf.ecore.EStructuralFeature
import org.eclipse.xtext.validation.Check
Expand Down Expand Up @@ -88,8 +89,6 @@ import org.omg.sysml.lang.sysml.UseCaseUsage
import org.omg.sysml.lang.sysml.UseCaseDefinition
import org.omg.sysml.lang.sysml.MetadataUsage
import org.omg.sysml.lang.sysml.Metaclass
import org.omg.sysml.util.FeatureUtil
import org.omg.sysml.util.UsageUtil
import org.omg.sysml.lang.sysml.Interaction
import org.omg.sysml.lang.sysml.SendActionUsage
import org.omg.sysml.lang.sysml.FeatureReferenceExpression
Expand Down Expand Up @@ -122,7 +121,6 @@ import org.omg.sysml.lang.sysml.ViewRenderingMembership
import org.omg.sysml.lang.sysml.AttributeDefinition
import org.omg.sysml.lang.sysml.Namespace
import org.omg.sysml.lang.sysml.ActionDefinition
import org.eclipse.emf.ecore.EObject
import org.omg.sysml.lang.sysml.TransitionFeatureKind
import org.omg.sysml.lang.sysml.ActorMembership
import org.omg.sysml.lang.sysml.RequirementConstraintKind
Expand All @@ -131,10 +129,11 @@ import org.omg.sysml.lang.sysml.ReferenceUsage
import org.omg.sysml.lang.sysml.IfActionUsage
import org.omg.sysml.lang.sysml.WhileLoopActionUsage
import org.omg.sysml.lang.sysml.TriggerKind
import org.omg.sysml.util.TypeUtil
import org.omg.sysml.lang.sysml.FlowDefinition
import org.omg.sysml.lang.sysml.FlowUsage
import org.omg.sysml.lang.sysml.Relationship
import org.omg.sysml.util.FeatureUtil
import org.omg.sysml.util.UsageUtil

/**
* This class contains custom validation rules.
Expand Down Expand Up @@ -667,7 +666,7 @@ class SysMLValidator extends KerMLValidator {
@Check
def checkFlowDefinition(FlowDefinition cdef) {
// validateConnectionDefinitionConnectionEnds
val ends = TypeUtil.getAllEndFeaturesOf(cdef)
val ends = cdef.endFeature
if (ends.size > 2) {
val ownedEnds = cdef.ownedEndFeature
if (ownedEnds.size <= 2) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
import java.util.List;

import org.omg.sysml.lang.sysml.ActionUsage;
import org.omg.sysml.lang.sysml.Element;
import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.FeatureMembership;
import org.omg.sysml.lang.sysml.PartDefinition;
Expand Down Expand Up @@ -130,10 +129,10 @@ public boolean isComputeRedefinitions() {
}

@Override
protected List<? extends Feature> getRelevantFeatures(Type type, Element skip) {
protected List<? extends Feature> getRelevantFeatures(Type type) {
ActionUsage target = getTarget();
String redefinedFeature = getRedefinedFeature(target);
return redefinedFeature == null? super.getRelevantFeatures(type, skip):
return redefinedFeature == null? super.getRelevantFeatures(type):
type == target.getOwningType()? Collections.singletonList(target):
Collections.singletonList((Feature)getLibraryType(redefinedFeature));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,14 +80,14 @@ protected String getDefaultSupertype() {
// Computed Redefinition

@Override
protected List<? extends Feature> getRelevantFeatures(Type type, Element skip) {
protected List<? extends Feature> getRelevantFeatures(Type type) {
Expression target = getTarget();
Type owningType = target.getOwningType();
return ExpressionUtil.isTransitionGuard(target)?
type == owningType? Collections.singletonList(target):
Collections.singletonList((Feature)getLibraryType(EXPRESSION_GUARD_FEATURE)):
owningType instanceof FeatureValue? Collections.emptyList():
super.getRelevantFeatures(type, skip);
super.getRelevantFeatures(type);
}

@Override
Expand Down
27 changes: 16 additions & 11 deletions org.omg.sysml/src/org/omg/sysml/adapter/FeatureAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -572,10 +572,10 @@ protected void addRedefinitions(Element skip) {
Feature target = getTarget();
Type type = target.getOwningType();
if (type != null) {
int i = getRelevantFeatures(type, skip).indexOf(target);
int i = getRelevantFeatures(type).indexOf(target);
if (i >= 0) {
for (Type general: getGeneralTypes(type, skip)) {
List<? extends Feature> features = getRelevantFeatures(general, skip);
List<? extends Feature> features = getRelevantFeatures(general);
if (i < features.size()) {
Feature redefinedFeature = features.get(i);
if (redefinedFeature != null && redefinedFeature != target) {
Expand Down Expand Up @@ -606,18 +606,23 @@ protected List<Type> getGeneralTypes(Type type, Element skip) {
* Get the relevant Features that may be redefined from the given Type.
* This includes end features, owned features of constructor results, and
* generally parameters.
*
* @satisfies checkFeatureEndRedefinition
*/
protected List<? extends Feature> getRelevantFeatures(Type type, Element skip) {
protected List<? extends Feature> getRelevantFeatures(Type type) {
Feature target = getTarget();
return type == null? Collections.emptyList():
target.isEnd()? TypeUtil.getAllEndFeaturesOf(type):
target.isEnd()? getEndRelevantFeatures(type):
ExpressionUtil.isConstructorResult(target.getOwningType())? getConstructorRelevantFeatures(type):
FeatureUtil.isParameter(target)? getParameterRelevantFeatures(type, skip):
FeatureUtil.isParameter(target)? getParameterRelevantFeatures(type):
Collections.emptyList();
}

/**
* @satisfies checkFeatureEndRedefinition
*/
protected List<? extends Feature> getEndRelevantFeatures(Type type) {
return getTarget().getOwningType() == type? type.getOwnedEndFeature(): type.getEndFeature();
}

/**
* @satisfies checkConstructorExpressionResultFeatureRedefinition
*/
Expand All @@ -640,15 +645,15 @@ protected List<? extends Feature> getConstructorRelevantFeatures(Type type) {
*
* @satisfies checkFeatureResultRedefinition
*/
public List<? extends Feature> getParameterRelevantFeatures(Type type, Element skip) {
public List<? extends Feature> getParameterRelevantFeatures(Type type) {
if (type != null) {
if (FeatureUtil.isResultParameter(getTarget())) {
Feature resultParameter = TypeUtil.getResultParameterOf(type);
if (resultParameter != null) {
return Collections.singletonList(resultParameter);
}
} else {
return getRelevantParameters(type, skip);
return getRelevantParameters(type);
}
}
return Collections.emptyList();
Expand All @@ -657,11 +662,11 @@ public List<? extends Feature> getParameterRelevantFeatures(Type type, Element s
/**
* @satisfies checkFeatureParameterRedefinition
*/
protected List<Feature> getRelevantParameters(Type type, Element skip) {
protected List<Feature> getRelevantParameters(Type type) {
Type owningType = getTarget().getOwningType();
return filterIgnoredParameters(type == owningType?
TypeUtil.getOwnedParametersOf(type):
TypeUtil.getAllParametersOf(type, skip));
TypeUtil.getAllParametersOf(type));
}

protected List<Feature> filterIgnoredParameters(List<Feature> parameters) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021, 2024 Model Driven Solutions, Inc.
* Copyright (c) 2021, 2024, 2025 Model Driven Solutions, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
Expand Down Expand Up @@ -58,7 +58,7 @@ protected String getDefaultSupertype() {
}

@Override
protected List<Multiplicity> getRelevantFeatures(Type type, Element skip) {
protected List<Multiplicity> getRelevantFeatures(Type type) {
return Collections.emptyList();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,6 @@
import java.util.Collections;
import java.util.List;

import org.omg.sysml.lang.sysml.Element;
import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.RequirementDefinition;
import org.omg.sysml.lang.sysml.RequirementUsage;
Expand Down Expand Up @@ -81,14 +80,14 @@ public void addRequirementConstraintSubsetting() {
* @satisfies checkRequirementUsageObjectiveRedefinition
*/
@Override
protected List<? extends Feature> getRelevantFeatures(Type type, Element skip) {
protected List<? extends Feature> getRelevantFeatures(Type type) {
RequirementUsage target = getTarget();
return UsageUtil.isObjective(getTarget())?
Collections.singletonList(
type == target.getOwningType()?
UsageUtil.getOwnedObjectiveRequirementOf(type):
UsageUtil.getObjectiveRequirementOf(type)):
super.getRelevantFeatures(type, skip);
super.getRelevantFeatures(type);
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2022 Siemens AG
* Copyright (c) 2022 Model Driven Solutions, Inc.
* Copyright (c) 2022, 2025 Model Driven Solutions, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
Expand All @@ -22,25 +22,12 @@

package org.omg.sysml.delegate.setting;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.omg.sysml.lang.sysml.Behavior;
import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.util.NonNotifyingEObjectEList;
import org.omg.sysml.util.TypeUtil;

public class Behavior_parameter_SettingDelegate extends BasicDerivedListSettingDelegate {
public class Behavior_parameter_SettingDelegate extends Type_directedFeature_SettingDelegate {

public Behavior_parameter_SettingDelegate(EStructuralFeature eStructuralFeature) {
super(eStructuralFeature);
}

@Override
protected EList<?> basicGet(InternalEObject owner) {
EList<Feature> parameters = new NonNotifyingEObjectEList<>(Feature.class, owner, eStructuralFeature.getFeatureID());
parameters.addAll(TypeUtil.getAllParametersOf((Behavior)owner));
return parameters;
}

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2022 Siemens AG
* Copyright (c) 2022 Model Driven Solutions, Inc.
* Copyright (c) 2022, 2025 Model Driven Solutions, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
Expand All @@ -22,25 +22,12 @@

package org.omg.sysml.delegate.setting;

import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.Step;
import org.omg.sysml.util.NonNotifyingEObjectEList;
import org.omg.sysml.util.TypeUtil;

public class Step_parameter_SettingDelegate extends BasicDerivedListSettingDelegate {
public class Step_parameter_SettingDelegate extends Type_directedFeature_SettingDelegate {

public Step_parameter_SettingDelegate(EStructuralFeature eStructuralFeature) {
super(eStructuralFeature);
}

@Override
protected EList<?> basicGet(InternalEObject owner) {
EList<Feature> parameters = new NonNotifyingEObjectEList<>(Feature.class, owner, eStructuralFeature.getFeatureID());
parameters.addAll(TypeUtil.getAllParametersOf((Step)owner));
return parameters;
}

}
54 changes: 3 additions & 51 deletions org.omg.sysml/src/org/omg/sysml/util/TypeUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -208,63 +208,15 @@ public static List<Feature> getPublicFeaturesOf(Type type) {
}

public static List<Feature> getAllEndFeaturesOf(Type type) {
return getAllEndFeaturesOf(type, new HashSet<>());
}

private static List<Feature> getAllEndFeaturesOf(Type type, Set<Type> visited) {
visited.add(type);
List<Feature> ends = getOwnedEndFeaturesOf(type);
int n = ends.size();
for (Type general: getGeneralTypesOf(type)) {
if (general != null && !visited.contains(general)) {
List<Feature> inheritedEnds = getAllEndFeaturesOf(general, visited);
if (inheritedEnds.size() > n) {
ends.addAll(inheritedEnds.subList(n, inheritedEnds.size()));
}
}
}
return ends;
return type == null? Collections.emptyList(): type.getEndFeature();
}

public static List<Feature> getOwnedEndFeaturesOf(Type type) {
return type == null? Collections.emptyList():
type.getOwnedFeature().stream().
filter(Feature::isEnd).
collect(Collectors.toList());
return type == null? Collections.emptyList(): type.getOwnedEndFeature();
}

public static List<Feature> getAllParametersOf(Type type) {
return getAllParametersOf(type, null);
}

public static List<Feature> getAllParametersOf(Type type, Element skip) {
return getAllParametersOf(type, new HashSet<>(), skip);
}

private static List<Feature> getAllParametersOf(Type type, Set<Type> visited, Element skip) {
visited.add(type);
List<Feature> parameters = getOwnedParametersOf(type);
parameters.removeIf(FeatureUtil::isResultParameter);
int n = parameters.size();
Feature resultParameter = getOwnedResultParameterOf(type);
for (Type general: TypeUtil.getGeneralTypesOf(type, false, skip)) {
if (general != null && !visited.contains(general)) {
List<Feature> inheritedParameters = getAllParametersOf(general, visited, skip);
if (resultParameter == null) {
resultParameter = inheritedParameters.stream().
filter(FeatureUtil::isResultParameter).
findFirst().orElse(null);
}
inheritedParameters.removeIf(FeatureUtil::isResultParameter);
if (inheritedParameters.size() > n) {
parameters.addAll(inheritedParameters.subList(n, inheritedParameters.size()));
}
}
}
if (resultParameter != null) {
parameters.add(resultParameter);
}
return parameters;
return type.getDirectedFeature();
}

public static List<Feature> getOwnedParametersOf(Type type) {
Expand Down
Loading