Skip to content

Commit 22d16d7

Browse files
authored
Merge branch 'master' into ST6RI-925
2 parents 97a9854 + f61a1df commit 22d16d7

18 files changed

Lines changed: 129 additions & 112 deletions

File tree

kerml/src/examples/Simple Tests/Filtering.kerml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,17 @@ package Filtering {
2323

2424
package UpperLevelApprovals {
2525
private import DesignModel::**;
26-
filter Annotations::ApprovalAnnotation::approved and
27-
Annotations::ApprovalAnnotation::level > 1;
26+
filter (as Annotations::ApprovalAnnotation).approved and
27+
(as Annotations::ApprovalAnnotation).level > 1;
2828

2929
struct Test :> System;
3030
}
3131

3232
package UpperLevelApprovals1 {
3333
private import Annotations::**;
34-
private import DesignModel::**[@Structure][approved and level > 1];
34+
private import DesignModel::**[@Structure]
35+
[(as Annotations::ApprovalAnnotation).approved and
36+
(as Annotations::ApprovalAnnotation).level > 1];
3537

3638
struct Test :> System;
3739
}

org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/imports/local/Import_Filtered.kerml.xt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,7 @@ package Import_Filtered {
237237
}
238238

239239
package 'Mandatory Features_true_1' {
240-
public import vehicle1_c1::**[Safety::isMandatory];
240+
public import vehicle1_c1::**[(as Safety).isMandatory];
241241
classifier b :> seatBelt;
242242

243243
// XPECT errors --> "Couldn't resolve reference to Classifier 'alarm'." at "alarm"
@@ -259,7 +259,7 @@ package Import_Filtered {
259259
}
260260

261261
package 'Mandatory Features_true_2' {
262-
public import vehicle1_c1::**[Safety::isMandatory == true];
262+
public import vehicle1_c1::**[(as Safety).isMandatory == true];
263263
classifier b :> seatBelt;
264264

265265
// XPECT errors --> "Couldn't resolve reference to Classifier 'alarm'." at "alarm"
@@ -281,7 +281,7 @@ package Import_Filtered {
281281
}
282282

283283
package 'Mandatory Features_false' {
284-
public import vehicle1_c1::**[Safety::isMandatory == false];
284+
public import vehicle1_c1::**[(as Safety).isMandatory == false];
285285
classifier j :> antilockBrakes;
286286

287287
// XPECT errors --> "Couldn't resolve reference to Classifier 'alarm'." at "alarm"

org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/validation/MetadataTests_MetadataFeature_invalid.kerml.xt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -50,12 +50,12 @@ package MetadataFeatureTest {
5050

5151
function f { in x; return : ScalarValues::Boolean; }
5252

53-
// XPECT errors --> "Must be model-level evaluable" at "filter f(A::y);"
54-
filter f(A::y);
55-
// XPECT errors --> "Must be model-level evaluable" at "filter ~A::z;"
56-
filter ~A::z;
57-
// XPECT errors --> "Must be model-level evaluable" at "filter A::y->ControlFunctions::collect {in x; x};"
58-
filter A::y->ControlFunctions::collect {in x; x};
53+
// XPECT errors --> "Must be model-level evaluable" at "filter f((as A).y);"
54+
filter f((as A).y);
55+
// XPECT errors --> "Must be model-level evaluable" at "filter ~(as A).z;"
56+
filter ~(as A).z;
57+
// XPECT errors --> "Must be model-level evaluable" at "filter (as A).y->ControlFunctions::collect {in x; x};"
58+
filter (as A).y->ControlFunctions::collect {in x; x};
5959
// XPECT errors --> "Must have a Boolean result" at "filter new A(null, 1, "", false);"
6060
filter new A(null, 1, "", false);
6161

@@ -66,8 +66,8 @@ package MetadataFeatureTest {
6666
// XPECT errors --> "Must be model-level evaluable" at "= ~3"
6767
x = ~3;
6868
y = "e";
69-
// XPECT errors --> "Must be model-level evaluable" at "= f(A::y)"
70-
z = f(A::y);
69+
// XPECT errors --> "Must be model-level evaluable" at "= f((as A).y)"
70+
z = f((as A).y);
7171
u {
7272
v = 1;
7373
// XPECT errors --> "Must redefine an owning-type feature" at "bad;"

org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2022, 2025 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2022, 2025, 2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -24,6 +24,7 @@
2424
import static org.junit.Assert.assertArrayEquals;
2525
import static org.junit.Assert.assertEquals;
2626
import static org.junit.Assert.assertFalse;
27+
import static org.junit.Assert.assertNotNull;
2728
import static org.junit.Assert.assertNull;
2829
import static org.junit.Assert.assertTrue;
2930

@@ -36,6 +37,7 @@
3637
import org.omg.sysml.lang.sysml.ActionUsage;
3738
import org.omg.sysml.lang.sysml.AttributeUsage;
3839
import org.omg.sysml.lang.sysml.Comment;
40+
import org.omg.sysml.lang.sysml.ConnectionDefinition;
3941
import org.omg.sysml.lang.sysml.Definition;
4042
import org.omg.sysml.lang.sysml.Documentation;
4143
import org.omg.sysml.lang.sysml.Element;
@@ -383,5 +385,35 @@ public void testFeatureMembership() throws Exception {
383385

384386
private boolean testFeatureOwningTypes(Type type) {
385387
return type.getFeatureMembership().stream().map(FeatureMembership::getOwningType).allMatch(t->type.specializes(t));
388+
389+
public final String crossFeatureTest =
390+
"package Test {"
391+
+ " part def A {"
392+
+ " ref b : B;"
393+
+ " }"
394+
+ " part def B;"
395+
+ " connection def C {"
396+
+ " end [0..1] ref end1 : A;"
397+
+ " end ref end2 : B crosses end1.b;"
398+
+ " }"
399+
+ "}";
400+
401+
@Test
402+
public void testCrossFeature() throws Exception {
403+
SysMLInteractive instance = getSysMLInteractiveInstance();
404+
SysMLInteractiveResult result = instance.process(crossFeatureTest);
405+
Element root = result.getRootElement();
406+
Namespace test = (Namespace)((Namespace)root).getOwnedMember().get(0);
407+
Definition a = (Definition)test.getOwnedMember().get(0);
408+
Usage a_b = a.getOwnedUsage().get(0);
409+
ConnectionDefinition c = (ConnectionDefinition)test.getOwnedMember().get(2);
410+
List<Feature> ends = c.getAssociationEnd();
411+
Usage end1 = (Usage)ends.get(0);
412+
Usage end2 = (Usage)ends.get(1);
413+
Feature ownedCrossFeature = end1.ownedCrossFeature();
414+
415+
assertNotNull("end1 owned cross feature", ownedCrossFeature);
416+
assertEquals("end1 cross feature", end1.ownedCrossFeature(), end1.getCrossFeature());
417+
assertEquals("end2 cross feature", a_b, end2.getCrossFeature().getFeatureTarget());
386418
}
387419
}

org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,7 @@ public void testFeatureReferenceEvaluation() throws Exception {
371371

372372
assertEquals(1, evaluateIntegerValue(instance,
373373
checkAnnotatingFeature(instance, "Annotation", "x"),
374-
"Annotation::a"));
374+
"(as Annotation).a"));
375375
}
376376

377377
@Test
@@ -385,7 +385,7 @@ public void testEnumeratedValueEvaluation() throws Exception {
385385
assertEquals(instance.resolve("E::e"),
386386
evaluateSingleValue(instance,
387387
checkAnnotatingFeature(instance, "Annotation", "x"),
388-
"Annotation::a"));
388+
"(as Annotation).a"));
389389
}
390390

391391
@Test
@@ -408,8 +408,8 @@ public void testIsTypeEvaluation() throws Exception {
408408
"attribute x {@Annotation{a = E::e; b = 2;}}");
409409

410410
MetadataFeature feature = checkAnnotatingFeature(instance, "Annotation", "x");
411-
assertTrue(evaluateBooleanValue(instance, feature, "Annotation::a istype E"));
412-
assertTrue(evaluateBooleanValue(instance, feature, "Annotation::b istype ScalarValues::Integer"));
411+
assertTrue(evaluateBooleanValue(instance, feature, "(as Annotation).a istype E"));
412+
assertTrue(evaluateBooleanValue(instance, feature, "(as Annotation).b istype ScalarValues::Integer"));
413413
}
414414

415415
@Test

org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/ElementFilter.sysml.xt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,6 @@ package ElementFilterTest {
8585
}
8686

8787
package 'Mandatory Features' {
88-
public import vehicle1_c1::**[@Safety and PartInfo::isMandatory];
88+
public import vehicle1_c1::**[@Safety and (as PartInfo).isMandatory];
8989
}
9090
}

org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/MetadataUsage_Invalid.sysml.xt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,12 @@ package Test {
6262

6363
calc def f { in x : ScalarValues::Boolean; }
6464

65-
// XPECT errors --> "Must be model-level evaluable" at "filter f(A::z);"
66-
filter f(A::z);
67-
// XPECT errors --> "Must be model-level evaluable" at "filter ~A::z;"
68-
filter ~A::z;
69-
// XPECT errors --> "Must be model-level evaluable" at "filter A::y->ControlFunctions::collect {in ref x; x};"
70-
filter A::y->ControlFunctions::collect {in ref x; x};
65+
// XPECT errors --> "Must be model-level evaluable" at "filter f((as A).z);"
66+
filter f((as A).z);
67+
// XPECT errors --> "Must be model-level evaluable" at "filter ~(as A).z;"
68+
filter ~(as A).z;
69+
// XPECT errors --> "Must be model-level evaluable" at "filter (as A).y->ControlFunctions::collect {in ref x; x};"
70+
filter (as A).y->ControlFunctions::collect {in ref x; x};
7171
// XPECT errors --> "Must have a Boolean result" at "filter new A(null, 1, "", false);"
7272
filter new A(null, 1, "", false);
7373

@@ -82,8 +82,8 @@ package Test {
8282
// XPECT errors --> "Must be model-level evaluable" at "= ~3"
8383
x = ~3;
8484
y = E::e;
85-
// XPECT errors --> "Must be model-level evaluable" at "= f(A::z)"
86-
z = f(A::z);
85+
// XPECT errors --> "Must be model-level evaluable" at "= f((as A).z)"
86+
z = f((as A).z);
8787
u {
8888
v = 1;
8989
// XPECT errors --> "Must redefine an owning-type feature" at "bad;"

org.omg.sysml/src/org/omg/sysml/adapter/AssignmentActionUsageAdapter.java

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021, 2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -22,7 +22,6 @@
2222
package org.omg.sysml.adapter;
2323

2424
import org.omg.sysml.lang.sysml.AssignmentActionUsage;
25-
import org.omg.sysml.util.TypeUtil;
2625

2726
public class AssignmentActionUsageAdapter extends ActionUsageAdapter {
2827

@@ -34,18 +33,4 @@ public AssignmentActionUsage getTarget() {
3433
return (AssignmentActionUsage)super.getTarget();
3534
}
3635

37-
/**
38-
* @satisfies checkAssignmentActionUsageReferentRedefinition
39-
* @satisfies checkAssignmentActionUsageAccessedFeatureRedefinition
40-
* @satisfies checkAssignmentActionUsageStartingAtRedefinition
41-
*/
42-
protected void addTargetRedefinitions() {
43-
AssignmentActionUsage target = getTarget();
44-
addFeatureWriteTypes(TypeUtil.getOwnedParametersOf(target), target.getReferent());
45-
}
46-
47-
public void doTransform() {
48-
super.doTransform();
49-
addTargetRedefinitions();
50-
}
5136
}

org.omg.sysml/src/org/omg/sysml/adapter/FeatureAdapter.java

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021-2025 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021-2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -35,6 +35,7 @@
3535
import org.eclipse.emf.common.util.EList;
3636
import org.eclipse.emf.ecore.EClass;
3737
import org.eclipse.emf.ecore.InternalEObject;
38+
import org.omg.sysml.lang.sysml.AssignmentActionUsage;
3839
import org.omg.sysml.lang.sysml.Association;
3940
import org.omg.sysml.lang.sysml.BindingConnector;
4041
import org.omg.sysml.lang.sysml.Connector;
@@ -216,7 +217,6 @@ protected Feature getBoundValueResult() {
216217
* @satisfies checkFeatureCrossingSpecialization
217218
* @satisfies checkFeatureOwnedCrossFeatureSpecialization
218219
* @satisfies checkFeatureOwnedCrossFeatureRedefinitionSpecialization
219-
*
220220
*/
221221
@Override
222222
public void addDefaultGeneralType() {
@@ -592,10 +592,47 @@ public void addComputedRedefinitions(Element skip) {
592592
// NOTE: Set flag before adding redefinitions, to avoid possible infinite
593593
// recursion if computeImplicitGeneralTypes is called again on this Feature.
594594
isComputeRedefinitions = false;
595+
addFeatureWriteTypes();
595596
addRedefinitions(skip);
596597
}
597598
}
598599

600+
/**
601+
* @satisfies checkAssignmentActionUsageReferentRedefinition
602+
* @satisfies checkAssignmentActionUsageAccessedFeatureRedefinition
603+
* @satisfies checkAssignmentActionUsageStartingAtRedefinition
604+
*/
605+
protected void addFeatureWriteTypes() {
606+
Feature feature = getTarget();
607+
if (isStartingAtFeature(feature)) {
608+
addDefaultGeneralType(SysMLPackage.eINSTANCE.getRedefinition(), getDefaultSupertype("startingAt"));
609+
} else if (isAccessedFeature(feature)) {
610+
addDefaultGeneralType(SysMLPackage.eINSTANCE.getRedefinition(), getDefaultSupertype("accessedFeature"));
611+
AssignmentActionUsage actionUsage = (AssignmentActionUsage)(feature.getOwner().getOwner().getOwner());
612+
Feature referent = actionUsage.getReferent();
613+
if (referent != null) {
614+
addImplicitGeneralType(SysMLPackage.eINSTANCE.getRedefinition(), referent);
615+
}
616+
}
617+
}
618+
619+
public static boolean isStartingAtFeature(Feature feature) {
620+
Type owningType = feature.getOwningType();
621+
if (owningType instanceof Feature) {
622+
Type actionUsage = ((Feature)owningType).getOwningType();
623+
if (actionUsage instanceof AssignmentActionUsage) {
624+
return ((AssignmentActionUsage)actionUsage).getParameter().indexOf(owningType) == 0;
625+
}
626+
}
627+
return false;
628+
}
629+
630+
public static boolean isAccessedFeature(Feature feature) {
631+
Type owningType = feature.getOwningType();
632+
return owningType instanceof Feature && isStartingAtFeature((Feature)owningType) &&
633+
owningType.getOwnedFeature().indexOf(feature) == 0;
634+
}
635+
599636
/**
600637
* Compute relevant Redefinitions and add them to this Feature. By default, if this Feature is relevant for its
601638
* owning Type, then it is paired with relevant Features in the same position in Generalizations of the
@@ -789,27 +826,6 @@ protected BindingConnector addBindingConnector(Collection<Type> featuringTypes,
789826
return connector;
790827
}
791828

792-
protected void addFeatureWriteTypes(List<Feature> parameters, Feature referent) {
793-
if (!parameters.isEmpty()) {
794-
Feature targetFeature = parameters.get(0);
795-
List<Feature> features = targetFeature.getOwnedFeature();
796-
if (!features.isEmpty()) {
797-
Feature startingAtFeature = features.get(0);
798-
TypeUtil.addDefaultGeneralTypeTo(startingAtFeature, SysMLPackage.eINSTANCE.getRedefinition(), getDefaultSupertype("startingAt"));
799-
TypeUtil.setIsAddImplicitGeneralTypesFor(startingAtFeature, false);
800-
features = startingAtFeature.getOwnedFeature();
801-
if (!features.isEmpty()) {
802-
Feature accessedFeature = features.get(0);
803-
TypeUtil.addDefaultGeneralTypeTo(accessedFeature, SysMLPackage.eINSTANCE.getRedefinition(), getDefaultSupertype("accessedFeature"));
804-
if (referent != null) {
805-
TypeUtil.addImplicitGeneralTypeTo(accessedFeature, SysMLPackage.eINSTANCE.getRedefinition(), referent);
806-
}
807-
TypeUtil.setIsAddImplicitGeneralTypesFor(accessedFeature, false);
808-
}
809-
}
810-
}
811-
}
812-
813829
/**
814830
* @satisfies checkFeatureValueBindingConnector
815831
*/

org.omg.sysml/src/org/omg/sysml/adapter/FeatureReferenceExpressionAdapter.java

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*******************************************************************************
22
* SysML 2 Pilot Implementation
3-
* Copyright (c) 2021, 2022 Model Driven Solutions, Inc.
3+
* Copyright (c) 2021, 2022, 2026 Model Driven Solutions, Inc.
44
*
55
* This program is free software: you can redistribute it and/or modify
66
* it under the terms of the GNU Lesser General Public License as published by
@@ -63,19 +63,11 @@ protected boolean isInFilterExpression() {
6363
* @satisfies checkFeatureReferenceExpressionBindingConnector
6464
*/
6565
protected void addReferenceConnector() {
66-
/*
67-
* TODO: Update checkFeatureReferenceExpressionBindingConnector?
68-
*
69-
* OCL does not include !isInFilterExpression check.
70-
*
71-
*/
72-
if (!isInFilterExpression()) {
73-
FeatureReferenceExpression target = getTarget();
74-
Feature referent = target.getReferent();
75-
Feature result = target.getResult();
76-
if (referent != null && result != null) {
77-
addBindingConnector(referent, result);
78-
}
66+
FeatureReferenceExpression target = getTarget();
67+
Feature referent = target.getReferent();
68+
Feature result = target.getResult();
69+
if (referent != null && result != null) {
70+
addBindingConnector(referent, result);
7971
}
8072
}
8173

0 commit comments

Comments
 (0)