From 90172570b622045b2fbbb38963139be76b637ad0 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Mon, 16 Mar 2026 21:02:49 -0400 Subject: [PATCH 1/5] ST6RI-921 Added binding in feature ref expr, even if in filter expr. --- .../FeatureReferenceExpressionAdapter.java | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/org.omg.sysml/src/org/omg/sysml/adapter/FeatureReferenceExpressionAdapter.java b/org.omg.sysml/src/org/omg/sysml/adapter/FeatureReferenceExpressionAdapter.java index 615e7b7861..730e0f206a 100644 --- a/org.omg.sysml/src/org/omg/sysml/adapter/FeatureReferenceExpressionAdapter.java +++ b/org.omg.sysml/src/org/omg/sysml/adapter/FeatureReferenceExpressionAdapter.java @@ -1,6 +1,6 @@ /******************************************************************************* * SysML 2 Pilot Implementation - * Copyright (c) 2021, 2022 Model Driven Solutions, Inc. + * Copyright (c) 2021, 2022, 2026 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 @@ -63,19 +63,11 @@ protected boolean isInFilterExpression() { * @satisfies checkFeatureReferenceExpressionBindingConnector */ protected void addReferenceConnector() { - /* - * TODO: Update checkFeatureReferenceExpressionBindingConnector? - * - * OCL does not include !isInFilterExpression check. - * - */ - if (!isInFilterExpression()) { - FeatureReferenceExpression target = getTarget(); - Feature referent = target.getReferent(); - Feature result = target.getResult(); - if (referent != null && result != null) { - addBindingConnector(referent, result); - } + FeatureReferenceExpression target = getTarget(); + Feature referent = target.getReferent(); + Feature result = target.getResult(); + if (referent != null && result != null) { + addBindingConnector(referent, result); } } From cf123f09df25e72c20148e5fcca0ecec2cef4521 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Mon, 16 Mar 2026 21:03:50 -0400 Subject: [PATCH 2/5] ST6RI-921 Updated examples with validation errors due to previous change --- kerml/src/examples/Simple Tests/Filtering.kerml | 8 +++++--- .../SysML v2 Spec Annex A SimpleVehicleModel.sysml | 2 +- .../src/training/40. Filtering/Filtering Example-1.sysml | 2 +- .../src/training/40. Filtering/Filtering Example-2.sysml | 2 +- .../11b-Safety and Security Feature Views.sysml | 4 ++-- ...13b-Safety and Security Features Element Group-1.sysml | 2 +- ...13b-Safety and Security Features Element Group-2.sysml | 2 +- 7 files changed, 12 insertions(+), 10 deletions(-) diff --git a/kerml/src/examples/Simple Tests/Filtering.kerml b/kerml/src/examples/Simple Tests/Filtering.kerml index 3de84e15e0..ad1fda6f19 100644 --- a/kerml/src/examples/Simple Tests/Filtering.kerml +++ b/kerml/src/examples/Simple Tests/Filtering.kerml @@ -23,15 +23,17 @@ package Filtering { package UpperLevelApprovals { private import DesignModel::**; - filter Annotations::ApprovalAnnotation::approved and - Annotations::ApprovalAnnotation::level > 1; + filter (as Annotations::ApprovalAnnotation).approved and + (as Annotations::ApprovalAnnotation).level > 1; struct Test :> System; } package UpperLevelApprovals1 { private import Annotations::**; - private import DesignModel::**[@Structure][approved and level > 1]; + private import DesignModel::**[@Structure] + [(as Annotations::ApprovalAnnotation).approved and + (as Annotations::ApprovalAnnotation).level > 1]; struct Test :> System; } diff --git a/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml b/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml index a5b1548ee6..1fc30e708e 100644 --- a/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml +++ b/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml @@ -1536,7 +1536,7 @@ package SimpleVehicleModel{ package MandatorySafetyGroup { /* Parts that contribute to safety AND are mandatory. */ public import vehicle_b::**; - filter @Safety and Safety::isMandatory; + filter (as Safety).isMandatory; } } package Views_Viewpoints{ diff --git a/sysml/src/training/40. Filtering/Filtering Example-1.sysml b/sysml/src/training/40. Filtering/Filtering Example-1.sysml index 6fcc067d78..34b1f36f00 100644 --- a/sysml/src/training/40. Filtering/Filtering Example-1.sysml +++ b/sysml/src/training/40. Filtering/Filtering Example-1.sysml @@ -32,6 +32,6 @@ package 'Filtering Example-1' { package 'Mandatory Safety Features' { /* Parts that contribute to safety AND are mandatory. */ public import vehicle::**; - filter @Safety and Safety::isMandatory; + filter @Safety and (as Safety).isMandatory; } } \ No newline at end of file diff --git a/sysml/src/training/40. Filtering/Filtering Example-2.sysml b/sysml/src/training/40. Filtering/Filtering Example-2.sysml index 0bc6633329..08f2d8d53d 100644 --- a/sysml/src/training/40. Filtering/Filtering Example-2.sysml +++ b/sysml/src/training/40. Filtering/Filtering Example-2.sysml @@ -30,6 +30,6 @@ package 'Filtering Example-2' { package 'Mandatory Safety Features' { /* Parts that contribute to safety AND are mandatory. */ - public import vehicle::**[@Safety and Safety::isMandatory]; + public import vehicle::**[@Safety and (as Safety).isMandatory]; } } \ No newline at end of file diff --git a/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml b/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml index 398e3d0798..380f2d0e3d 100644 --- a/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml +++ b/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml @@ -54,11 +54,11 @@ package '11b-Safety and Security Feaure Views' { view vehicleMandatorySafetyFeatureView :> vehicleSafetyFeatureView { expose vehicle::*::**; - filter Safety::isMandatory; + filter (as Safety).isMandatory; } view vehicleMandatorySafetyFeatureViewStandalone { - expose vehicle::**[@Safety and Safety::isMandatory]; + expose vehicle::**[(as Safety).isMandatory]; render asElementTable; } } diff --git a/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-1.sysml b/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-1.sysml index 1b21634532..e23c7c86ff 100644 --- a/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-1.sysml +++ b/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-1.sysml @@ -51,6 +51,6 @@ package '13b-Safety and Security Features Element Group-1' { package 'Mandatory Safety Features' { /* Parts that contribute to safety AND are mandatory. */ public import vehicle::**; - filter @Safety and Safety::isMandatory; + filter @Safety and (as Safety).isMandatory; } } diff --git a/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-2.sysml b/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-2.sysml index bd3995c460..ff8f4e08fe 100644 --- a/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-2.sysml +++ b/sysml/src/validation/13-Model Containment/13b-Safety and Security Features Element Group-2.sysml @@ -47,6 +47,6 @@ package '13b-Safety and Security Features Element Group-2' { package 'Mandatory Saftey Features' { /* Parts that contribute to safety AND are mandatory. */ - public import vehicle::**[@Safety and Safety::isMandatory]; + public import vehicle::**[@Safety and (as Safety).isMandatory]; } } From 1de4d42259edbcd8d2d2e9963de87e4c89c5a4e0 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Tue, 17 Mar 2026 15:09:37 -0400 Subject: [PATCH 3/5] ST6RI-921 Updated Xpect tests related to filter expressions. --- .../tests/imports/local/Import_Filtered.kerml.xt | 6 +++--- ...etadataTests_MetadataFeature_invalid.kerml.xt | 16 ++++++++-------- .../tests/simpletests/ElementFilter.sysml.xt | 2 +- .../invalid/MetadataUsage_Invalid.sysml.xt | 16 ++++++++-------- 4 files changed, 20 insertions(+), 20 deletions(-) diff --git a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/imports/local/Import_Filtered.kerml.xt b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/imports/local/Import_Filtered.kerml.xt index a58c8aa5ff..fe22ced8c8 100644 --- a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/imports/local/Import_Filtered.kerml.xt +++ b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/imports/local/Import_Filtered.kerml.xt @@ -237,7 +237,7 @@ package Import_Filtered { } package 'Mandatory Features_true_1' { - public import vehicle1_c1::**[Safety::isMandatory]; + public import vehicle1_c1::**[(as Safety).isMandatory]; classifier b :> seatBelt; // XPECT errors --> "Couldn't resolve reference to Classifier 'alarm'." at "alarm" @@ -259,7 +259,7 @@ package Import_Filtered { } package 'Mandatory Features_true_2' { - public import vehicle1_c1::**[Safety::isMandatory == true]; + public import vehicle1_c1::**[(as Safety).isMandatory == true]; classifier b :> seatBelt; // XPECT errors --> "Couldn't resolve reference to Classifier 'alarm'." at "alarm" @@ -281,7 +281,7 @@ package Import_Filtered { } package 'Mandatory Features_false' { - public import vehicle1_c1::**[Safety::isMandatory == false]; + public import vehicle1_c1::**[(as Safety).isMandatory == false]; classifier j :> antilockBrakes; // XPECT errors --> "Couldn't resolve reference to Classifier 'alarm'." at "alarm" diff --git a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/validation/MetadataTests_MetadataFeature_invalid.kerml.xt b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/validation/MetadataTests_MetadataFeature_invalid.kerml.xt index 05ce9c1f2d..ced959af04 100644 --- a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/validation/MetadataTests_MetadataFeature_invalid.kerml.xt +++ b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/validation/MetadataTests_MetadataFeature_invalid.kerml.xt @@ -50,12 +50,12 @@ package MetadataFeatureTest { function f { in x; return : ScalarValues::Boolean; } - // XPECT errors --> "Must be model-level evaluable" at "filter f(A::y);" - filter f(A::y); - // XPECT errors --> "Must be model-level evaluable" at "filter ~A::z;" - filter ~A::z; - // XPECT errors --> "Must be model-level evaluable" at "filter A::y->ControlFunctions::collect {in x; x};" - filter A::y->ControlFunctions::collect {in x; x}; + // XPECT errors --> "Must be model-level evaluable" at "filter f((as A).y);" + filter f((as A).y); + // XPECT errors --> "Must be model-level evaluable" at "filter ~(as A).z;" + filter ~(as A).z; + // XPECT errors --> "Must be model-level evaluable" at "filter (as A).y->ControlFunctions::collect {in x; x};" + filter (as A).y->ControlFunctions::collect {in x; x}; // XPECT errors --> "Must have a Boolean result" at "filter new A(null, 1, "", false);" filter new A(null, 1, "", false); @@ -66,8 +66,8 @@ package MetadataFeatureTest { // XPECT errors --> "Must be model-level evaluable" at "= ~3" x = ~3; y = "e"; - // XPECT errors --> "Must be model-level evaluable" at "= f(A::y)" - z = f(A::y); + // XPECT errors --> "Must be model-level evaluable" at "= f((as A).y)" + z = f((as A).y); u { v = 1; // XPECT errors --> "Must redefine an owning-type feature" at "bad;" diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/ElementFilter.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/ElementFilter.sysml.xt index 50b15fc34c..597adc572e 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/ElementFilter.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/simpletests/ElementFilter.sysml.xt @@ -85,6 +85,6 @@ package ElementFilterTest { } package 'Mandatory Features' { - public import vehicle1_c1::**[@Safety and PartInfo::isMandatory]; + public import vehicle1_c1::**[@Safety and (as PartInfo).isMandatory]; } } diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/MetadataUsage_Invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/MetadataUsage_Invalid.sysml.xt index 6da9797d8f..a719cb0a22 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/MetadataUsage_Invalid.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/MetadataUsage_Invalid.sysml.xt @@ -62,12 +62,12 @@ package Test { calc def f { in x : ScalarValues::Boolean; } - // XPECT errors --> "Must be model-level evaluable" at "filter f(A::z);" - filter f(A::z); - // XPECT errors --> "Must be model-level evaluable" at "filter ~A::z;" - filter ~A::z; - // XPECT errors --> "Must be model-level evaluable" at "filter A::y->ControlFunctions::collect {in ref x; x};" - filter A::y->ControlFunctions::collect {in ref x; x}; + // XPECT errors --> "Must be model-level evaluable" at "filter f((as A).z);" + filter f((as A).z); + // XPECT errors --> "Must be model-level evaluable" at "filter ~(as A).z;" + filter ~(as A).z; + // XPECT errors --> "Must be model-level evaluable" at "filter (as A).y->ControlFunctions::collect {in ref x; x};" + filter (as A).y->ControlFunctions::collect {in ref x; x}; // XPECT errors --> "Must have a Boolean result" at "filter new A(null, 1, "", false);" filter new A(null, 1, "", false); @@ -82,8 +82,8 @@ package Test { // XPECT errors --> "Must be model-level evaluable" at "= ~3" x = ~3; y = E::e; - // XPECT errors --> "Must be model-level evaluable" at "= f(A::z)" - z = f(A::z); + // XPECT errors --> "Must be model-level evaluable" at "= f((as A).z)" + z = f((as A).z); u { v = 1; // XPECT errors --> "Must redefine an owning-type feature" at "bad;" From 180c0b7ee0d94a55a28e409f46fa95fe94ef0322 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Tue, 17 Mar 2026 16:25:25 -0400 Subject: [PATCH 4/5] ST6RI-921 Updated filter expression tests in ModelLevelEvaluationTest. --- .../sysml/interactive/tests/ModelLevelEvaluationTest.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java index 91f15eea49..325226ed0e 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java @@ -371,7 +371,7 @@ public void testFeatureReferenceEvaluation() throws Exception { assertEquals(1, evaluateIntegerValue(instance, checkAnnotatingFeature(instance, "Annotation", "x"), - "Annotation::a")); + "(as Annotation).a")); } @Test @@ -385,7 +385,7 @@ public void testEnumeratedValueEvaluation() throws Exception { assertEquals(instance.resolve("E::e"), evaluateSingleValue(instance, checkAnnotatingFeature(instance, "Annotation", "x"), - "Annotation::a")); + "(as Annotation).a")); } @Test @@ -408,8 +408,8 @@ public void testIsTypeEvaluation() throws Exception { "attribute x {@Annotation{a = E::e; b = 2;}}"); MetadataFeature feature = checkAnnotatingFeature(instance, "Annotation", "x"); - assertTrue(evaluateBooleanValue(instance, feature, "Annotation::a istype E")); - assertTrue(evaluateBooleanValue(instance, feature, "Annotation::b istype ScalarValues::Integer")); + assertTrue(evaluateBooleanValue(instance, feature, "(as Annotation).a istype E")); + assertTrue(evaluateBooleanValue(instance, feature, "(as Annotation).b istype ScalarValues::Integer")); } @Test From 1735c5df82af75a9b8339d25dd8c1ce507185560 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Wed, 1 Apr 2026 22:26:13 -0400 Subject: [PATCH 5/5] ST6RI-921 Revised some examples to restore type checks in filters. --- .../SysML v2 Spec Annex A SimpleVehicleModel.sysml | 2 +- .../11b-Safety and Security Feature Views.sysml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml b/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml index 1fc30e708e..f3fb8695e7 100644 --- a/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml +++ b/sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml @@ -1536,7 +1536,7 @@ package SimpleVehicleModel{ package MandatorySafetyGroup { /* Parts that contribute to safety AND are mandatory. */ public import vehicle_b::**; - filter (as Safety).isMandatory; + filter @Safety and (as Safety).isMandatory; } } package Views_Viewpoints{ diff --git a/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml b/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml index 380f2d0e3d..7a96c4aee7 100644 --- a/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml +++ b/sysml/src/validation/11-View and Viewpoint/11b-Safety and Security Feature Views.sysml @@ -54,11 +54,11 @@ package '11b-Safety and Security Feaure Views' { view vehicleMandatorySafetyFeatureView :> vehicleSafetyFeatureView { expose vehicle::*::**; - filter (as Safety).isMandatory; + filter @Safety and (as Safety).isMandatory; } view vehicleMandatorySafetyFeatureViewStandalone { - expose vehicle::**[(as Safety).isMandatory]; + expose vehicle::**[@Safety and (as Safety).isMandatory]; render asElementTable; } }