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
3 changes: 3 additions & 0 deletions kerml/src/examples/Simple Tests/Behaviors.kerml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@ package Behaviors {
class C {
var z = A().y;
step a : A;
step b : B;
binding z = a.y;
flow a.y to b.x1;
}
abstract flow msg of C;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ XPECT_SETUP org.omg.kerml.xpect.tests.parsing.KerMLParsingTest
File {from ="/library/Base.kerml"}
File {from ="/library/Links.kerml"}
File {from ="/library/Occurrences.kerml"}
File {from ="/library/Objects.kerml"}
File {from ="/library/Performances.kerml"}
File {from ="/library/Transfers.kerml"}
File {from ="/library/ControlFunctions.kerml"}
}
Workspace {
Expand All @@ -15,7 +17,9 @@ XPECT_SETUP org.omg.kerml.xpect.tests.parsing.KerMLParsingTest
File {from ="/library/Base.kerml"}
File {from ="/library/Links.kerml"}
File {from ="/library/Occurrences.kerml"}
File {from ="/library/Objects.kerml"}
File {from ="/library/Performances.kerml"}
File {from ="/library/Transfers.kerml"}
File {from ="/library/ControlFunctions.kerml"}
}
}
Expand All @@ -34,6 +38,14 @@ package Behaviors {
}
behavior B specializes A {
in x1;
out y1;
out var y1;
}
class C {
var z = A().y;
step a : A;
step b : B;
binding z = a.y;
flow a.y to b.x1;
}
abstract flow msg of C;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ true,checkItemDefinitionSpecialization,ItemDefinition,Items::Item,Package,Owning
true,checkPartDefinitionSpecialization,PartDefinition,Parts::Part,Package,OwningMembership
true,checkPortDefinitionSpecialization,PortDefinition,Ports::Port,Package,OwningMembership
true,checkConnectionDefinitionSpecialization,ConnectionDefinition,Connections::Connection,Package,OwningMembership
false,checkFlowDefinitionSpecialization,FlowDefinition,Flows::MessageAction,Package,OwningMembership
true,checkFlowDefinitionSpecialization,FlowDefinition,Flows::MessageAction,Package,OwningMembership
true,checkInterfaceDefinitionSpecialization,InterfaceDefinition,Interfaces::Interface,Package,OwningMembership
true,checkAllocationDefinitionSpecialization,AllocationDefinition,Allocations::Allocation,Package,OwningMembership
true,checkActionDefinitionSpecialization,ActionDefinition,Actions::Action,Package,OwningMembership
Expand Down Expand Up @@ -62,6 +62,8 @@ true,checkIfActionUsageSubactionSpecialization,IfActionUsage,Actions::Action::if
true,checkWhileLoopActionUsageSubactionSpecialization,WhileLoopActionUsage,Actions::Action::whileLoops,ActionUsage,FeatureMembership
true,checkForLoopActionUsageSubactionSpecialization,ForLoopActionUsage,Actions::Action::forLoops,ActionUsage,FeatureMembership
true,checkPerformActionUsageSpecialization,PerformActionUsage,Parts::Part::performedActions,PartUsage,FeatureMembership
true,checkTerminateActionUsageSubactionSpecialization,TerminateActionUsage,Actions::Action::terminateSubactions,ActionDefinition,FeatureMembership
true,checkTerminateActionUsageSubactionSpecialization,TerminateActionUsage,Actions::Action::terminateSubactions,ActionUsage,FeatureMembership
true,checkPerformActionUsageSpecialization,PerformActionUsage,Parts::Part::performedActions,PartDefinition,FeatureMembership
true,checkStateUsageSpecialization,StateUsage,States::stateActions,Package,OwningMembership
true,checkStateUsageExclusiveStateSpecialization,StateUsage,States::StateAction::exclusiveStates,StateUsage,FeatureMembership
Expand All @@ -86,20 +88,20 @@ true,checkConcernUsageFramedConcernSpecialization,ConcernUsage,Requirements::Req
true,checkCaseUsageSpecialization,CaseUsage,Cases::cases,Package,OwningMembership
true,checkCaseUsageSubcaseSpecialization,CaseUsage,Cases::Case::subcases,CaseUsage,FeatureMembership
true,checkAnalysisCaseUsageSpecialization,AnalysisCaseUsage,AnalysisCases::analysisCases,Package,OwningMembership
false,checkAnalysisCaseUsageSubAnalysisCaseSpecialization,AnalysisCaseUsage,AnalysisCases::AnalysisCase::subAnalysisCases,AnalysisCaseUsage,FeatureMembership
false,checkAnalysisCaseUsageSubAnalysisCaseSpecialization,AnalysisCaseUsage,AnalysisCases::AnalysisCase::subAnalysisCases,AnalysisCaseDefinition,FeatureMembership
true,checkAnalysisCaseUsageSubAnalysisCaseSpecialization,AnalysisCaseUsage,AnalysisCases::AnalysisCase::subAnalysisCases,AnalysisCaseUsage,FeatureMembership
true,checkAnalysisCaseUsageSubAnalysisCaseSpecialization,AnalysisCaseUsage,AnalysisCases::AnalysisCase::subAnalysisCases,AnalysisCaseDefinition,FeatureMembership
true,checkVerificationCaseUsageSpecialization,VerificationCaseUsage,VerificationCases::verificationCases,Package,OwningMembership
false,checkVerificationCaseUsageSubVerificationCaseSpecialization,VerificationCaseUsage,VerificationCases::VerificationCase::subVerificationCases,VerificationCaseUsage,FeatureMembership
false,checkVerificationCaseUsageSubVerificationCaseSpecialization,VerificationCaseUsage,VerificationCases::VerificationCase::subVerificationCases,VerificationCaseDefinition,FeatureMembership
true,checkVerificationCaseUsageSubVerificationCaseSpecialization,VerificationCaseUsage,VerificationCases::VerificationCase::subVerificationCases,VerificationCaseUsage,FeatureMembership
true,checkVerificationCaseUsageSubVerificationCaseSpecialization,VerificationCaseUsage,VerificationCases::VerificationCase::subVerificationCases,VerificationCaseDefinition,FeatureMembership
true,checkUseCaseUsageSpecialization,UseCaseUsage,UseCases::useCases,Package,OwningMembership
true,checkUseCaseUsageSubUseCaseSpecialization,UseCaseUsage,UseCases::UseCase::subUseCases,UseCaseUsage,FeatureMembership
true,checkUseCaseUsageSubUseCaseSpecialization,UseCaseUsage,UseCases::UseCase::subUseCases,UseCaseDefinition,FeatureMembership
false,checkIncludeUseCaseUsageSpecialization,IncludeUseCaseUsage,UseCases::UseCase::includedUseCases,UseCaseUsage,FeatureMembership
false,checkIncludeUseCaseUsageSpecialization,IncludeUseCaseUsage,UseCases::UseCase::includedUseCases,UseCaseDefinition,FeatureMembership
true,checkIncludeUseCaseUsageSpecialization,IncludeUseCaseUsage,UseCases::UseCase::includedUseCases,UseCaseUsage,FeatureMembership
true,checkIncludeUseCaseUsageSpecialization,IncludeUseCaseUsage,UseCases::UseCase::includedUseCases,UseCaseDefinition,FeatureMembership
true,checkViewUsageSpecialization,ViewUsage,Views::views,Package,OwningMembership
true,checkViewUsageSubviewSpecialization,ViewUsage,Views::View::subviews,ViewUsage,FeatureMembership
true,checkViewUsageSubviewSpecialization,ViewUsage,Views::View::subviews,ViewDefinition,FeatureMembership
false,checkViewpointUsageSpecialization,ViewpointUsage,Views::viewpoints,Package,OwningMembership
true,checkViewpointUsageSpecialization,ViewpointUsage,Views::viewpointChecks,Package,OwningMembership
true,checkViewpointUsageViewpointSatisfactionSpecialization,ViewpointUsage,Views::View::viewpointSatisfactions,ViewDefinition,FeatureMembership
true,checkViewpointUsageViewpointSatisfactionSpecialization,ViewpointUsage,Views::View::viewpointSatisfactions,ViewUsage,FeatureMembership
true,checkRenderingUsageSpecialization,RenderingUsage,Views::renderings,Package,OwningMembership
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,12 @@ action def ControlNodeTest {
action B1 {
in b;
}
then M;

action B2 {
in b;
}
then M;

merge M;
}
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ action def DecisionTest {
if x > 1 then A2;
else A3;

then decide;
then decide D;
if true then A1;
if false then A2;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,12 @@ package UseCaseTest {
part system : System {
include uc2;
perform u;
use case uc1 : UC1;
}

use case uc3 {
include u;
include system.uc1;
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021, 2023 Model Driven Solutions, Inc.
* Copyright (c) 2021, 2023, 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 @@ -44,8 +44,9 @@ protected String getSubactionType() {
}

public boolean isSubAnalysisCase() {
Type owningType = getTarget().getOwningType();
return isNonEntryExitComposite() &&
AnalysisCaseUsage target = getTarget();
Type owningType = target.getOwningType();
return target.isComposite() &&
(owningType instanceof AnalysisCaseDefinition || owningType instanceof AnalysisCaseUsage);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,16 +48,10 @@ protected String getSubactionType() {
}

public boolean isSubcalculation() {
/*
* TODO: Update checkCalculationUsageSubcalculationSpecialization
*
* isNonEntryExitComposite check is not part of the OCL
* See SYSML12-298
*/
CalculationUsage target = getTarget();
Type owningType = target.getOwningType();
return isNonEntryExitComposite() &&
owningType instanceof CalculationDefinition || owningType instanceof CalculationUsage;
return target.isComposite() &&
(owningType instanceof CalculationDefinition || owningType instanceof CalculationUsage);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,9 @@ protected String getSubactionType() {
}

public boolean isSubcase() {
/*
* TODO: Update checkCaseUsageSubcaseSpecialization
*
* nonEntryExit part of the check is not reflected of the OCL
* See SYSML21-298
*/
CaseUsage target = getTarget();
Type owningType = target.getOwningType();
return isNonEntryExitComposite() &&
return target.isComposite() &&
(owningType instanceof CaseDefinition || owningType instanceof CaseUsage);
}

Expand Down
10 changes: 10 additions & 0 deletions org.omg.sysml/src/org/omg/sysml/adapter/ElementAdapterFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public ElementAdapter caseActionUsage(ActionUsage element) {
return new ActionUsageAdapter(element);
}

@Override
public ElementAdapter caseAnalysisCaseUsage(AnalysisCaseUsage element) {
return new AnalysisCaseUsageAdapter(element);
}

@Override
public ElementAdapter caseAnnotatingElement(AnnotatingElement element) {
return new AnnotatingElementAdapter(element);
Expand Down Expand Up @@ -597,6 +602,11 @@ public ElementAdapter caseUseCaseUsage(UseCaseUsage element) {
return new UseCaseUsageAdapter(element);
}

@Override
public ElementAdapter caseVerificationCaseUsage(VerificationCaseUsage element) {
return new VerificationCaseUsageAdapter(element);
}

@Override
public ElementAdapter caseViewUsage(ViewUsage element) {
return new ViewUsageAdapter(element);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@

import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.FeatureChainExpression;
import org.omg.sysml.lang.sysml.FeatureDirectionKind;
import org.omg.sysml.lang.sysml.SysMLFactory;
import org.omg.sysml.lang.sysml.SysMLPackage;
import org.omg.sysml.util.FeatureUtil;
Expand All @@ -42,19 +43,21 @@ public FeatureChainExpression getTarget() {

/**
* @satisfies checkFeatureChainExpressionResultSpecialization
*
* TODO: Revise to explicitly get first "in" parameter, to more closely match OCL.
*/
@Override
protected void addResultTyping() {
FeatureChainExpression target = getTarget();
Feature result = target.getResult();
Feature sourceTarget = target.sourceTargetFeature();
if (result != null && sourceTarget != null) {
Feature sourceParameter = TypeUtil.getOwnedParameterOf(target, 0, Feature.class);
TypeUtil.addImplicitGeneralTypeTo(result,
SysMLPackage.eINSTANCE.getSubsetting(),
FeatureUtil.chainFeatures(sourceParameter, sourceTarget));
Feature sourceParameter = target.getOwnedFeature().stream().
filter(param->param.getDirection() == FeatureDirectionKind.IN).
findFirst().orElse(null);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could use ifPresent on the Optional here

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, but whenever I do that, it seems clunky to then have to call get() to get the actual value. I'm an old school "check for null" guy. 😉

if (sourceParameter != null) {
TypeUtil.addImplicitGeneralTypeTo(result,
SysMLPackage.eINSTANCE.getSubsetting(),
FeatureUtil.chainFeatures(sourceParameter, sourceTarget));
}
}
}

Expand Down
11 changes: 10 additions & 1 deletion org.omg.sysml/src/org/omg/sysml/adapter/FlowAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,18 @@ public void addDefaultGeneralType() {
}
}

/**
* @satisfies checkFlowSpecialization
* @satisfies checkFlowWithEndsSpecialization
*/
@Override
protected String getDefaultSupertype() {
return getDefaultSupertype("base");
return isFlowTransfer()? getDefaultSupertype("flow"):
getDefaultSupertype("base");
}

protected boolean isFlowTransfer() {
return !getTarget().getOwnedEndFeature().isEmpty();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021, 2022 Model Driven Solutions, Inc.
* Copyright (c) 2021, 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 @@ -25,6 +25,8 @@
import org.omg.sysml.lang.sysml.CaseUsage;
import org.omg.sysml.lang.sysml.IncludeUseCaseUsage;
import org.omg.sysml.lang.sysml.Type;
import org.omg.sysml.lang.sysml.UseCaseDefinition;
import org.omg.sysml.lang.sysml.UseCaseUsage;

public class IncludeUseCaseUsageAdapter extends UseCaseUsageAdapter {

Expand All @@ -38,12 +40,18 @@ public IncludeUseCaseUsage getTarget() {
}

/**
* TODO: checkIncludeUseCaseUsageSpecialization
*
* TODO: Rename checkIncludeUseCaseSpecialization
* See SYSML21-299
*/

/**
* @satisfies checkIncludeUseCaseUsageSpecialization
*/
public boolean isSubUseCase() {
Type owningType = getTarget().getOwningType();
return owningType instanceof UseCaseDefinition || owningType instanceof UseCaseUsage;
}

/**
* @satisfies checkPerformActionUsageSpecialization
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@

public class IndexExpressionAdapter extends OperatorExpressionAdapter {

public static final String ARRAY_TYPE = "Collections::Array";
public static final String SCALAR_VALUE_TYPE = "ScalarValues::ScalarValue";
public static final String COLLECTIONS_TYPE = "Collections::Collection";

public IndexExpressionAdapter(IndexExpression element) {
super(element);
Expand All @@ -55,16 +54,14 @@ protected void addResultTyping() {
Expression seqArgument = arguments.get(0);
ElementUtil.transform(seqArgument);
Feature seqResult = seqArgument.getResult();
Type arrayType = getLibraryType(ARRAY_TYPE);
Type scalarValueType = getLibraryType(SCALAR_VALUE_TYPE);
Type collectionType = getLibraryType(COLLECTIONS_TYPE);
/*
* TODO: Update checkIndexExpressionResultSpecialization
* See KERML11-69.
*
* TODO: Generalize to handle all types other than Collection types?
* TODO: Replace target with seqResult in specialization checks.
*/
if (!TypeUtil.specializes(target, arrayType) || TypeUtil.specializes(target, scalarValueType)) {
*
* OCL currently only checks for Array type, not any Collection type.
* See KERML11-69
*/
if (!TypeUtil.specializes(seqResult, collectionType)) {
Feature resultFeature = target.getResult();
if (resultFeature != null && seqResult != null) {
TypeUtil.addImplicitGeneralTypeTo(resultFeature, SysMLPackage.eINSTANCE.getSubsetting(), seqResult);
Expand Down
7 changes: 4 additions & 3 deletions org.omg.sysml/src/org/omg/sysml/adapter/PartUsageAdapter.java
Original file line number Diff line number Diff line change
Expand Up @@ -62,9 +62,10 @@ protected boolean isRequirementActor() {

protected boolean isRequirementStakeholder() {
/*
* TODO: Update checkPartUsageStakeholderSpecialization?
*
* OCL doesn't require the owningType to be ReqDef or ReqUsage
* Note: checkPartUsageStakeholderSpecialization OCL doesn't explicitly require the owningType
* to be a RequirmentDefinition or RequirementUsage. However, a valid stakeholder must be owned
* by a RequirementDefinition or RequirementUsage and, if it isn't the implied subsetting won't
* be valid, so don't add it.
*/
PartUsage target = getTarget();
Type owningType = target.getOwningType();
Expand Down
Loading