Skip to content

Commit 4de3265

Browse files
authored
Merge pull request #743 from Systems-Modeling/ST6RI-921
ST6RI-921 Invalid feature references are allowed in filter expressions
2 parents 8c9e43d + 1735c5d commit 4de3265

13 files changed

Lines changed: 42 additions & 48 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/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/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

sysml/src/examples/Vehicle Example/SysML v2 Spec Annex A SimpleVehicleModel.sysml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1536,7 +1536,7 @@ package SimpleVehicleModel{
15361536
package MandatorySafetyGroup {
15371537
/* Parts that contribute to safety AND are mandatory. */
15381538
public import vehicle_b::**;
1539-
filter @Safety and Safety::isMandatory;
1539+
filter @Safety and (as Safety).isMandatory;
15401540
}
15411541
}
15421542
package Views_Viewpoints{

sysml/src/training/40. Filtering/Filtering Example-1.sysml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,6 @@ package 'Filtering Example-1' {
3232
package 'Mandatory Safety Features' {
3333
/* Parts that contribute to safety AND are mandatory. */
3434
public import vehicle::**;
35-
filter @Safety and Safety::isMandatory;
35+
filter @Safety and (as Safety).isMandatory;
3636
}
3737
}

sysml/src/training/40. Filtering/Filtering Example-2.sysml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ package 'Filtering Example-2' {
3030

3131
package 'Mandatory Safety Features' {
3232
/* Parts that contribute to safety AND are mandatory. */
33-
public import vehicle::**[@Safety and Safety::isMandatory];
33+
public import vehicle::**[@Safety and (as Safety).isMandatory];
3434
}
3535
}

0 commit comments

Comments
 (0)