From 707df7debbf7b020c49b533a3cdfbcea8457198e Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 14:07:01 -0400 Subject: [PATCH 1/8] SYSML21-4 Removed TODO about updating spec (which has now been updated). --- .../java/org/omg/sysml/adapter/ConstraintUsageAdapter.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConstraintUsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConstraintUsageAdapter.java index d7a0b5ddf..b309d436a 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConstraintUsageAdapter.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConstraintUsageAdapter.java @@ -84,12 +84,6 @@ protected String getDefaultSupertype() { } protected boolean isCheckedConstraint() { - /* - * TODO: Update checkConstraintUsageCheckedConstraintSpecialization - * - * OCL doesn't require composite - * - */ ConstraintUsage target = getTarget(); Type owningType = target.getOwningType(); return target.isComposite() && From 52181d0e915d755fa206193abb17a0e480436e2c Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 14:41:21 -0400 Subject: [PATCH 2/8] SYSML21-15 Fixed derivation of AssignmentActionUsage::referent. --- .../AssignmentActionUsage_referent_SettingDelegate.java | 4 +++- .../src/org/omg/sysml/xtext/validation/SysMLValidator.xtend | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/AssignmentActionUsage_referent_SettingDelegate.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/AssignmentActionUsage_referent_SettingDelegate.java index dc0822d98..7df1e7edb 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/AssignmentActionUsage_referent_SettingDelegate.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/AssignmentActionUsage_referent_SettingDelegate.java @@ -1,7 +1,7 @@ /******************************************************************************* * SysML 2 Pilot Implementation * Copyright (c) 2022 Siemens AG - * Copyright (c) 2023 Model Driven Solutions, Inc. + * Copyright (c) 2023, 2026 Model Driven Solutions, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the Eclipse Public License as published by @@ -28,6 +28,7 @@ import org.omg.sysml.lang.sysml.Feature; import org.omg.sysml.lang.sysml.FeatureMembership; import org.omg.sysml.lang.sysml.Membership; +import org.omg.sysml.lang.sysml.MetadataFeature; public class AssignmentActionUsage_referent_SettingDelegate extends BasicDerivedObjectSettingDelegate { @@ -41,6 +42,7 @@ protected EObject basicGet(InternalEObject owner) { filter(m->!(m instanceof FeatureMembership)). map(Membership::getMemberElement). filter(Feature.class::isInstance). + filter(f->!(f instanceof MetadataFeature)). findFirst().orElse(null); } diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend index 5631e450c..0d5201cb0 100644 --- a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend @@ -131,6 +131,7 @@ import org.omg.sysml.lang.sysml.WhileLoopActionUsage import org.omg.sysml.util.SysMLLibraryUtil import org.omg.sysml.util.FeatureUtil import org.omg.sysml.util.UsageUtil +import org.omg.sysml.lang.sysml.MetadataFeature /** * This class contains custom validation rules. @@ -778,7 +779,8 @@ class SysMLValidator extends KerMLValidator { @Check def checkAssignmentActionUsage(AssignmentActionUsage usg) { // validateAssignmentActionUsageReferent - if (!usg.ownedMembership.exists[m | !(m instanceof FeatureMembership) && m.memberElement instanceof Feature]) { + if (!usg.ownedMembership.exists[m | + !(m instanceof FeatureMembership) && m.memberElement instanceof Feature && !(m.memberElement instanceof MetadataFeature)]) { error(INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_MSG, usg, null, INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT) } From 725e2d016c6b6d953aaa0aeee7241110fa741456 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 16:45:49 -0400 Subject: [PATCH 3/8] SYSML21-17 Added validateAssignmentActionUsageReferentIsTimeVarying. - Also added a corresponding test to SysML Xpect file AssignmentctionUsage_invalid.sysml.xt. --- .../invalid/AssignmentActionUsage_invalid.sysml.xt | 3 +++ .../org/omg/sysml/xtext/validation/SysMLValidator.xtend | 9 ++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/AssignmentActionUsage_invalid.sysml.xt b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/AssignmentActionUsage_invalid.sysml.xt index 23c14879c..d4e7ed5f3 100644 --- a/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/AssignmentActionUsage_invalid.sysml.xt +++ b/org.omg.sysml.xpect.tests/src/org/omg/sysml/xpect/tests/validation/invalid/AssignmentActionUsage_invalid.sysml.xt @@ -33,6 +33,7 @@ package AssignmentActionUsage_invalid { attribute a; protected attribute b; private attribute c; + action d; } action def A { assign i.a := null; @@ -40,5 +41,7 @@ package AssignmentActionUsage_invalid { assign i.b := null; // XPECT errors --> "Couldn't resolve reference to Element 'c'." at "c" assign i.c := null; + // XPECT errors --> "Referent must be time varying." at "d" + assign i.d := null; } } diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend index 0d5201cb0..d01fd8657 100644 --- a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend @@ -263,6 +263,8 @@ class SysMLValidator extends KerMLValidator { public static val INVALID_ASSIGNMENT_ACTION_USAGE_ARGUMENTS_MSG = "An assignment must have two arguments." public static val INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT = "validateAssignmentActionUsageReferent" public static val INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_MSG = "An assignment must have a referent." + public static val INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_IS_TIME_VARYING = "validateAssignmentActionUsageReferentIsTimeVarying" + public static val INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_IS_TIME_VARYING_MSG = "Referent must be time varying." public static val INVALID_TRIGGER_INVOCATION_EXPRESSION_AFTER_ARGUMENT = "validateTriggerInvocationActionAfterArgument" public static val INVALID_TRIGGER_INVOCATION_EXPRESSION_AFTER_ARGUMENT_MSG = "An after expression must be a DurationValue." @@ -781,9 +783,14 @@ class SysMLValidator extends KerMLValidator { // validateAssignmentActionUsageReferent if (!usg.ownedMembership.exists[m | !(m instanceof FeatureMembership) && m.memberElement instanceof Feature && !(m.memberElement instanceof MetadataFeature)]) { - error(INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_MSG, usg, null, INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT) + error(INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_MSG, usg.ownedRelationship.get(1), null, INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT) } + // validateAssignmentActionUsageReferentIsTimeVarying + val referent = usg.referent + if (referent !== null && !referent.eIsProxy && !referent.featureTarget.isVariable) { + error(INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_IS_TIME_VARYING_MSG, usg.ownedRelationship.get(1), null, INVALID_ASSIGNMENT_ACTION_USAGE_REFERENT_IS_TIME_VARYING) + } } @Check From 2c0cb9003ecdbedfe7dd7da3d0aa7a809bfbfbdb Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 16:52:51 -0400 Subject: [PATCH 4/8] SYSML21-299 Removed TODO about updating spec, which has now been updated --- .../org/omg/sysml/adapter/IncludeUseCaseUsageAdapter.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IncludeUseCaseUsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IncludeUseCaseUsageAdapter.java index 54d67c0b4..a0dd5c083 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IncludeUseCaseUsageAdapter.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IncludeUseCaseUsageAdapter.java @@ -1,6 +1,6 @@ /******************************************************************************* * SysML 2 Pilot Implementation - * Copyright (c) 2021, 2022, 2025 Model Driven Solutions, Inc. + * Copyright (c) 2021, 2022, 2025, 2026 Model Driven Solutions, Inc. * * This program is free software: you can redistribute it and/or modify * it under the terms of the Eclipse Public License as published by @@ -38,11 +38,6 @@ public IncludeUseCaseUsage getTarget() { return (IncludeUseCaseUsage)super.getTarget(); } - /** - * TODO: Rename checkIncludeUseCaseSpecialization - * See SYSML21-299 - */ - /** * @satisfies checkIncludeUseCaseUsageSpecialization */ From 95af451f6152e8f6cb5b429dd009bc727216c290 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 17:00:58 -0400 Subject: [PATCH 5/8] SYSML21-301 Removed TODO about updating spec, which has now been updated --- .../java/org/omg/sysml/util/ImplicitGeneralizationMap.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ImplicitGeneralizationMap.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ImplicitGeneralizationMap.java index d2f5f090e..9afb7fa1c 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ImplicitGeneralizationMap.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ImplicitGeneralizationMap.java @@ -571,12 +571,6 @@ protected ImplicitGeneralizationMap() { //checkViewpointUsageViewpointSatisfactionSpecialization put(ViewpointUsageImpl.class, "satisfied", "Views::View::viewpointSatisfactions"); - /* - * TODO: Update checkViewpointDefinitionSpecialization and checkViewpointUsageSpecialization - * - * See SYSML21-301 - */ - //checkWhileLoopActionUsageSpecialization put(WhileLoopActionUsageImpl.class, "base", "Actions::whileLoopActions"); //checkWhileLoopActionUsageSubactionSpecialization From da21683be1d7780963a3a56355e7668f87351c34 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 17:10:19 -0400 Subject: [PATCH 6/8] SYSML21-309 Removed TODO about updating spec, which has now been updated --- .../src/main/java/org/omg/sysml/util/UsageUtil.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/UsageUtil.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/UsageUtil.java index 67e7a1b9b..fee046c46 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/UsageUtil.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/UsageUtil.java @@ -144,8 +144,6 @@ public static RequirementUsage getOwnedObjectiveRequirementOf(Type type) { } public static RequirementUsage getObjectiveRequirementOf(Type type) { - // TODO: Update checkRequirementUsageObjectiveRedefinition - // See SYSML21-309 if (type instanceof Feature) { type = ((Feature)type).getFeatureTarget(); } From df4607f72cebe3553786bbca9812b19358eb284f Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 18:31:52 -0400 Subject: [PATCH 7/8] SYSML21-419 Added setting delegates for ownedMetadata and nestedMetadata Note that these delegates would not be necessary if the subsetting by these properties was correct, in which case the default setting delegate would work. Also added Junit test testOwnedMetadataAndNestedMetadata to DerivedPropertyAndOperationTest. --- .../DerivedPropertyAndOperationTest.java | 39 ++++++++++++++++ .../tests/SysMLInteractiveTest.java | 2 +- ...inition_ownedMetadata_SettingDelegate.java | 46 +++++++++++++++++++ .../Usage_nestedMetadata_SettingDelegate.java | 46 +++++++++++++++++++ 4 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Definition_ownedMetadata_SettingDelegate.java create mode 100644 org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Usage_nestedMetadata_SettingDelegate.java diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java index 477cc6654..0f7878973 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/DerivedPropertyAndOperationTest.java @@ -48,6 +48,7 @@ import org.omg.sysml.lang.sysml.FeatureMembership; import org.omg.sysml.lang.sysml.ItemUsage; import org.omg.sysml.lang.sysml.Membership; +import org.omg.sysml.lang.sysml.MetadataUsage; import org.omg.sysml.lang.sysml.Namespace; import org.omg.sysml.lang.sysml.Relationship; import org.omg.sysml.lang.sysml.TriggerInvocationExpression; @@ -488,4 +489,42 @@ public void testNamespaceResolve() throws Exception { assertSame("Test.resolve(Test::C::g)", g.getOwningMembership(), Test.resolve("Test::C::g")); } + public final String ownedMetadataTest = + "package Test {\n" + + " part def P {\n" + + " @M1; @M2;\n" + + " part p : P {\n" + + " @M1; @M2;\n" + + " }\n" + + " }\n" + + " metadata def M1;\n" + + " metadata def M2;\n" + + "}"; + + @Test + public void testOwnedMetadataAndNestedMetadata() throws Exception { + SysMLInteractive instance = createSysMLInteractiveInstance(); + SysMLInteractiveResult result = instance.process(ownedMetadataTest); + Element root = result.getRootElement(); + List elements = ((Namespace)root).getOwnedMember(); + Namespace Test = (Namespace)elements.get(0); + List ownedMembers = Test.getOwnedMember(); + Definition P = (Definition)ownedMembers.get(0); + List P_ownedMembers = P.getOwnedMember(); + Usage P_M1 = (Usage)P_ownedMembers.get(0); + Usage P_M2 = (Usage)P_ownedMembers.get(1); + Usage p = (Usage)P_ownedMembers.get(2); + List p_ownedMembers = p.getOwnedMember(); + Usage p_M1 = (Usage)p_ownedMembers.get(0); + Usage p_M2 = (Usage)p_ownedMembers.get(1); + + List ownedMetadata = P.getOwnedMetadata(); + assertTrue("P_M1", ownedMetadata.contains(P_M1)); + assertTrue("P_M2", ownedMetadata.contains(P_M2)); + + List nestedMetadata = p.getNestedMetadata(); + assertTrue("p_M1", nestedMetadata.contains(p_M1)); + assertTrue("p_M2", nestedMetadata.contains(p_M2)); + } + } diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/SysMLInteractiveTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/SysMLInteractiveTest.java index 799963d22..5a81e9914 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/SysMLInteractiveTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/SysMLInteractiveTest.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 Eclipse Public License as published by diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Definition_ownedMetadata_SettingDelegate.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Definition_ownedMetadata_SettingDelegate.java new file mode 100644 index 000000000..24d84848b --- /dev/null +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Definition_ownedMetadata_SettingDelegate.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * SysML 2 Pilot Implementation + * Copyright (c) 2026 Model Driven Solutions, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Eclipse Public License as published by + * the Eclipse Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Eclipse Public License for more details. + * + * You should have received a copy of the Eclipse Public License + * along with this program. If not, see . + * + * @license EPL-2.0 + * + *******************************************************************************/ + +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.Definition; +import org.omg.sysml.lang.sysml.MetadataUsage; +import org.omg.sysml.util.NonNotifyingEObjectEList; + +public class Definition_ownedMetadata_SettingDelegate extends BasicDerivedListSettingDelegate { + + public Definition_ownedMetadata_SettingDelegate(EStructuralFeature eStructuralFeature) { + super(eStructuralFeature); + } + + @Override + protected EList basicGet(InternalEObject owner) { + EList ownedMetadata = new NonNotifyingEObjectEList<>(MetadataUsage.class, owner, eStructuralFeature.getFeatureID()); + ((Definition)owner).getMember().stream(). + filter(MetadataUsage.class::isInstance). + map(MetadataUsage.class::cast). + forEachOrdered(ownedMetadata::add); + return ownedMetadata; + } + +} diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Usage_nestedMetadata_SettingDelegate.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Usage_nestedMetadata_SettingDelegate.java new file mode 100644 index 000000000..841590914 --- /dev/null +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/delegate/setting/Usage_nestedMetadata_SettingDelegate.java @@ -0,0 +1,46 @@ +/******************************************************************************* + * SysML 2 Pilot Implementation + * Copyright (c) 2026 Model Driven Solutions, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the Eclipse Public License as published by + * the Eclipse Foundation, version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * Eclipse Public License for more details. + * + * You should have received a copy of the Eclipse Public License + * along with this program. If not, see . + * + * @license EPL-2.0 + * + *******************************************************************************/ + +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.MetadataUsage; +import org.omg.sysml.lang.sysml.Usage; +import org.omg.sysml.util.NonNotifyingEObjectEList; + +public class Usage_nestedMetadata_SettingDelegate extends BasicDerivedListSettingDelegate { + + public Usage_nestedMetadata_SettingDelegate(EStructuralFeature eStructuralFeature) { + super(eStructuralFeature); + } + + @Override + protected EList basicGet(InternalEObject owner) { + EList nestedMetadata = new NonNotifyingEObjectEList<>(MetadataUsage.class, owner, eStructuralFeature.getFeatureID()); + ((Usage)owner).getMember().stream(). + filter(MetadataUsage.class::isInstance). + map(MetadataUsage.class::cast). + forEachOrdered(nestedMetadata::add); + return nestedMetadata; + } + +} From 6159d56fa1e3b65374cba65e4605430536f07e7d Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sun, 7 Jun 2026 18:40:57 -0400 Subject: [PATCH 8/8] SYSML21-459 Corrected name of validateSendActionUsagePayloadArgument... ...in a comment in SysMLValidation. --- .../src/org/omg/sysml/xtext/validation/SysMLValidator.xtend | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend index d01fd8657..a465839e0 100644 --- a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/validation/SysMLValidator.xtend @@ -908,7 +908,7 @@ class SysMLValidator extends KerMLValidator { warning(INVALID_SEND_ACTION_USAGE_RECEIVER_MSG, receiverArgument, null, INVALID_SEND_ACTION_USAGE_RECEIVER) } - // validateSendActionPayloadArgument + // validateSendActionUsagePayloadArgument val featureMembership = usg.featureMembership if ((featureMembership instanceof StateSubactionMembership || featureMembership instanceof TransitionFeatureMembership) &&