diff --git a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/AllKerMLXpectTests.java b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/AllKerMLXpectTests.java
index bb4518fa21..c5811bbb5c 100644
--- a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/AllKerMLXpectTests.java
+++ b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/AllKerMLXpectTests.java
@@ -1,24 +1,34 @@
-package org.omg.kerml.xpect.tests;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-import org.junit.runners.Suite.SuiteClasses;
-import org.omg.kerml.xpect.tests.imports.global.KerMLImportGlobalTest;
-import org.omg.kerml.xpect.tests.imports.local.KerMLImportLocalTest;
-import org.omg.kerml.xpect.tests.imports.recursive.KerMLImportRecursiveTest;
-import org.omg.kerml.xpect.tests.indexing.KerMLIndexerTest;
-import org.omg.kerml.xpect.tests.linking.KerMLLinkingTest;
-import org.omg.kerml.xpect.tests.parsing.KerMLParsingTest;
-import org.omg.kerml.xpect.tests.scoping.KerMLScopingTest;
-import org.omg.kerml.xpect.tests.testsuite.KerMLXtextTest;
-import org.omg.kerml.xpect.tests.validation.KerMLValidationTest;
-import org.omg.kerml.xpect.tests.visibility.KerMLVisibilityTest;
-
-@SuiteClasses({
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.omg.kerml.xpect.tests;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+import org.omg.kerml.xpect.tests.imports.global.KerMLImportGlobalTest;
+import org.omg.kerml.xpect.tests.imports.local.KerMLImportLocalTest;
+import org.omg.kerml.xpect.tests.imports.recursive.KerMLImportRecursiveTest;
+import org.omg.kerml.xpect.tests.indexing.KerMLIndexerTest;
+import org.omg.kerml.xpect.tests.linking.KerMLLinkingTest;
+import org.omg.kerml.xpect.tests.parsing.KerMLParsingTest;
+import org.omg.kerml.xpect.tests.scoping.KerMLScopingTest;
+import org.omg.kerml.xpect.tests.testsuite.KerMLXtextTest;
+import org.omg.kerml.xpect.tests.validation.KerMLValidationTest;
+import org.omg.kerml.xpect.tests.visibility.KerMLVisibilityTest;
+
+@SuiteClasses({
KerMLImportGlobalTest.class, //
KerMLImportLocalTest.class, //
KerMLImportRecursiveTest.class, //
- KerMLLinkingTest.class,//
+ KerMLLinkingTest.class,//
KerMLParsingTest.class, //
KerMLScopingTest.class, //
KerMLXtextTest.class, //
diff --git a/org.omg.kerml.xtext/META-INF/MANIFEST.MF b/org.omg.kerml.xtext/META-INF/MANIFEST.MF
index e76ec65cb0..585cc902ed 100644
--- a/org.omg.kerml.xtext/META-INF/MANIFEST.MF
+++ b/org.omg.kerml.xtext/META-INF/MANIFEST.MF
@@ -23,6 +23,7 @@ Require-Bundle: org.eclipse.xtext,
org.eclipse.xtext.common.types,
org.objectweb.asm;bundle-version="9.3.0";resolution:=optional
Export-Package: org.omg.kerml.xtext,
+ org.omg.kerml.xtext.postprocessing,
org.omg.kerml.xtext.conversion,
org.omg.kerml.xtext.generator,
org.omg.kerml.xtext.library,
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/AnnotatingElementParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/AnnotatingElementParserPostProcessor.java
new file mode 100644
index 0000000000..85d7440179
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/AnnotatingElementParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.AnnotatingElement;
+
+public class AnnotatingElementParserPostProcessor extends ElementParserPostProcessor {
+
+ public AnnotatingElementParserPostProcessor(AnnotatingElement element) {
+ super(element);
+ }
+
+ public AnnotatingElement getTarget() {
+ return (AnnotatingElement)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/AnnotationParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/AnnotationParserPostProcessor.java
new file mode 100644
index 0000000000..d17f7d4291
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/AnnotationParserPostProcessor.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.AnnotatingElement;
+import org.omg.sysml.lang.sysml.Annotation;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class AnnotationParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public AnnotationParserPostProcessor(Annotation element) {
+ super(element);
+ }
+
+ @Override
+ public Annotation getTarget() {
+ return (Annotation)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Annotation obj = getTarget();
+
+ // If the Annotation is not owned by an AnnotatingElement, then the annotatedElement is the owningRelatedElement.
+ Object annotatedElement = obj.eGet(SysMLPackage.Literals.ANNOTATION__ANNOTATED_ELEMENT, false);
+ if (annotatedElement == null) {
+ Element owningRelatedElement = obj.getOwningRelatedElement();
+ if (!(owningRelatedElement instanceof AnnotatingElement)) {
+ obj.setAnnotatedElement(owningRelatedElement);
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ClassifierParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ClassifierParserPostProcessor.java
new file mode 100644
index 0000000000..168305f738
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ClassifierParserPostProcessor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Classifier;
+
+public class ClassifierParserPostProcessor extends TypeParserPostProcessor {
+
+ public ClassifierParserPostProcessor(Classifier element) {
+ super(element);
+ }
+
+ @Override
+ public Classifier getTarget() {
+ return (Classifier)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/CommentParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/CommentParserPostProcessor.java
new file mode 100644
index 0000000000..0c0f004a82
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/CommentParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Comment;
+import org.omg.sysml.util.ElementUtil;
+
+public class CommentParserPostProcessor extends AnnotatingElementParserPostProcessor {
+
+ public CommentParserPostProcessor(Comment element) {
+ super(element);
+ }
+
+ @Override
+ public Comment getTarget() {
+ return (Comment)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Comment target = getTarget();
+ target.setLocale(ElementUtil.unescapeString(target.getLocale()));
+ target.setBody(ElementUtil.processCommentBody(target.getBody()));
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ConjugationParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ConjugationParserPostProcessor.java
new file mode 100644
index 0000000000..6660a0b299
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ConjugationParserPostProcessor.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Conjugation;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+import org.omg.sysml.lang.sysml.Type;
+
+public class ConjugationParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public ConjugationParserPostProcessor(Conjugation element) {
+ super(element);
+ }
+
+ @Override
+ public Conjugation getTarget() {
+ return (Conjugation)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Conjugation obj = getTarget();
+
+ // If the conjugatedType is not set, then set it to the owningRelatedElement, if this is a Type,
+ // otherwise set it to the first ownedRelatedElement.
+ Object conjugatedType = obj.eGet(SysMLPackage.Literals.CONJUGATION__CONJUGATED_TYPE, false);
+ if (conjugatedType == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Type) {
+ obj.setConjugatedType((Type)owner);
+ } else {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setConjugatedType((Type)ownedRelatedElements.get(0));
+ }
+ }
+ }
+
+ // If the originalType is not set, set it to the last ownedRelatedElement.
+ Object originalType = obj.eGet(SysMLPackage.Literals.CONJUGATION__ORIGINAL_TYPE, false);
+ if (originalType == null) {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setOriginalType((Type)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DependencyParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DependencyParserPostProcessor.java
new file mode 100644
index 0000000000..413dc61937
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DependencyParserPostProcessor.java
@@ -0,0 +1,41 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.util.EObjectResolvingEList;
+import org.omg.sysml.lang.sysml.Dependency;
+import org.omg.sysml.lang.sysml.Element;
+
+public class DependencyParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public DependencyParserPostProcessor(Dependency element) {
+ super(element);
+ }
+
+ @Override
+ public Dependency getTarget() {
+ return (Dependency)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Dependency target = getTarget();
+
+ // Add all ownedRelatedElements to supplier.
+ EObjectResolvingEList suppliers = (EObjectResolvingEList)target.getSupplier();
+ EList ownedRelatedElements = target.getOwnedRelatedElement();
+ ownedRelatedElements.stream().forEachOrdered(suppliers::addUnique);
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DifferencingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DifferencingParserPostProcessor.java
new file mode 100644
index 0000000000..be2798b182
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DifferencingParserPostProcessor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Differencing;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class DifferencingParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public DifferencingParserPostProcessor(Differencing element) {
+ super(element);
+ }
+
+ @Override
+ public Differencing getTarget() {
+ return (Differencing)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Differencing obj = getTarget();
+
+ // If a Differencing is parsed targeting a Feature chain, then the differencingType will be empty,
+ // but the Differencing will own the differencingType. So, in this case, the differencingType should
+ // be set to the (last) ownedRelatedelement.
+ Object differencingType = obj.eGet(SysMLPackage.Literals.DIFFERENCING__DIFFERENCING_TYPE, false);
+ if (differencingType == null) {
+ // Handle a differencingType that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setDifferencingType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DisjoiningParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DisjoiningParserPostProcessor.java
new file mode 100644
index 0000000000..ea914201df
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/DisjoiningParserPostProcessor.java
@@ -0,0 +1,68 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Disjoining;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+import org.omg.sysml.lang.sysml.Type;
+
+public class DisjoiningParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public DisjoiningParserPostProcessor(Disjoining element) {
+ super(element);
+ }
+
+ @Override
+ public Disjoining getTarget() {
+ return (Disjoining)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Disjoining obj = getTarget();
+
+ // If a Disjoining is parsed targeting a Feature chain, then the disjoiningType will be empty,
+ // but the Disjoining will own the disjoiningType. So, in this case, the disjoiningType should
+ // be set to the (last) ownedRelatedelement.
+ Object disjoiningType = obj.eGet(SysMLPackage.Literals.DISJOINING__DISJOINING_TYPE, false);
+ if (disjoiningType == null) {
+ // Handle a disjoiningType that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setDisjoiningType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+
+ // If the typedDisjoined (source) is empty, set it to the owningRelatedElement, if it is a Type.
+ // Otherwise, set it to the first ownedRelatedElement, to the first ownedRelatedElement,
+ // which will be a Feature chain.
+ Object typeDisjoined = obj.eGet(SysMLPackage.Literals.DISJOINING__TYPE_DISJOINED, false);
+ if (typeDisjoined == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Type) {
+ // Handle a Disjoining owned by the typeDisjoined.
+ obj.setTypeDisjoined((Type)owner);
+ } else {
+ // Handle a typeDisjoined that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setTypeDisjoined((Feature)ownedRelatedElements.get(0));
+ }
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ElementParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ElementParserPostProcessor.java
new file mode 100644
index 0000000000..a3496c451d
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ElementParserPostProcessor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.util.ElementUtil;
+
+public class ElementParserPostProcessor {
+
+ private final Element target;
+
+ public ElementParserPostProcessor(Element element) {
+ target = element;
+ }
+
+ public Element getTarget() {
+ return target;
+ }
+
+ public void postProcess() {
+ Element target = getTarget();
+ target.setDeclaredName(ElementUtil.unescapeString(target.getDeclaredName()));
+ target.setDeclaredShortName(ElementUtil.unescapeString(target.getDeclaredShortName()));
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/EndFeatureMembershipParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/EndFeatureMembershipParserPostProcessor.java
new file mode 100644
index 0000000000..9dddf5082d
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/EndFeatureMembershipParserPostProcessor.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.EndFeatureMembership;
+import org.omg.sysml.lang.sysml.Feature;
+
+public class EndFeatureMembershipParserPostProcessor extends FeatureMembershipParserPostProcessor {
+
+ public EndFeatureMembershipParserPostProcessor(EndFeatureMembership element) {
+ super(element);
+ }
+
+ @Override
+ public EndFeatureMembership getTarget() {
+ return (EndFeatureMembership)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ EndFeatureMembership target = getTarget();
+ Feature endFeature = target.getOwnedMemberFeature();
+ if (endFeature != null) {
+ endFeature.setIsEnd(true);
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ExpressionParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ExpressionParserPostProcessor.java
new file mode 100644
index 0000000000..24b4f7d60c
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ExpressionParserPostProcessor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Expression;
+
+public class ExpressionParserPostProcessor extends StepParserPostProcessor {
+
+ public ExpressionParserPostProcessor(Expression element) {
+ super(element);
+ }
+
+ @Override
+ public Expression getTarget() {
+ return (Expression)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureInvertingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureInvertingParserPostProcessor.java
new file mode 100644
index 0000000000..2d0f7fdef6
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureInvertingParserPostProcessor.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.FeatureInverting;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class FeatureInvertingParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public FeatureInvertingParserPostProcessor(FeatureInverting element) {
+ super(element);
+ }
+
+ @Override
+ public FeatureInverting getTarget() {
+ return (FeatureInverting)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ FeatureInverting obj = getTarget();
+
+ // If the featureInverted is empty, then set it to the owningRelatedElement of the FeatureInverting,
+ // if that is a Feature, otherwise set it to the first ownedRelatedElement (which will be a
+ // Feature chain).
+ Object featureInverted = obj.eGet(SysMLPackage.Literals.FEATURE_INVERTING__FEATURE_INVERTED, false);
+ if (featureInverted == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Feature) {
+ // Handle FeatureInverting owned by the featureInverted.
+ obj.setFeatureInverted((Feature)owner);
+ } else {
+ // Handle featureInverted that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setFeatureInverted((Feature)ownedRelatedElements.get(0));
+ }
+ }
+ }
+
+ // If the invertingFeature is empty, then set it to the last ownedRelatedElement
+ // (which will be a Feature chain).
+ Object invertingFeature = obj.eGet(SysMLPackage.Literals.FEATURE_INVERTING__INVERTING_FEATURE, false);
+ if (invertingFeature == null) {
+ // Handle invertingFeature that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setInvertingFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureMembershipParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureMembershipParserPostProcessor.java
new file mode 100644
index 0000000000..ed21f26532
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureMembershipParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.FeatureMembership;
+
+public class FeatureMembershipParserPostProcessor extends OwningMembershipParserPostProcessor {
+
+ public FeatureMembershipParserPostProcessor(FeatureMembership element) {
+ super(element);
+ }
+
+ public FeatureMembership getTarget() {
+ return (FeatureMembership)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureParserPostProcessor.java
new file mode 100644
index 0000000000..66de09d534
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureParserPostProcessor.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Feature;
+
+public class FeatureParserPostProcessor extends TypeParserPostProcessor {
+
+ public FeatureParserPostProcessor(Feature element) {
+ super(element);
+ }
+
+ @Override
+ public Feature getTarget() {
+ return (Feature)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ setIsVariableIfConstant();
+ }
+
+ protected void setIsVariableIfConstant() {
+ Feature target = getTarget();
+ if (target.isConstant()) {
+ target.setIsVariable(true);
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureTypingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureTypingParserPostProcessor.java
new file mode 100644
index 0000000000..678360c992
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/FeatureTypingParserPostProcessor.java
@@ -0,0 +1,56 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.FeatureTyping;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class FeatureTypingParserPostProcessor extends SpecializationParserPostProcessor {
+
+ public FeatureTypingParserPostProcessor(FeatureTyping element) {
+ super(element);
+ }
+
+ @Override
+ public FeatureTyping getTarget() {
+ return (FeatureTyping)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ FeatureTyping obj = getTarget();
+
+ // If the type is empty, then set it to the first owned related element
+ // (which will be a Feature chain).
+ Object type = obj.eGet(SysMLPackage.Literals.FEATURE_TYPING__TYPE, false);
+ if (type == null) {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setType((Feature)ownedRelatedElements.get(0));
+ }
+ }
+
+ // If the typedFeature is empty, then set it to the owningRelatedElement (if that is a Feature).
+ Object typedFeature = obj.eGet(SysMLPackage.Literals.FEATURE_TYPING__TYPED_FEATURE, false);
+ if (typedFeature == null) {
+ Element owningRelatedElement = obj.getOwningRelatedElement();
+ if (owningRelatedElement instanceof Feature) {
+ obj.setTypedFeature((Feature) owningRelatedElement);
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ImportParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ImportParserPostProcessor.java
new file mode 100644
index 0000000000..2e236b11d1
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ImportParserPostProcessor.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Import;
+import org.omg.sysml.lang.sysml.Namespace;
+import org.omg.sysml.lang.sysml.NamespaceImport;
+import org.omg.sysml.lang.sysml.VisibilityKind;
+
+public class ImportParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public ImportParserPostProcessor(Import element) {
+ super(element);
+ }
+
+ @Override
+ public Import getTarget() {
+ return (Import)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+
+ // If the target Import is for a filtered import package, set its visibility to PUBLIC.
+ Import target = getTarget();
+ Namespace owningNamespace = target.getImportOwningNamespace();
+ if (owningNamespace != null && owningNamespace.getOwningRelationship() instanceof NamespaceImport) {
+ target.setVisibility(VisibilityKind.PUBLIC);
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/IntersectingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/IntersectingParserPostProcessor.java
new file mode 100644
index 0000000000..37796b787b
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/IntersectingParserPostProcessor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Intersecting;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class IntersectingParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public IntersectingParserPostProcessor(Intersecting element) {
+ super(element);
+ }
+
+ @Override
+ public Intersecting getTarget() {
+ return (Intersecting)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Intersecting obj = getTarget();
+
+ // If a Intersecting is parsed targeting a Feature chain, then the intersectingType will be empty,
+ // but the Intersecting will own the intersectingType. So, in this case, the intersectingType should
+ // be set to the (last) ownedRelatedelement.
+ Object intersectingType = obj.eGet(SysMLPackage.Literals.INTERSECTING__INTERSECTING_TYPE, false);
+ if (intersectingType == null) {
+ // Handle a intersectingType that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setIntersectingType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/KerMLParserPostProcessorFactory.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/KerMLParserPostProcessorFactory.java
new file mode 100644
index 0000000000..2f0cae8ea2
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/KerMLParserPostProcessorFactory.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.*;
+import org.omg.sysml.lang.sysml.util.SysMLSwitch;
+
+public final class KerMLParserPostProcessorFactory {
+
+ public static ElementParserPostProcessor getPostProcessor(Element element) {
+ return element == null ? null : SWITCH.doSwitch(element);
+ }
+
+ private KerMLParserPostProcessorFactory() {
+ }
+
+ private static final SysMLSwitch SWITCH = new KerMLFactoryPostProcessorSwitch();
+
+ public static class KerMLFactoryPostProcessorSwitch extends SysMLSwitch {
+
+ @Override
+ public ElementParserPostProcessor caseAnnotatingElement(AnnotatingElement element) {
+ return new AnnotatingElementParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseAnnotation(Annotation element) {
+ return new AnnotationParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseClassifier(Classifier element) {
+ return new ClassifierParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseComment(Comment element) {
+ return new CommentParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseConjugation(Conjugation element) {
+ return new ConjugationParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseDependency(Dependency element) {
+ return new DependencyParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseDifferencing(Differencing element) {
+ return new DifferencingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseDisjoining(Disjoining element) {
+ return new DisjoiningParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseElement(Element element) {
+ return new ElementParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseEndFeatureMembership(EndFeatureMembership element) {
+ return new EndFeatureMembershipParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseExpression(Expression element) {
+ return new ExpressionParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseFeature(Feature element) {
+ return new FeatureParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseFeatureMembership(FeatureMembership element) {
+ return new FeatureMembershipParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseFeatureInverting(FeatureInverting element) {
+ return new FeatureInvertingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseFeatureTyping(FeatureTyping element) {
+ return new FeatureTypingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseImport(Import element) {
+ return new ImportParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseIntersecting(Intersecting element) {
+ return new IntersectingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseLiteralExpression(LiteralExpression element) {
+ return new LiteralExpressionParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseLiteralString(LiteralString element) {
+ return new LiteralStringParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseMembership(Membership element) {
+ return new MembershipParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseNamespace(Namespace element) {
+ return new NamespaceParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseNamespaceImport(NamespaceImport element) {
+ return new NamespaceImportParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseParameterMembership(ParameterMembership element) {
+ return new ParameterMembershipParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseRedefinition(Redefinition element) {
+ return new RedefinitionParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseReferenceSubsetting(ReferenceSubsetting element) {
+ return new ReferenceSubsettingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseRelationship(Relationship element) {
+ return new RelationshipParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseSpecialization(Specialization element) {
+ return new SpecializationParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseStep(Step element) {
+ return new StepParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseSubclassification(Subclassification element) {
+ return new SubclassificationParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseSubsetting(Subsetting element) {
+ return new SubsettingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseTextualRepresentation(TextualRepresentation element) {
+ return new TextualRepresentationParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseType(Type element) {
+ return new TypeParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseTypeFeaturing(TypeFeaturing element) {
+ return new TypeFeaturingParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseUnioning(Unioning element) {
+ return new UnioningParserPostProcessor(element);
+ }
+
+ };
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/LiteralExpressionParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/LiteralExpressionParserPostProcessor.java
new file mode 100644
index 0000000000..e267e23e20
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/LiteralExpressionParserPostProcessor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.LiteralExpression;
+
+public class LiteralExpressionParserPostProcessor extends ExpressionParserPostProcessor {
+
+ public LiteralExpressionParserPostProcessor(LiteralExpression element) {
+ super(element);
+ }
+
+ @Override
+ public LiteralExpression getTarget() {
+ return (LiteralExpression)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/LiteralStringParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/LiteralStringParserPostProcessor.java
new file mode 100644
index 0000000000..c8b04ebed7
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/LiteralStringParserPostProcessor.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.LiteralString;
+import org.omg.sysml.util.ElementUtil;
+
+public class LiteralStringParserPostProcessor extends LiteralExpressionParserPostProcessor {
+
+ public LiteralStringParserPostProcessor(LiteralString element) {
+ super(element);
+ }
+
+ @Override
+ public LiteralString getTarget() {
+ return (LiteralString)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ LiteralString target = getTarget();
+ target.setValue(ElementUtil.unescapeString(target.getValue()));
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/MembershipParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/MembershipParserPostProcessor.java
new file mode 100644
index 0000000000..ecac70caf5
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/MembershipParserPostProcessor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Membership;
+import org.omg.sysml.lang.sysml.OwningMembership;
+import org.omg.sysml.util.ElementUtil;
+
+public class MembershipParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public MembershipParserPostProcessor(Membership element) {
+ super(element);
+ }
+
+ @Override
+ public Membership getTarget() {
+ return (Membership)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Membership target = getTarget();
+ if (!(target instanceof OwningMembership)) {
+ target.setMemberName(ElementUtil.unescapeString(target.getMemberName()));
+ target.setMemberShortName(ElementUtil.unescapeString(target.getMemberShortName()));
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/NamespaceImportParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/NamespaceImportParserPostProcessor.java
new file mode 100644
index 0000000000..f2c4c200f1
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/NamespaceImportParserPostProcessor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.NamespaceImport;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+import org.omg.sysml.lang.sysml.Namespace;
+
+public class NamespaceImportParserPostProcessor extends ImportParserPostProcessor {
+
+ public NamespaceImportParserPostProcessor(NamespaceImport element) {
+ super(element);
+ }
+
+ @Override
+ public NamespaceImport getTarget() {
+ return (NamespaceImport)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+
+ NamespaceImport obj = getTarget();
+ // If importedNamespace is empty, then set it to the first ownedRelatedElement, if this is a namespace
+ // (filling in the implicit import for a filter package). Otherwise, set it to the importOwningNamspace.
+ Object importedNamespace = obj.eGet(SysMLPackage.Literals.NAMESPACE_IMPORT__IMPORTED_NAMESPACE, false);
+ if (importedNamespace == null) {
+ EList ownedRelatedElement = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElement.isEmpty() && ownedRelatedElement.get(0) instanceof Namespace) {
+ // Fill in the implicit import for a filter package.
+ obj.setImportedNamespace((Namespace)ownedRelatedElement.get(0));
+ } else {
+ obj.setImportedNamespace(obj.getImportOwningNamespace());
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/NamespaceParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/NamespaceParserPostProcessor.java
new file mode 100644
index 0000000000..a3c788e522
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/NamespaceParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Namespace;
+
+public class NamespaceParserPostProcessor extends ElementParserPostProcessor {
+
+ public NamespaceParserPostProcessor(Namespace element) {
+ super(element);
+ }
+
+ public Namespace getTarget() {
+ return (Namespace)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/OwningMembershipParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/OwningMembershipParserPostProcessor.java
new file mode 100644
index 0000000000..ac6d90e07d
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/OwningMembershipParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.OwningMembership;
+
+public class OwningMembershipParserPostProcessor extends MembershipParserPostProcessor {
+
+ public OwningMembershipParserPostProcessor(OwningMembership element) {
+ super(element);
+ }
+
+ public OwningMembership getTarget() {
+ return (OwningMembership)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ParameterMembershipParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ParameterMembershipParserPostProcessor.java
new file mode 100644
index 0000000000..e1679649b5
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ParameterMembershipParserPostProcessor.java
@@ -0,0 +1,38 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.ParameterMembership;
+
+public class ParameterMembershipParserPostProcessor extends FeatureMembershipParserPostProcessor {
+
+ public ParameterMembershipParserPostProcessor(ParameterMembership element) {
+ super(element);
+ }
+
+ @Override
+ public ParameterMembership getTarget() {
+ return (ParameterMembership)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ ParameterMembership target = getTarget();
+ Feature parameter = target.getOwnedMemberParameter();
+ if (parameter != null) {
+ parameter.setDirection(target.parameterDirection());
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/RedefinitionParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/RedefinitionParserPostProcessor.java
new file mode 100644
index 0000000000..0cfdfa16ce
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/RedefinitionParserPostProcessor.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.Redefinition;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class RedefinitionParserPostProcessor extends SubsettingParserPostProcessor {
+
+ public RedefinitionParserPostProcessor(Redefinition element) {
+ super(element);
+ }
+
+ @Override
+ public Redefinition getTarget() {
+ return (Redefinition)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Redefinition obj = getTarget();
+
+ // If the redefiningFeature is empty, then set it to the owningRelatedElement, if that is a Feature.
+ // Otherwise, set it to the first ownedRelatedElement (which will be a Feature chain).
+ Object redefiningFeature = obj.eGet(SysMLPackage.Literals.REDEFINITION__REDEFINING_FEATURE, false);
+ if (redefiningFeature == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Feature) {
+ obj.setRedefiningFeature((Feature) owner);
+ } else {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setRedefiningFeature((Feature)ownedRelatedElements.get(0));
+ }
+ }
+ }
+
+ Object redefinedFeature = obj.eGet(SysMLPackage.Literals.REDEFINITION__REDEFINED_FEATURE, false);
+ if (redefinedFeature == null) {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setRedefinedFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ReferenceSubsettingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ReferenceSubsettingParserPostProcessor.java
new file mode 100644
index 0000000000..1254527ac5
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/ReferenceSubsettingParserPostProcessor.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.ReferenceSubsetting;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class ReferenceSubsettingParserPostProcessor extends SubsettingParserPostProcessor {
+
+ public ReferenceSubsettingParserPostProcessor(ReferenceSubsetting element) {
+ super(element);
+ }
+
+ @Override
+ public ReferenceSubsetting getTarget() {
+ return (ReferenceSubsetting)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ ReferenceSubsetting obj = getTarget();
+
+ // If the referencedFeature is empty, then set it to the last ownedRelatedElement
+ // (which will be a Feature chain).
+ Object referencedFeature = obj.eGet(SysMLPackage.Literals.REFERENCE_SUBSETTING__REFERENCED_FEATURE, false);
+ if (referencedFeature == null) {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setReferencedFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/RelationshipParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/RelationshipParserPostProcessor.java
new file mode 100644
index 0000000000..f8364b13f6
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/RelationshipParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Relationship;
+
+public class RelationshipParserPostProcessor extends ElementParserPostProcessor {
+
+ public RelationshipParserPostProcessor(Relationship element) {
+ super(element);
+ }
+
+ public Relationship getTarget() {
+ return (Relationship)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SpecializationParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SpecializationParserPostProcessor.java
new file mode 100644
index 0000000000..9d90eff0d2
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SpecializationParserPostProcessor.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Specialization;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+import org.omg.sysml.lang.sysml.Type;
+
+public class SpecializationParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public SpecializationParserPostProcessor(Specialization element) {
+ super(element);
+ }
+
+ @Override
+ public Specialization getTarget() {
+ return (Specialization)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Specialization obj = getTarget();
+
+ // If general is empty, then set it to the last ownedRelatedElement (which will be a Feature chain).
+ Object general = obj.eGet(SysMLPackage.Literals.SPECIALIZATION__GENERAL, false);
+ if (general == null) {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setGeneral((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+
+ // If specific is empty, then set it to the owningRelatedElement, if that is a Type.
+ // Otherwise set it to the first ownedRelatedElement (which will be a FeatureChain).
+ Object specific = obj.eGet(SysMLPackage.Literals.SPECIALIZATION__SPECIFIC, false);
+ if (specific == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Type) {
+ obj.setSpecific((Type)owner);
+ } else {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setSpecific((Feature)ownedRelatedElements.get(0));
+ }
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/StepParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/StepParserPostProcessor.java
new file mode 100644
index 0000000000..6ff9410d85
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/StepParserPostProcessor.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Step;
+
+public class StepParserPostProcessor extends FeatureParserPostProcessor {
+
+ public StepParserPostProcessor(Step element) {
+ super(element);
+ }
+
+ @Override
+ public Step getTarget() {
+ return (Step)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SubclassificationParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SubclassificationParserPostProcessor.java
new file mode 100644
index 0000000000..87e4fb0f2e
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SubclassificationParserPostProcessor.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Classifier;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Subclassification;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class SubclassificationParserPostProcessor extends SpecializationParserPostProcessor {
+
+ public SubclassificationParserPostProcessor(Subclassification element) {
+ super(element);
+ }
+
+ @Override
+ public Subclassification getTarget() {
+ return (Subclassification)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Subclassification obj = getTarget();
+
+ // If the subclassifier is empty, then set it to the owningRelatedElement,
+ // if this is a Classifier.
+ Object subclassifier = obj.eGet(SysMLPackage.Literals.SUBCLASSIFICATION__SUBCLASSIFIER, false);
+ if (subclassifier == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Classifier) {
+ obj.setSubclassifier((Classifier) owner);
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SubsettingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SubsettingParserPostProcessor.java
new file mode 100644
index 0000000000..7b0978f60b
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/SubsettingParserPostProcessor.java
@@ -0,0 +1,62 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.Subsetting;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class SubsettingParserPostProcessor extends SpecializationParserPostProcessor {
+
+ public SubsettingParserPostProcessor(Subsetting element) {
+ super(element);
+ }
+
+ @Override
+ public Subsetting getTarget() {
+ return (Subsetting)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Subsetting obj = getTarget();
+
+ // If the subsettedFeature is empty, then set it to the last ownedRelatedElement
+ // (which will be a Feature chain).
+ Object subsettedFeature = obj.eGet(SysMLPackage.Literals.SUBSETTING__SUBSETTED_FEATURE, false);
+ if (subsettedFeature == null) {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setSubsettedFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+
+ // If the subsettingFeature is empty, then set it to the owningRelatedFeature, if this is a Feature.
+ // Otherwise set it to the first ownedRelatedElement (which will be a Feature chain).
+ Object subsettingFeature = obj.eGet(SysMLPackage.Literals.SUBSETTING__SUBSETTING_FEATURE, false);
+ if (subsettingFeature == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Feature) {
+ obj.setSubsettingFeature((Feature) owner);
+ } else {
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setSubsettingFeature((Feature)ownedRelatedElements.get(0));
+ }
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TextualRepresentationParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TextualRepresentationParserPostProcessor.java
new file mode 100644
index 0000000000..9d00c2b001
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TextualRepresentationParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.TextualRepresentation;
+import org.omg.sysml.util.ElementUtil;
+
+public class TextualRepresentationParserPostProcessor extends AnnotatingElementParserPostProcessor {
+
+ public TextualRepresentationParserPostProcessor(TextualRepresentation element) {
+ super(element);
+ }
+
+ @Override
+ public TextualRepresentation getTarget() {
+ return (TextualRepresentation)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ TextualRepresentation target = getTarget();
+ target.setLanguage(ElementUtil.unescapeString(target.getLanguage()));
+ target.setBody(ElementUtil.processCommentBody(target.getBody()));
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TypeFeaturingParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TypeFeaturingParserPostProcessor.java
new file mode 100644
index 0000000000..9cab264106
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TypeFeaturingParserPostProcessor.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.TypeFeaturing;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class TypeFeaturingParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public TypeFeaturingParserPostProcessor(TypeFeaturing element) {
+ super(element);
+ }
+
+ @Override
+ public TypeFeaturing getTarget() {
+ return (TypeFeaturing)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ TypeFeaturing obj = getTarget();
+
+ // If the featureOfType is empty, then set it to the owningRelatedElement (if this is a Feature).
+ Object featureOfType = obj.eGet(SysMLPackage.Literals.TYPE_FEATURING__FEATURE_OF_TYPE, false);
+ if (featureOfType == null) {
+ Element owner = obj.getOwningRelatedElement();
+ if (owner instanceof Feature) {
+ obj.setFeatureOfType((Feature)owner);
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TypeParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TypeParserPostProcessor.java
new file mode 100644
index 0000000000..a011a39338
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/TypeParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.Type;
+
+public class TypeParserPostProcessor extends NamespaceParserPostProcessor {
+
+ public TypeParserPostProcessor(Type element) {
+ super(element);
+ }
+
+ public Type getTarget() {
+ return (Type)super.getTarget();
+ }
+
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/UnioningParserPostProcessor.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/UnioningParserPostProcessor.java
new file mode 100644
index 0000000000..754b88e0ba
--- /dev/null
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/postprocessing/UnioningParserPostProcessor.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.kerml.xtext.postprocessing;
+
+import org.eclipse.emf.common.util.EList;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.Unioning;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class UnioningParserPostProcessor extends RelationshipParserPostProcessor {
+
+ public UnioningParserPostProcessor(Unioning element) {
+ super(element);
+ }
+
+ @Override
+ public Unioning getTarget() {
+ return (Unioning)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Unioning obj = getTarget();
+
+ // If a Unioning is parsed targeting a Feature chain, then the unioningType will be empty,
+ // but the Unioning will own the unioningType. So, in this case, the unioningType should
+ // be set to the (last) ownedRelatedelement.
+ Object unioningType = obj.eGet(SysMLPackage.Literals.UNIONING__UNIONING_TYPE, false);
+ if (unioningType == null) {
+ // Handle a intersectingType that is a Feature chain.
+ EList ownedRelatedElements = obj.getOwnedRelatedElement();
+ if (!ownedRelatedElements.isEmpty()) {
+ obj.setUnioningType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
+ }
+ }
+ }
+}
diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/scoping/KerMLLinker.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/scoping/KerMLLinker.java
index a03d9faa7b..780e615412 100644
--- a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/scoping/KerMLLinker.java
+++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/scoping/KerMLLinker.java
@@ -2,6 +2,7 @@
* SysML 2 Pilot Implementation
* Copyright (c) 2020-2021, 2024, 2026 Model Driven Solutions, Inc.
* Copyright (c) 2024 Budapest University of Technology and Economics
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -35,9 +36,10 @@
import org.eclipse.xtext.linking.lazy.LazyLinker;
import org.eclipse.xtext.util.OnChangeEvictingCache;
import org.eclipse.xtext.util.concurrent.IUnitOfWork;
+import org.omg.kerml.xtext.postprocessing.ElementParserPostProcessor;
+import org.omg.kerml.xtext.postprocessing.KerMLParserPostProcessorFactory;
import org.omg.sysml.lang.sysml.Element;
import org.omg.sysml.lang.sysml.SysMLPackage;
-import org.omg.sysml.util.ElementUtil;
import com.google.inject.Inject;
@@ -73,11 +75,16 @@ public void process(Resource state) throws Exception {
TreeIterator iterator = getAllLinkableContents(model);
while (iterator.hasNext()) {
EObject obj = iterator.next();
- if (obj instanceof Element) {
- ElementUtil.postProcess((Element)obj);
+ if (obj instanceof Element element) {
+ doGetPostProcessor(element).postProcess();
}
}
}
+
});
}
+
+ protected ElementParserPostProcessor doGetPostProcessor(Element element) {
+ return KerMLParserPostProcessorFactory.getPostProcessor(element);
+ }
}
diff --git a/org.omg.sysml.interactive.tests/META-INF/MANIFEST.MF b/org.omg.sysml.interactive.tests/META-INF/MANIFEST.MF
index 28cea1dd5e..616c070a38 100644
--- a/org.omg.sysml.interactive.tests/META-INF/MANIFEST.MF
+++ b/org.omg.sysml.interactive.tests/META-INF/MANIFEST.MF
@@ -11,4 +11,6 @@ Require-Bundle: org.omg.sysml.interactive;bundle-version="0.62.0",
org.omg.sysml.model.bundle;bundle-version="0.62.0",
org.omg.sysml.logic.bundle;bundle-version="0.62.0",
org.omg.sysml;bundle-version="0.62.0",
- org.eclipse.xtext;bundle-version="2.22.0"
+ org.eclipse.xtext;bundle-version="2.22.0",
+ org.omg.kerml.xtext;bundle-version="0.62.0",
+ org.omg.sysml.xtext;bundle-version="0.62.0"
diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ParserPostProcessorTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ParserPostProcessorTest.java
new file mode 100644
index 0000000000..7ee12a749f
--- /dev/null
+++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ParserPostProcessorTest.java
@@ -0,0 +1,173 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 ModelDrivenSolutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.sysml.interactive.tests;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.omg.kerml.xtext.postprocessing.ElementParserPostProcessor;
+import org.omg.kerml.xtext.postprocessing.ImportParserPostProcessor;
+import org.omg.kerml.xtext.postprocessing.LiteralStringParserPostProcessor;
+import org.omg.sysml.xtext.postprocessing.ConnectionUsageParserPostProcessor;
+import org.omg.sysml.xtext.postprocessing.ItemUsageParserPostProcessor;
+import org.omg.sysml.xtext.postprocessing.OccurrenceUsageParserPostProcessor;
+import org.omg.sysml.xtext.postprocessing.PartUsageParserPostProcessor;
+import org.omg.sysml.xtext.postprocessing.PortUsageParserPostProcessor;
+import org.omg.sysml.xtext.postprocessing.SysMLParserPostProcessorFactory;
+import org.omg.kerml.xtext.postprocessing.RedefinitionParserPostProcessor;
+import org.omg.sysml.lang.sysml.ConnectionUsage;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Feature;
+import org.omg.sysml.lang.sysml.FeatureDirectionKind;
+import org.omg.sysml.lang.sysml.LiteralString;
+import org.omg.sysml.lang.sysml.OccurrenceUsage;
+import org.omg.sysml.lang.sysml.OwningMembership;
+import org.omg.sysml.lang.sysml.PartUsage;
+import org.omg.sysml.lang.sysml.PortUsage;
+import org.omg.sysml.lang.sysml.PortionKind;
+import org.omg.sysml.lang.sysml.SysMLFactory;
+import org.omg.sysml.lang.sysml.Usage;
+import org.omg.sysml.util.TypeUtil;
+
+public class ParserPostProcessorTest extends SysMLInteractiveTest {
+
+ @Test
+ public void factorySelectsTheMostSpecificParserPostProcessorWithoutAttachingIt() {
+ PortUsage port = SysMLFactory.eINSTANCE.createPortUsage();
+ int adapterCount = port.eAdapters().size();
+ ElementParserPostProcessor portPostProcessor = SysMLParserPostProcessorFactory.getPostProcessor(port);
+ assertTrue(portPostProcessor instanceof PortUsageParserPostProcessor);
+ assertNotSame(portPostProcessor, SysMLParserPostProcessorFactory.getPostProcessor(port));
+ assertEquals(adapterCount, port.eAdapters().size());
+
+ OccurrenceUsage occurrence = SysMLFactory.eINSTANCE.createOccurrenceUsage();
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(occurrence) instanceof OccurrenceUsageParserPostProcessor);
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createConnectionUsage())
+ instanceof ConnectionUsageParserPostProcessor);
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createAllocationUsage())
+ instanceof ConnectionUsageParserPostProcessor);
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createInterfaceUsage())
+ instanceof ConnectionUsageParserPostProcessor);
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createPartUsage())
+ instanceof PartUsageParserPostProcessor);
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createItemUsage())
+ instanceof ItemUsageParserPostProcessor);
+
+ LiteralString literal = SysMLFactory.eINSTANCE.createLiteralString();
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(literal) instanceof LiteralStringParserPostProcessor);
+
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createRedefinition())
+ instanceof RedefinitionParserPostProcessor);
+ assertTrue(SysMLParserPostProcessorFactory.getPostProcessor(SysMLFactory.eINSTANCE.createMembershipImport())
+ instanceof ImportParserPostProcessor);
+
+ }
+
+ @Test
+ public void parserPostProcessorHierarchyPreservesSpecialCaseBehavior() {
+ Feature feature = SysMLFactory.eINSTANCE.createFeature();
+ feature.setDeclaredName("'a name'");
+ feature.setIsConstant(true);
+ postProcess(feature);
+ assertEquals("a name", feature.getDeclaredName());
+ assertTrue(feature.isVariable());
+
+ Usage usage = SysMLFactory.eINSTANCE.createAttributeUsage();
+ usage.setIsConstant(true);
+ postProcess(usage);
+ assertFalse(usage.isVariable());
+
+ OccurrenceUsage occurrence = SysMLFactory.eINSTANCE.createOccurrenceUsage();
+ occurrence.setPortionKind(PortionKind.SNAPSHOT);
+ postProcess(occurrence);
+ assertTrue(occurrence.isPortion());
+
+ PortUsage port = SysMLFactory.eINSTANCE.createPortUsage();
+ port.setPortionKind(PortionKind.SNAPSHOT);
+ postProcess(port);
+ assertTrue(port.isPortion());
+
+ ConnectionUsage connection = SysMLFactory.eINSTANCE.createConnectionUsage();
+ connection.setPortionKind(PortionKind.SNAPSHOT);
+ postProcess(connection);
+ assertTrue(connection.isPortion());
+
+ LiteralString literal = SysMLFactory.eINSTANCE.createLiteralString();
+ literal.setValue("\"hello\\nworld\"");
+ postProcess(literal);
+ assertEquals("hello\nworld", literal.getValue());
+ }
+
+ protected static void postProcess(Element... elements) {
+ for (Element element : elements) {
+ int adapterCount = element.eAdapters().size();
+ SysMLParserPostProcessorFactory.getPostProcessor(element).postProcess();
+ assertEquals(adapterCount, element.eAdapters().size());
+ }
+ }
+
+ protected static PartUsage createPartUsage() {
+ return SysMLFactory.eINSTANCE.createPartUsage();
+ }
+
+ protected static PartUsage createPartUsageOwnedByFeatureMembership() {
+ PartUsage owner = createPartUsage();
+ PartUsage usage = createPartUsage();
+ usage.setIsComposite(true);
+ TypeUtil.addOwnedFeatureTo(owner, usage);
+ return usage;
+ }
+
+ @Test
+ public void postProcessPreservesCompositeUsageOwnedByFeatureMembership() {
+ PartUsage usage = createPartUsageOwnedByFeatureMembership();
+
+ postProcess(usage);
+
+ assertTrue(usage.isComposite());
+ }
+
+ @Test
+ public void postProcessMakesDirectedUsageNonComposite() {
+ PartUsage usage = createPartUsageOwnedByFeatureMembership();
+ usage.setDirection(FeatureDirectionKind.IN);
+
+ postProcess(usage);
+
+ assertFalse(usage.isComposite());
+ }
+
+ @Test
+ public void postProcessMakesEndUsageNonComposite() {
+ PartUsage usage = createPartUsageOwnedByFeatureMembership();
+ usage.setIsEnd(true);
+
+ postProcess(usage);
+
+ assertFalse(usage.isComposite());
+ }
+
+ @Test
+ public void postProcessMakesUsageOutsideFeatureMembershipNonComposite() {
+ PartUsage usage = createPartUsage();
+ OwningMembership membership = SysMLFactory.eINSTANCE.createOwningMembership();
+ membership.setOwnedMemberElement(usage);
+
+ postProcess(usage);
+
+ assertFalse(usage.isComposite());
+ }
+}
diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/UsagePostProcessTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/UsagePostProcessTest.java
new file mode 100644
index 0000000000..ac033a18c0
--- /dev/null
+++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/UsagePostProcessTest.java
@@ -0,0 +1,104 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo.
+ * Copyright (c) 2026 Model Driveh 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.
+ * (at your option) any later version.
+ *
+ * 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 theEclipse Public License
+ * along with this program. If not, see .
+ *
+ * @license EPL-2.0
+ *
+ *******************************************************************************/
+package org.omg.sysml.interactive.tests;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.List;
+
+import org.junit.Test;
+import org.omg.sysml.lang.sysml.Definition;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.Namespace;
+import org.omg.sysml.lang.sysml.Usage;
+
+public class UsagePostProcessTest extends SysMLInteractiveTest{
+
+ public static final String TEST =
+ " package Test {\n"
+ + " part p {\n"
+ + " attribute a;\n"
+ + " part x;\n"
+ + " in part y;\n"
+ + " variation occurrence z {\n"
+ + " variant variation part u {\n"
+ + " variant part v;\n"
+ + " }\n"
+ + " variant port w;\n"
+ + " }\n"
+ + " }\n"
+ + " variation part q {\n"
+ + " variant part r;\n"
+ + " }\n"
+ + " attribute def B {\n"
+ + " part p1;\n"
+ + " }\n"
+ + " attribute b {\n"
+ + " part p2;\n"
+ + " }\n"
+ + " }\n";
+
+ /**
+ * Test that Usage postProcess sets the property "composite" to false in appropriate cases.
+ * @throws InvocationTargetException
+ */
+ @Test
+ public void testSettingCompositeToFalse() throws InvocationTargetException {
+ List elements = process(TEST);
+ Namespace test = (Namespace)elements.get(0);
+ Usage p = (Usage) test.getOwnedMember().get(0);
+ Usage a = (Usage) p.getOwnedMember().get(0);
+ Usage x = (Usage) p.getOwnedMember().get(1);
+ Usage y = (Usage) p.getOwnedMember().get(2);
+ Usage z = (Usage) p.getOwnedMember().get(3);;
+ Usage u = (Usage) z.getOwnedMember().get(0);
+ Usage v = (Usage) u.getOwnedMember().get(0);;
+ Usage w = (Usage) z.getOwnedMember().get(1);
+
+ Usage q = (Usage) test.getOwnedMember().get(1);
+ Usage r = (Usage) q.getOwnedMember().get(0);
+
+ Definition B = (Definition) test.getOwnedMember().get(2);
+ Usage p1 = (Usage) B.getOwnedMember().get(0);
+
+ Usage b = (Usage) test.getOwnedMember().get(3);
+ Usage p2 = (Usage) b.getOwnedMember().get(0);
+
+ assertTrue(p.isReference());
+ assertTrue(a.isReference());
+ assertFalse(x.isReference());
+ assertTrue(y.isReference());
+ assertFalse(z.isReference());
+ assertFalse(u.isReference());
+ assertFalse(v.isReference());
+ assertTrue(w.isReference());
+ assertTrue(q.isReference());
+ assertTrue(r.isReference());
+
+ assertTrue(p1.isReference());
+ assertTrue(b.isReference());
+ assertTrue(p2.isReference());
+ }
+
+}
diff --git a/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.62.0-SNAPSHOT.jar b/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.62.0-SNAPSHOT.jar
index 56c2da7b4a..2b7ec9ef06 100644
Binary files a/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.62.0-SNAPSHOT.jar and b/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.62.0-SNAPSHOT.jar differ
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/AnnotationAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/AnnotationAdapter.java
index 65addbb32e..1063a0e91e 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/AnnotationAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/AnnotationAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024, 2025 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,10 +22,7 @@
package org.omg.sysml.adapter;
-import org.omg.sysml.lang.sysml.AnnotatingElement;
import org.omg.sysml.lang.sysml.Annotation;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class AnnotationAdapter extends RelationshipAdapter {
@@ -37,18 +35,5 @@ public Annotation getTarget() {
return (Annotation)super.getTarget();
}
- @Override
- public void postProcess() {
- Annotation obj = getTarget();
-
- // If the Annotation is not owned by an AnnotatingElement, then the annotatedElement is the owningRelatedElement.
- Object annotatedElement = obj.eGet(SysMLPackage.Literals.ANNOTATION__ANNOTATED_ELEMENT, false);
- if (annotatedElement == null) {
- Element owningRelatedElement = obj.getOwningRelatedElement();
- if (!(owningRelatedElement instanceof AnnotatingElement)) {
- obj.setAnnotatedElement(owningRelatedElement);
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/CommentAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/CommentAdapter.java
index 2d60c5dac8..daad363411 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/CommentAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/CommentAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -19,7 +20,6 @@
package org.omg.sysml.adapter;
import org.omg.sysml.lang.sysml.Comment;
-import org.omg.sysml.util.ElementUtil;
public class CommentAdapter extends AnnotatingElementAdapter {
@@ -32,11 +32,4 @@ public Comment getTarget() {
return (Comment)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
- Comment target = getTarget();
- target.setLocale(ElementUtil.unescapeString(target.getLocale()));
- target.setBody(ElementUtil.processCommentBody(target.getBody()));
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConjugationAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConjugationAdapter.java
index 60a890242f..b215db2898 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConjugationAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ConjugationAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.Conjugation;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.SysMLPackage;
-import org.omg.sysml.lang.sysml.Type;
public class ConjugationAdapter extends RelationshipAdapter {
@@ -38,33 +35,5 @@ public Conjugation getTarget() {
return (Conjugation)super.getTarget();
}
- @Override
- public void postProcess() {
- Conjugation obj = getTarget();
-
- // If the conjugatedType is not set, then set it to the owningRelatedElement, if this is a Type,
- // otherwise set it to the first ownedRelatedElement.
- Object conjugatedType = obj.eGet(SysMLPackage.Literals.CONJUGATION__CONJUGATED_TYPE, false);
- if (conjugatedType == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Type) {
- obj.setConjugatedType((Type)owner);
- } else {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setConjugatedType((Type)ownedRelatedElements.get(0));
- }
- }
- }
-
- // If the originalType is not set, set it to the last ownedRelatedElement.
- Object originalType = obj.eGet(SysMLPackage.Literals.CONJUGATION__ORIGINAL_TYPE, false);
- if (originalType == null) {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setOriginalType((Type)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DefinitionAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DefinitionAdapter.java
index b6f92f314a..c3046a8c68 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DefinitionAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DefinitionAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021, 2024, 2025 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -33,13 +34,5 @@ public Definition getTarget() {
return (Definition)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
- Definition target = getTarget();
- if (target.isVariation()) {
- target.setIsAbstract(true);
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DependencyAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DependencyAdapter.java
index 0cf60033eb..81a4dd8659 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DependencyAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DependencyAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -20,10 +21,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
import org.omg.sysml.lang.sysml.Dependency;
-import org.omg.sysml.lang.sysml.Element;
public class DependencyAdapter extends RelationshipAdapter {
@@ -35,13 +33,4 @@ public Dependency getTarget() {
return (Dependency)super.getTarget();
}
- public void postProcess() {
- Dependency target = getTarget();
-
- // Add all ownedRelatedElements to supplier.
- EObjectResolvingEList suppliers = (EObjectResolvingEList)target.getSupplier();
- EList ownedRelatedElements = target.getOwnedRelatedElement();
- ownedRelatedElements.stream().forEachOrdered(suppliers::addUnique);
- }
-
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DifferencingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DifferencingAdapter.java
index ba3dbce903..2dad7b313f 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DifferencingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DifferencingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.Differencing;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class DifferencingAdapter extends RelationshipAdapter {
@@ -38,21 +35,5 @@ public Differencing getTarget() {
return (Differencing)super.getTarget();
}
- @Override
- public void postProcess() {
- Differencing obj = getTarget();
-
- // If a Differencing is parsed targeting a Feature chain, then the differencingType will be empty,
- // but the Differencing will own the differencingType. So, in this case, the differencingType should
- // be set to the (last) ownedRelatedelement.
- Object differencingType = obj.eGet(SysMLPackage.Literals.DIFFERENCING__DIFFERENCING_TYPE, false);
- if (differencingType == null) {
- // Handle a differencingType that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setDifferencingType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DisjoiningAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DisjoiningAdapter.java
index 6df64089d0..9bc642f248 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DisjoiningAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/DisjoiningAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,12 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.Disjoining;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
-import org.omg.sysml.lang.sysml.SysMLPackage;
-import org.omg.sysml.lang.sysml.Type;
public class DisjoiningAdapter extends RelationshipAdapter {
@@ -39,39 +35,5 @@ public Disjoining getTarget() {
return (Disjoining)super.getTarget();
}
- @Override
- public void postProcess() {
- Disjoining obj = getTarget();
-
- // If a Disjoining is parsed targeting a Feature chain, then the disjoiningType will be empty,
- // but the Disjoining will own the disjoiningType. So, in this case, the disjoiningType should
- // be set to the (last) ownedRelatedelement.
- Object disjoiningType = obj.eGet(SysMLPackage.Literals.DISJOINING__DISJOINING_TYPE, false);
- if (disjoiningType == null) {
- // Handle a disjoiningType that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setDisjoiningType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
-
- // If the typedDisjoined (source) is empty, set it to the owningRelatedElement, if it is a Type.
- // Otherwise, set it to the first ownedRelatedElement, to the first ownedRelatedElement,
- // which will be a Feature chain.
- Object typeDisjoined = obj.eGet(SysMLPackage.Literals.DISJOINING__TYPE_DISJOINED, false);
- if (typeDisjoined == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Type) {
- // Handle a Disjoining owned by the typeDisjoined.
- obj.setTypeDisjoined((Type)owner);
- } else {
- // Handle a typeDisjoined that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setTypeDisjoined((Feature)ownedRelatedElements.get(0));
- }
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ElementAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ElementAdapter.java
index 454c0371de..7a72a26217 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ElementAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ElementAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021-2022, 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -108,14 +109,6 @@ public MetadataFeature getMetaclassFeature() {
return metaclassFeature;
}
- // Parse post-processing
-
- public void postProcess() {
- Element target = getTarget();
- target.setDeclaredName(ElementUtil.unescapeString(target.getDeclaredName()));
- target.setDeclaredShortName(ElementUtil.unescapeString(target.getDeclaredShortName()));
- }
-
// Transformation
public boolean isTransformed() {
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/EndFeatureMembershipAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/EndFeatureMembershipAdapter.java
index 2684942951..bc65d4adb9 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/EndFeatureMembershipAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/EndFeatureMembershipAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -21,7 +22,6 @@
package org.omg.sysml.adapter;
import org.omg.sysml.lang.sysml.EndFeatureMembership;
-import org.omg.sysml.lang.sysml.Feature;
public class EndFeatureMembershipAdapter extends FeatureMembershipAdapter {
@@ -37,14 +37,4 @@ public EndFeatureMembership getTarget() {
/**
* @satisfies validateEndFeatureMembershipIsEnd
*/
- @Override
- public void postProcess() {
- super.postProcess();
- EndFeatureMembership target = getTarget();
- Feature endFeature = target.getOwnedMemberFeature();
- if (endFeature != null) {
- endFeature.setIsEnd(true);
- }
- }
-
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureAdapter.java
index d24992bd0d..b332f58bf0 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021-2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -75,22 +76,6 @@ public Feature getTarget() {
return (Feature)super.getTarget();
}
- // Post-processing
-
- @Override
- public void postProcess() {
- super.postProcess();
- setIsVariableIfConstant();
- }
-
- // Note: Can be individually overridden.
- protected void setIsVariableIfConstant() {
- Feature target = getTarget();
- if (target.isConstant()) {
- target.setIsVariable(true);
- }
- }
-
// Caching
EList types = null;
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureInvertingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureInvertingAdapter.java
index 0e06748075..587deb2937 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureInvertingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureInvertingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.FeatureInverting;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class FeatureInvertingAdapter extends RelationshipAdapter {
@@ -38,38 +35,5 @@ public FeatureInverting getTarget() {
return (FeatureInverting)super.getTarget();
}
- @Override
- public void postProcess() {
- FeatureInverting obj = getTarget();
-
- // If the featureInverted is empty, then set it to the owningRelatedElement of the FeatureInverting,
- // if that is a Feature, otherwise set it to the first ownedRelatedElement (which will be a
- // Feature chain).
- Object featureInverted = obj.eGet(SysMLPackage.Literals.FEATURE_INVERTING__FEATURE_INVERTED, false);
- if (featureInverted == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Feature) {
- // Handle FeatureInverting owned by the featureInverted.
- obj.setFeatureInverted((Feature)owner);
- } else {
- // Handle featureInverted that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setFeatureInverted((Feature)ownedRelatedElements.get(0));
- }
- }
- }
-
- // If the invertingFeature is empty, then set it to the last ownedRelatedElement
- // (which will be a Feature chain).
- Object invertingFeature = obj.eGet(SysMLPackage.Literals.FEATURE_INVERTING__INVERTING_FEATURE, false);
- if (invertingFeature == null) {
- // Handle invertingFeature that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setInvertingFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureTypingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureTypingAdapter.java
index 441e886617..065f143ed6 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureTypingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FeatureTypingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.FeatureTyping;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class FeatureTypingAdapter extends SpecializationAdapter {
@@ -38,28 +35,5 @@ public FeatureTyping getTarget() {
return (FeatureTyping)super.getTarget();
}
- @Override
- public void postProcess() {
- FeatureTyping obj = getTarget();
-
- // If the type is empty, then set it to the first owned related element
- // (which will be a Feature chain).
- Object type = obj.eGet(SysMLPackage.Literals.FEATURE_TYPING__TYPE, false);
- if (type == null) {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setType((Feature)ownedRelatedElements.get(0));
- }
- }
-
- // If the typedFeature is empty, then set it to the owningRelatedElement (if that is a Feature).
- Object typedFeature = obj.eGet(SysMLPackage.Literals.FEATURE_TYPING__TYPED_FEATURE, false);
- if (typedFeature == null) {
- Element owningRelatedElement = obj.getOwningRelatedElement();
- if (owningRelatedElement instanceof Feature) {
- obj.setTypedFeature((Feature) owningRelatedElement);
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FlowUsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FlowUsageAdapter.java
index fc9c5bd9cd..e27b46fe21 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FlowUsageAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/FlowUsageAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021-2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -103,7 +104,6 @@ protected String getDefaultSupertype() {
* (For a FlowUsage that is a message.)
*/
protected void makeMessageAbstract() {
- super.postProcess();
FlowUsage target = getTarget();
if (UsageUtil.isMessageConnection(target) && target.getRelatedFeature().size() < 2) {
target.setIsAbstract(true);
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ImportAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ImportAdapter.java
index 4f5aeb1419..879dbe2192 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ImportAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ImportAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024, 2025 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -26,8 +27,6 @@
import org.omg.sysml.lang.sysml.Import;
import org.omg.sysml.lang.sysml.Membership;
import org.omg.sysml.lang.sysml.Namespace;
-import org.omg.sysml.lang.sysml.NamespaceImport;
-import org.omg.sysml.lang.sysml.VisibilityKind;
public abstract class ImportAdapter extends RelationshipAdapter {
@@ -39,17 +38,6 @@ public Import getTarget() {
return (Import)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
-
- // If the target Import is for a filtered import package, set its visibility to PUBLIC.
- Import target = getTarget();
- Namespace owningNamespace = target.getImportOwningNamespace();
- if (owningNamespace != null && owningNamespace.getOwningRelationship() instanceof NamespaceImport) {
- target.setVisibility(VisibilityKind.PUBLIC);
- }
- }
// Additional operations
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IntersectingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IntersectingAdapter.java
index b7e208a6c7..e596d50370 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IntersectingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/IntersectingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.Intersecting;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class IntersectingAdapter extends RelationshipAdapter {
@@ -38,21 +35,5 @@ public Intersecting getTarget() {
return (Intersecting)super.getTarget();
}
- @Override
- public void postProcess() {
- Intersecting obj = getTarget();
-
- // If a Intersecting is parsed targeting a Feature chain, then the intersectingType will be empty,
- // but the Intersecting will own the intersectingType. So, in this case, the intersectingType should
- // be set to the (last) ownedRelatedelement.
- Object intersectingType = obj.eGet(SysMLPackage.Literals.INTERSECTING__INTERSECTING_TYPE, false);
- if (intersectingType == null) {
- // Handle a intersectingType that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setIntersectingType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/LiteralStringAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/LiteralStringAdapter.java
index 44f69f58bd..b018161d08 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/LiteralStringAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/LiteralStringAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -21,7 +22,6 @@
package org.omg.sysml.adapter;
import org.omg.sysml.lang.sysml.LiteralString;
-import org.omg.sysml.util.ElementUtil;
public class LiteralStringAdapter extends ExpressionAdapter {
@@ -34,11 +34,5 @@ public LiteralString getTarget() {
return (LiteralString)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
- LiteralString target = getTarget();
- target.setValue(ElementUtil.unescapeString(target.getValue()));
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/MembershipAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/MembershipAdapter.java
index 145f8370c3..403da4bc3e 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/MembershipAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/MembershipAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021-2022, 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -21,8 +22,6 @@
package org.omg.sysml.adapter;
import org.omg.sysml.lang.sysml.Membership;
-import org.omg.sysml.lang.sysml.OwningMembership;
-import org.omg.sysml.util.ElementUtil;
public class MembershipAdapter extends RelationshipAdapter {
@@ -35,14 +34,5 @@ public Membership getTarget() {
return (Membership)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
- Membership target = getTarget();
- if (!(target instanceof OwningMembership)) {
- target.setMemberName(ElementUtil.unescapeString(target.getMemberName()));
- target.setMemberShortName(ElementUtil.unescapeString(target.getMemberShortName()));
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/NamespaceImportAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/NamespaceImportAdapter.java
index c10f8936a8..a2aa76a107 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/NamespaceImportAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/NamespaceImportAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024, 2025 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -25,10 +26,8 @@
import java.util.Set;
import org.eclipse.emf.common.util.EList;
-import org.omg.sysml.lang.sysml.Element;
import org.omg.sysml.lang.sysml.Membership;
import org.omg.sysml.lang.sysml.NamespaceImport;
-import org.omg.sysml.lang.sysml.SysMLPackage;
import org.omg.sysml.util.NamespaceUtil;
import org.omg.sysml.lang.sysml.Namespace;
@@ -42,24 +41,6 @@ public NamespaceImport getTarget() {
return (NamespaceImport)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
-
- NamespaceImport obj = getTarget();
- // If importedNamespace is empty, then set it to the first ownedRelatedElement, if this is a namespace
- // (filling in the implicit import for a filter package). Otherwise, set it to the importOwningNamspace.
- Object importedNamespace = obj.eGet(SysMLPackage.Literals.NAMESPACE_IMPORT__IMPORTED_NAMESPACE, false);
- if (importedNamespace == null) {
- EList ownedRelatedElement = obj.getOwnedRelatedElement();
- if (!ownedRelatedElement.isEmpty() && ownedRelatedElement.get(0) instanceof Namespace) {
- // Fill in the implicit import for a filter package.
- obj.setImportedNamespace((Namespace)ownedRelatedElement.get(0));
- } else {
- obj.setImportedNamespace(obj.getImportOwningNamespace());
- }
- }
- }
@Override
public void importMemberships(EList importedMemberships, Set excluded) {
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/OccurrenceUsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/OccurrenceUsageAdapter.java
index 65cd0d56f8..efff98bcac 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/OccurrenceUsageAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/OccurrenceUsageAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021, 2023-2025 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -34,18 +35,6 @@ public OccurrenceUsage getTarget() {
return (OccurrenceUsage)super.getTarget();
}
- // Post-processing
-
- @Override
- public void postProcess() {
- super.postProcess();
-
- OccurrenceUsage self = getTarget();
- if (self.getPortionKind() != null) {
- self.setIsPortion(true);
- }
- }
-
// Implicit Generalization
/**
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ParameterMembershipAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ParameterMembershipAdapter.java
index 4c4283ef6d..587882323e 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ParameterMembershipAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ParameterMembershipAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -20,7 +21,6 @@
package org.omg.sysml.adapter;
-import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.ParameterMembership;
public class ParameterMembershipAdapter extends FeatureMembershipAdapter {
@@ -34,14 +34,4 @@ public ParameterMembership getTarget() {
return (ParameterMembership)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
- ParameterMembership target = getTarget();
- Feature parameter = target.getOwnedMemberParameter();
- if (parameter != null) {
- parameter.setDirection(target.parameterDirection());
- }
- }
-
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortConjugationAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortConjugationAdapter.java
index 80a275eb6b..2f94165288 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortConjugationAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortConjugationAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -22,10 +23,6 @@
package org.omg.sysml.adapter;
import org.omg.sysml.lang.sysml.PortConjugation;
-import org.omg.sysml.lang.sysml.PortDefinition;
-import org.omg.sysml.lang.sysml.ConjugatedPortDefinition;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class PortConjugationAdapter extends ConjugationAdapter {
@@ -38,24 +35,5 @@ public PortConjugation getTarget() {
return (PortConjugation)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
-
- PortConjugation obj = getTarget();
-
- // If the originalPortDefinition is empty, then set it to the owner of the conjugatedPortDefinition
- // (if that is a PortDefinition).
- Object originalPortDefinition = obj.eGet(SysMLPackage.Literals.PORT_CONJUGATION__ORIGINAL_PORT_DEFINITION, false);
- if (originalPortDefinition == null) {
- ConjugatedPortDefinition conjugatedPortDefinition = obj.getConjugatedPortDefinition();
- if (conjugatedPortDefinition != null) {
- Element conjugatedPortDefinitionOwner = conjugatedPortDefinition.getOwner();
- if (conjugatedPortDefinitionOwner instanceof PortDefinition) {
- obj.setOriginalPortDefinition((PortDefinition)conjugatedPortDefinitionOwner);
- }
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortUsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortUsageAdapter.java
index a52f5e2ebe..e5e7502ff7 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortUsageAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/PortUsageAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2021, 2022, 2025, 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -20,13 +21,11 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.ecore.EObject;
import org.omg.sysml.lang.sysml.PartDefinition;
import org.omg.sysml.lang.sysml.PartUsage;
import org.omg.sysml.lang.sysml.PortDefinition;
import org.omg.sysml.lang.sysml.PortUsage;
import org.omg.sysml.lang.sysml.Type;
-import org.omg.sysml.util.UsageUtil;
public class PortUsageAdapter extends UsageAdapter {
@@ -41,14 +40,6 @@ public PortUsage getTarget() {
/**
* @satisfies validatePortUsageIsReference
*/
- public void postProcess() {
- super.postProcess();
- PortUsage target = getTarget();
- EObject featuringType = UsageUtil.getExpectedFeaturingTypeOf(target);
- if (!(featuringType instanceof PortDefinition || featuringType instanceof PortUsage)) {
- target.setIsComposite(false);
- }
- }
// Implicit Generalization
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/RedefinitionAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/RedefinitionAdapter.java
index 0eeccb4e09..9c00acecfe 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/RedefinitionAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/RedefinitionAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.Redefinition;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class RedefinitionAdapter extends SubsettingAdapter {
@@ -38,32 +35,5 @@ public Redefinition getTarget() {
return (Redefinition)super.getTarget();
}
- @Override
- public void postProcess() {
- Redefinition obj = getTarget();
-
- // If the redefiningFeature is empty, then set it to the owningRelatedElement, if that is a Feature.
- // Otherwise, set it to the first ownedRelatedElement (which will be a Feature chain).
- Object redefiningFeature = obj.eGet(SysMLPackage.Literals.REDEFINITION__REDEFINING_FEATURE, false);
- if (redefiningFeature == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Feature) {
- obj.setRedefiningFeature((Feature) owner);
- } else {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setRedefiningFeature((Feature)ownedRelatedElements.get(0));
- }
- }
- }
-
- Object redefinedFeature = obj.eGet(SysMLPackage.Literals.REDEFINITION__REDEFINED_FEATURE, false);
- if (redefinedFeature == null) {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setRedefinedFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ReferenceSubsettingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ReferenceSubsettingAdapter.java
index 781f86a4e9..f8b8b99d23 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ReferenceSubsettingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/ReferenceSubsettingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.ReferenceSubsetting;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class ReferenceSubsettingAdapter extends SubsettingAdapter {
@@ -38,19 +35,5 @@ public ReferenceSubsetting getTarget() {
return (ReferenceSubsetting)super.getTarget();
}
- @Override
- public void postProcess() {
- ReferenceSubsetting obj = getTarget();
-
- // If the referencedFeature is empty, then set it to the last ownedRelatedElement
- // (which will be a Feature chain).
- Object referencedFeature = obj.eGet(SysMLPackage.Literals.REFERENCE_SUBSETTING__REFERENCED_FEATURE, false);
- if (referencedFeature == null) {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setReferencedFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SpecializationAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SpecializationAdapter.java
index cba4bbde65..5125ea7682 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SpecializationAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SpecializationAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,12 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
import org.omg.sysml.lang.sysml.Specialization;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
-import org.omg.sysml.lang.sysml.SysMLPackage;
-import org.omg.sysml.lang.sysml.Type;
public class SpecializationAdapter extends RelationshipAdapter {
@@ -39,32 +35,5 @@ public Specialization getTarget() {
return (Specialization)super.getTarget();
}
- public void postProcess() {
- Specialization obj = getTarget();
-
- // If general is empty, then set it to the last ownedRelatedElement (which will be a Feature chain).
- Object general = obj.eGet(SysMLPackage.Literals.SPECIALIZATION__GENERAL, false);
- if (general == null) {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setGeneral((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
-
- // If specific is empty, then set it to the owningRelatedElement, if that is a Type.
- // Otherwise set it to the first ownedRelatedElement (which will be a FeatureChain).
- Object specific = obj.eGet(SysMLPackage.Literals.SPECIALIZATION__SPECIFIC, false);
- if (specific == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Type) {
- obj.setSpecific((Type)owner);
- } else {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setSpecific((Feature)ownedRelatedElements.get(0));
- }
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubclassificationAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubclassificationAdapter.java
index 4014d63983..6e6ada6e7f 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubclassificationAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubclassificationAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,10 +22,7 @@
package org.omg.sysml.adapter;
-import org.omg.sysml.lang.sysml.Classifier;
-import org.omg.sysml.lang.sysml.Element;
import org.omg.sysml.lang.sysml.Subclassification;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class SubclassificationAdapter extends SpecializationAdapter {
@@ -37,19 +35,5 @@ public Subclassification getTarget() {
return (Subclassification)super.getTarget();
}
- @Override
- public void postProcess() {
- Subclassification obj = getTarget();
-
- // If the subclassifier is empty, then set it to the owningRelatedElement,
- // if this is a Classifier.
- Object subclassifier = obj.eGet(SysMLPackage.Literals.SUBCLASSIFICATION__SUBCLASSIFIER, false);
- if (subclassifier == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Classifier) {
- obj.setSubclassifier((Classifier) owner);
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubsettingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubsettingAdapter.java
index 7578e47e53..5c5a143fa2 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubsettingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/SubsettingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.Subsetting;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class SubsettingAdapter extends SpecializationAdapter {
@@ -38,34 +35,5 @@ public Subsetting getTarget() {
return (Subsetting)super.getTarget();
}
- @Override
- public void postProcess() {
- Subsetting obj = getTarget();
-
- // If the subsettedFeature is empty, then set it to the last ownedRelatedElement
- // (which will be a Feature chain).
- Object subsettedFeature = obj.eGet(SysMLPackage.Literals.SUBSETTING__SUBSETTED_FEATURE, false);
- if (subsettedFeature == null) {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setSubsettedFeature((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
-
- // If the subsettingFeature is empty, then set it to the owningRelatedFeature, if this is a Feature.
- // Otherwise set it to the first ownedRelatedElement (which will be a Feature chain).
- Object subsettingFeature = obj.eGet(SysMLPackage.Literals.SUBSETTING__SUBSETTING_FEATURE, false);
- if (subsettingFeature == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Feature) {
- obj.setSubsettingFeature((Feature) owner);
- } else {
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setSubsettingFeature((Feature)ownedRelatedElements.get(0));
- }
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TextualRepresentationAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TextualRepresentationAdapter.java
index 7d8c67864d..909f806d4b 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TextualRepresentationAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TextualRepresentationAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -19,7 +20,6 @@
package org.omg.sysml.adapter;
import org.omg.sysml.lang.sysml.TextualRepresentation;
-import org.omg.sysml.util.ElementUtil;
public class TextualRepresentationAdapter extends AnnotatingElementAdapter {
@@ -32,11 +32,4 @@ public TextualRepresentation getTarget() {
return (TextualRepresentation)super.getTarget();
}
- @Override
- public void postProcess() {
- super.postProcess();
- TextualRepresentation target = getTarget();
- target.setLanguage(ElementUtil.unescapeString(target.getLanguage()));
- target.setBody(ElementUtil.processCommentBody(target.getBody()));
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TypeFeaturingAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TypeFeaturingAdapter.java
index 6d539361f5..c880046991 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TypeFeaturingAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/TypeFeaturingAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,10 +22,7 @@
package org.omg.sysml.adapter;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.TypeFeaturing;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class TypeFeaturingAdapter extends RelationshipAdapter {
@@ -37,18 +35,5 @@ public TypeFeaturing getTarget() {
return (TypeFeaturing)super.getTarget();
}
- @Override
- public void postProcess() {
- TypeFeaturing obj = getTarget();
-
- // If the featureOfType is empty, then set it to the owningRelatedElement (if this is a Feature).
- Object featureOfType = obj.eGet(SysMLPackage.Literals.TYPE_FEATURING__FEATURE_OF_TYPE, false);
- if (featureOfType == null) {
- Element owner = obj.getOwningRelatedElement();
- if (owner instanceof Feature) {
- obj.setFeatureOfType((Feature)owner);
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UnioningAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UnioningAdapter.java
index 21c49b75d6..72e58bf0cc 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UnioningAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UnioningAdapter.java
@@ -1,6 +1,7 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
* Copyright (c) 2024 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
* Copyright (c) 2024 Budapest University of Technology and Economics
*
* This program is free software: you can redistribute it and/or modify
@@ -21,11 +22,7 @@
package org.omg.sysml.adapter;
-import org.eclipse.emf.common.util.EList;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.Unioning;
-import org.omg.sysml.lang.sysml.SysMLPackage;
public class UnioningAdapter extends RelationshipAdapter {
@@ -38,21 +35,5 @@ public Unioning getTarget() {
return (Unioning)super.getTarget();
}
- @Override
- public void postProcess() {
- Unioning obj = getTarget();
-
- // If a Unioning is parsed targeting a Feature chain, then the unioningType will be empty,
- // but the Unioning will own the unioningType. So, in this case, the unioningType should
- // be set to the (last) ownedRelatedelement.
- Object unioningType = obj.eGet(SysMLPackage.Literals.UNIONING__UNIONING_TYPE, false);
- if (unioningType == null) {
- // Handle a intersectingType that is a Feature chain.
- EList ownedRelatedElements = obj.getOwnedRelatedElement();
- if (!ownedRelatedElements.isEmpty()) {
- obj.setUnioningType((Feature)ownedRelatedElements.get(ownedRelatedElements.size() - 1));
- }
- }
- }
}
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UsageAdapter.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UsageAdapter.java
index 2072d544cd..a263c5a4df 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UsageAdapter.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/adapter/UsageAdapter.java
@@ -1,6 +1,11 @@
/*******************************************************************************
* SysML 2 Pilot Implementation
+<<<<<<< HEAD
+ * Copyright (c) 2021-2025, 2026 Model Driven Solutions, Inc.
+ * Copyright (c) 2026 Obeo
+=======
* Copyright (c) 2021-2026 Model Driven Solutions, Inc.
+>>>>>>> refs/remotes/origin/HEAD
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -22,8 +27,6 @@
import org.omg.sysml.lang.sysml.ActionDefinition;
import org.omg.sysml.lang.sysml.ActionUsage;
-import org.omg.sysml.lang.sysml.AttributeDefinition;
-import org.omg.sysml.lang.sysml.AttributeUsage;
import org.omg.sysml.lang.sysml.Definition;
import org.omg.sysml.lang.sysml.Feature;
import org.omg.sysml.lang.sysml.FeatureMembership;
@@ -36,8 +39,8 @@
import org.omg.sysml.lang.sysml.SysMLPackage;
import org.omg.sysml.lang.sysml.Type;
import org.omg.sysml.lang.sysml.Usage;
-import org.omg.sysml.util.SysMLLibraryUtil;
import org.omg.sysml.util.FeatureUtil;
+import org.omg.sysml.util.SysMLLibraryUtil;
import org.omg.sysml.util.TypeUtil;
import org.omg.sysml.util.UsageUtil;
@@ -52,31 +55,6 @@ public Usage getTarget() {
return (Usage)super.getTarget();
}
- // Post-processing
-
- /**
- * @satisfies validateUsageIsReferential
- * @satisfies validateAttributeDefinitionFeature
- * @satisfies validateAttributeUsageFeature
- */
- @Override
- public void postProcess () {
- super.postProcess();
- Usage target = getTarget();
- if (target.isVariation()) {
- target.setIsAbstract(true);
- }
- Type featuringType = UsageUtil.getExpectedFeaturingTypeOf(target);
- if (target.getDirection() != null || target.isEnd() || featuringType == null ||
- featuringType instanceof AttributeDefinition || featuringType instanceof AttributeUsage) {
- target.setIsComposite(false);
- }
- }
-
- @Override
- protected void setIsVariableIfConstant() {
- }
-
// Caching
private Boolean mayTimeVary = null;
diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ElementUtil.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ElementUtil.java
index f509875592..be418e8440 100644
--- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ElementUtil.java
+++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/ElementUtil.java
@@ -2,6 +2,7 @@
* SysML 2 Pilot Implementation
* Copyright (c) 2019, 2020, 2022, 2024, 2025 Model Driven Solutions, Inc.
* Copyright (c) 2023 Mgnite Inc.
+ * Copyright (c) 2026 Obeo
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the Eclipse Public License as published by
@@ -331,12 +332,6 @@ public static void setElementIdOf(Element element, String elementId) {
getElementAdapter(element).setElementId(elementId);
}
- // Parse post-processing
-
- public static void postProcess(Element element) {
- getElementAdapter(element).postProcess();
- }
-
// Transformation
public static void transformAll(ResourceSet resourceSet, boolean addImplicitElements) {
diff --git a/org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/UsagePostProcessTest.java b/org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/UsagePostProcessTest.java
deleted file mode 100644
index 065ce71083..0000000000
--- a/org.omg.sysml.logic/src/test/java/org/omg/sysml/logic/UsagePostProcessTest.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * 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.
- * (at your option) any later version.
- *
- * 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 theEclipse Public License
- * along with this program. If not, see .
- *
- * @license EPL-2.0
- *
- *******************************************************************************/
-package org.omg.sysml.logic;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.emf.ecore.EClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.omg.sysml.lang.sysml.Definition;
-import org.omg.sysml.lang.sysml.Element;
-import org.omg.sysml.lang.sysml.FeatureDirectionKind;
-import org.omg.sysml.lang.sysml.Namespace;
-import org.omg.sysml.lang.sysml.Package;
-import org.omg.sysml.lang.sysml.SysMLFactory;
-import org.omg.sysml.lang.sysml.SysMLPackage;
-import org.omg.sysml.lang.sysml.Usage;
-import org.omg.sysml.lang.sysml.VariantMembership;
-import org.omg.sysml.util.ElementUtil;
-import org.omg.sysml.util.NamespaceUtil;
-import org.omg.sysml.util.TypeUtil;
-
-public class UsagePostProcessTest {
-
- @BeforeClass
- public static void setUp() {
- SysMLLogicStandaloneSetup.doSetup();
- SysMLPackage.eINSTANCE.eClass();
- }
-
- /**
- * Test that Usage.postProcess sets the property "composite" to false in appropriate cases.
- * @throws InvocationTargetException
- */
- @Test
- public void settingCompositeToFalse() throws InvocationTargetException {
- /*
- * package Test {\n"
- * part p {
- * attribute a;
- * part x;
- * in part y
- * variation part z {
- * variant variation part u {
- * variant part v;
- * }
- * variant port w;
- * }
- * }
- * variation part q {
- * variant part r;
- * }
- * attribute def B {
- * part p1;
- * }
- * attribute b {
- * part p2;
- * }
- * }
- */
- Package test = (Package) createElement(SysMLPackage.Literals.PACKAGE, "test", null);
- Usage p = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "p", test);
- Usage a = (Usage) createElement(SysMLPackage.Literals.ATTRIBUTE_USAGE, "a", p);
- Usage x = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "x", p);
- Usage y = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "y", p);
- y.setDirection(FeatureDirectionKind.IN);
- Usage z = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "z", p);
- z.setIsVariation(true);
- Usage u = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "u", z);
- u.setIsVariation(true);
- Usage v = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "v", u);
- Usage w = (Usage) createElement(SysMLPackage.Literals.PORT_USAGE, "w", u);
- Usage q = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "q", test);
- q.setIsVariation(true);
- Usage r = (Usage) createElement(SysMLPackage.Literals.PART_USAGE, "r", q);
-
- Definition B = SysMLFactory.eINSTANCE.createAttributeDefinition();
- Usage p1 = SysMLFactory.eINSTANCE.createPartUsage();
- TypeUtil.addOwnedFeatureTo(B, p1);
- Usage b = SysMLFactory.eINSTANCE.createAttributeUsage();
- Usage p2 = SysMLFactory.eINSTANCE.createPartUsage();
- TypeUtil.addOwnedFeatureTo(b, p2);
-
- // Post-process after creating the entire model.
- postProcess(p, a, x, y, z, u, v, w, q, r, B, p1, b, p2);
-
- assertTrue(p.isReference());
- assertTrue(a.isReference());
- assertFalse(x.isReference());
- assertTrue(y.isReference());
- assertFalse(z.isReference());
- assertFalse(u.isReference());
- assertFalse(v.isReference());
- assertTrue(w.isReference());
- assertTrue(q.isReference());
- assertTrue(r.isReference());
-
- assertTrue(p1.isReference());
- assertTrue(b.isReference());
- assertTrue(p2.isReference());
- }
-
- /**
- * Create an Element with the given eClass, name and parent. If the created Element and the parent
- * are both Usages, then the Element is added to the parent as a variant, if the parent is a variation,
- * or as an ownedFeature, if the parent is not a variation. Otherwise, the Element is added as an
- * ownedMember of the parent. (Adding ownedFeatures of Definitions is not currently needed.)
- */
- protected static Element createElement(EClass eClass, String name, Namespace parent) {
- Element element = (Element)SysMLFactory.eINSTANCE.create(eClass);
- element.setDeclaredName(name);
- if (element instanceof Usage usage && parent instanceof Usage parentUsage) {
- if (parentUsage.isVariation()) {
- VariantMembership membership = SysMLFactory.eINSTANCE.createVariantMembership();
- membership.setOwnedVariantUsage(usage);
- parentUsage.getOwnedRelationship().add(membership);
- } else {
- TypeUtil.addOwnedFeatureTo(parentUsage, usage);
- }
- } else if (parent != null) {
- NamespaceUtil.addOwnedMemberTo(parent, element);
- }
- return element;
- }
-
- /**
- * Call the postProcess method of the ElementAdapter of the given array of elements.
- */
- protected static void postProcess(Element... elements) {
- for (Element element: elements) {
- ElementUtil.getElementAdapter(element).postProcess();
- }
- }
-
-}
diff --git a/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.62.0-SNAPSHOT.jar b/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.62.0-SNAPSHOT.jar
index bdb3804250..9ac46e96fa 100644
Binary files a/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.62.0-SNAPSHOT.jar and b/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.62.0-SNAPSHOT.jar differ
diff --git a/org.omg.sysml.xtext/META-INF/MANIFEST.MF b/org.omg.sysml.xtext/META-INF/MANIFEST.MF
index 4907a9777d..128dcc72a2 100644
--- a/org.omg.sysml.xtext/META-INF/MANIFEST.MF
+++ b/org.omg.sysml.xtext/META-INF/MANIFEST.MF
@@ -27,6 +27,7 @@ Require-Bundle: org.eclipse.xtext,
org.objectweb.asm;bundle-version="9.3.0";resolution:=optional,
org.apache.commons.cli
Export-Package: org.omg.sysml.xtext,
+ org.omg.sysml.xtext.postprocessing,
org.omg.sysml.xtext.generator,
org.omg.sysml.xtext.library,
org.omg.sysml.xtext.parser.antlr,
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/SysMLRuntimeModule.xtend b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/SysMLRuntimeModule.xtend
index eb937ca74b..2444a9b910 100644
--- a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/SysMLRuntimeModule.xtend
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/SysMLRuntimeModule.xtend
@@ -4,29 +4,29 @@
package org.omg.sysml.xtext
import com.google.inject.Binder
+import com.google.inject.Provides
import com.google.inject.name.Names
+import org.eclipse.xtext.conversion.IValueConverterService
import org.eclipse.xtext.linking.ILinker
import org.eclipse.xtext.naming.IQualifiedNameConverter
import org.eclipse.xtext.naming.IQualifiedNameProvider
+import org.eclipse.xtext.resource.IResourceServiceProvider
import org.eclipse.xtext.resource.XtextResource
import org.eclipse.xtext.scoping.IGlobalScopeProvider
-import org.eclipse.xtext.resource.IResourceServiceProvider
import org.eclipse.xtext.validation.CompositeEValidator
import org.eclipse.xtext.validation.IResourceValidator
-import org.omg.kerml.xtext.linking.KerMLLazyLinkingResource
import org.omg.kerml.xtext.conversion.KerMLValueConverterService
+import org.omg.kerml.xtext.library.ILibraryIndexProvider
+import org.omg.kerml.xtext.library.PrecalculatedLibraryIndexProvider
+import org.omg.kerml.xtext.linking.KerMLLazyLinkingResource
import org.omg.kerml.xtext.naming.KerMLQualifiedNameProvider
-import org.omg.kerml.xtext.scoping.KerMLLinker
import org.omg.kerml.xtext.validation.KerMLResourceValidator
import org.omg.sysml.logic.api.IModelLibraryProvider
+import org.omg.sysml.util.SysMLLibraryUtil
import org.omg.sysml.xtext.library.SysMLLibraryProvider
import org.omg.sysml.xtext.naming.SysMLQualifiedNameConverter
import org.omg.sysml.xtext.scoping.SysMLGlobalScopeProvider
-import org.omg.kerml.xtext.library.ILibraryIndexProvider
-import org.omg.kerml.xtext.library.PrecalculatedLibraryIndexProvider
-import com.google.inject.Provides
-import org.eclipse.xtext.conversion.IValueConverterService
-import org.omg.sysml.util.SysMLLibraryUtil
+import org.omg.sysml.xtext.scoping.SysMLLinker
/**
* Use this class to register components to be used at runtime / without the Equinox extension registry.
@@ -67,7 +67,7 @@ class SysMLRuntimeModule extends AbstractSysMLRuntimeModule {
}
override Class extends ILinker> bindILinker() {
- KerMLLinker
+ SysMLLinker
}
def void configureUseEObjectValidator(Binder binder) {
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ActionUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ActionUsageParserPostProcessor.java
new file mode 100644
index 0000000000..d6c55ec0a1
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ActionUsageParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.ActionUsage;
+
+public class ActionUsageParserPostProcessor extends OccurrenceUsageParserPostProcessor {
+
+ public ActionUsageParserPostProcessor(ActionUsage element) {
+ super(element);
+ }
+
+ public ActionUsage getTarget() {
+ return (ActionUsage)super.getTarget();
+ }
+
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/CalculationUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/CalculationUsageParserPostProcessor.java
new file mode 100644
index 0000000000..7d81e3e234
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/CalculationUsageParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.CalculationUsage;
+
+public class CalculationUsageParserPostProcessor extends ActionUsageParserPostProcessor {
+
+ public CalculationUsageParserPostProcessor(CalculationUsage element) {
+ super(element);
+ }
+
+ public CalculationUsage getTarget() {
+ return (CalculationUsage)super.getTarget();
+ }
+
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/CaseUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/CaseUsageParserPostProcessor.java
new file mode 100644
index 0000000000..dba68e9c6b
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/CaseUsageParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * 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 GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * 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
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program. If not, see .
+ *
+ * @license LGPL-3.0-or-later
+ *
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.CaseUsage;
+
+public class CaseUsageParserPostProcessor extends CalculationUsageParserPostProcessor {
+
+ public CaseUsageParserPostProcessor(CaseUsage element) {
+ super(element);
+ }
+
+ public CaseUsage getTarget() {
+ return (CaseUsage)super.getTarget();
+ }
+
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ConnectionUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ConnectionUsageParserPostProcessor.java
new file mode 100644
index 0000000000..5ffd905e90
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ConnectionUsageParserPostProcessor.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.ConnectionUsage;
+
+public class ConnectionUsageParserPostProcessor extends PartUsageParserPostProcessor {
+
+ public ConnectionUsageParserPostProcessor(ConnectionUsage element) {
+ super(element);
+ }
+
+ @Override
+ public ConnectionUsage getTarget() {
+ return (ConnectionUsage)super.getTarget();
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/DefinitionParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/DefinitionParserPostProcessor.java
new file mode 100644
index 0000000000..0f32c28e15
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/DefinitionParserPostProcessor.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.kerml.xtext.postprocessing.ClassifierParserPostProcessor;
+import org.omg.sysml.lang.sysml.Definition;
+
+public class DefinitionParserPostProcessor extends ClassifierParserPostProcessor {
+
+ public DefinitionParserPostProcessor(Definition element) {
+ super(element);
+ }
+
+ @Override
+ public Definition getTarget() {
+ return (Definition)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ Definition target = getTarget();
+ if (target.isVariation()) {
+ target.setIsAbstract(true);
+ }
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ItemUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ItemUsageParserPostProcessor.java
new file mode 100644
index 0000000000..6a2b032ac5
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/ItemUsageParserPostProcessor.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.ItemUsage;
+
+public class ItemUsageParserPostProcessor extends OccurrenceUsageParserPostProcessor {
+
+ public ItemUsageParserPostProcessor(ItemUsage element) {
+ super(element);
+ }
+
+ @Override
+ public ItemUsage getTarget() {
+ return (ItemUsage)super.getTarget();
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/OccurrenceUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/OccurrenceUsageParserPostProcessor.java
new file mode 100644
index 0000000000..3236739cdc
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/OccurrenceUsageParserPostProcessor.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.OccurrenceUsage;
+
+public class OccurrenceUsageParserPostProcessor extends UsageParserPostProcessor {
+
+ public OccurrenceUsageParserPostProcessor(OccurrenceUsage element) {
+ super(element);
+ }
+
+ @Override
+ public OccurrenceUsage getTarget() {
+ return (OccurrenceUsage)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+
+ OccurrenceUsage self = getTarget();
+ if (self.getPortionKind() != null) {
+ self.setIsPortion(true);
+ }
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PartUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PartUsageParserPostProcessor.java
new file mode 100644
index 0000000000..542346e124
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PartUsageParserPostProcessor.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.PartUsage;
+
+public class PartUsageParserPostProcessor extends ItemUsageParserPostProcessor {
+
+ public PartUsageParserPostProcessor(PartUsage element) {
+ super(element);
+ }
+
+ @Override
+ public PartUsage getTarget() {
+ return (PartUsage)super.getTarget();
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PortConjugationParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PortConjugationParserPostProcessor.java
new file mode 100644
index 0000000000..00286d78c6
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PortConjugationParserPostProcessor.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.sysml.lang.sysml.PortConjugation;
+import org.omg.sysml.lang.sysml.PortDefinition;
+import org.omg.kerml.xtext.postprocessing.ConjugationParserPostProcessor;
+import org.omg.sysml.lang.sysml.ConjugatedPortDefinition;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.lang.sysml.SysMLPackage;
+
+public class PortConjugationParserPostProcessor extends ConjugationParserPostProcessor {
+
+ public PortConjugationParserPostProcessor(PortConjugation element) {
+ super(element);
+ }
+
+ @Override
+ public PortConjugation getTarget() {
+ return (PortConjugation)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+
+ PortConjugation obj = getTarget();
+
+ // If the originalPortDefinition is empty, then set it to the owner of the conjugatedPortDefinition
+ // (if that is a PortDefinition).
+ Object originalPortDefinition = obj.eGet(SysMLPackage.Literals.PORT_CONJUGATION__ORIGINAL_PORT_DEFINITION, false);
+ if (originalPortDefinition == null) {
+ ConjugatedPortDefinition conjugatedPortDefinition = obj.getConjugatedPortDefinition();
+ if (conjugatedPortDefinition != null) {
+ Element conjugatedPortDefinitionOwner = conjugatedPortDefinition.getOwner();
+ if (conjugatedPortDefinitionOwner instanceof PortDefinition) {
+ obj.setOriginalPortDefinition((PortDefinition)conjugatedPortDefinitionOwner);
+ }
+ }
+ }
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PortUsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PortUsageParserPostProcessor.java
new file mode 100644
index 0000000000..395161e15f
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/PortUsageParserPostProcessor.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.eclipse.emf.ecore.EObject;
+import org.omg.sysml.lang.sysml.PortDefinition;
+import org.omg.sysml.lang.sysml.PortUsage;
+import org.omg.sysml.util.UsageUtil;
+
+public class PortUsageParserPostProcessor extends OccurrenceUsageParserPostProcessor {
+
+ public PortUsageParserPostProcessor(PortUsage element) {
+ super(element);
+ }
+
+ @Override
+ public PortUsage getTarget() {
+ return (PortUsage)super.getTarget();
+ }
+
+ @Override
+ public void postProcess() {
+ super.postProcess();
+ PortUsage target = getTarget();
+ EObject featuringType = UsageUtil.getExpectedFeaturingTypeOf(target);
+ if (!(featuringType instanceof PortDefinition || featuringType instanceof PortUsage)) {
+ target.setIsComposite(false);
+ }
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/SysMLParserPostProcessorFactory.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/SysMLParserPostProcessorFactory.java
new file mode 100644
index 0000000000..40250b1c27
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/SysMLParserPostProcessorFactory.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ * Copyright (c) 2026 Model Driven Solutions, Inc.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.kerml.xtext.postprocessing.ElementParserPostProcessor;
+import org.omg.kerml.xtext.postprocessing.KerMLParserPostProcessorFactory.KerMLFactoryPostProcessorSwitch;
+import org.omg.sysml.lang.sysml.*;
+import org.omg.sysml.lang.sysml.util.SysMLSwitch;
+
+public class SysMLParserPostProcessorFactory {
+
+ public static ElementParserPostProcessor getPostProcessor(Element element) {
+ return element == null ? null : SWITCH.doSwitch(element);
+ }
+
+ private SysMLParserPostProcessorFactory() {
+ }
+
+ private static final SysMLSwitch SWITCH = new SysMLFactoryPostProcessorSwitch();
+
+ public static class SysMLFactoryPostProcessorSwitch extends KerMLFactoryPostProcessorSwitch {
+
+ @Override
+ public ElementParserPostProcessor caseActionUsage(ActionUsage element) {
+ return new ActionUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseCalculationUsage(CalculationUsage element) {
+ return new CalculationUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseCaseUsage(CaseUsage element) {
+ return new CaseUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseConnectionUsage(ConnectionUsage element) {
+ return new ConnectionUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseDefinition(Definition element) {
+ return new DefinitionParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseItemUsage(ItemUsage element) {
+ return new ItemUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseOccurrenceUsage(OccurrenceUsage element) {
+ return new OccurrenceUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor casePartUsage(PartUsage element) {
+ return new PartUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor casePortConjugation(PortConjugation element) {
+ return new PortConjugationParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor casePortUsage(PortUsage element) {
+ return new PortUsageParserPostProcessor(element);
+ }
+
+ @Override
+ public ElementParserPostProcessor caseUsage(Usage element) {
+ return new UsageParserPostProcessor(element);
+ }
+
+ }
+
+
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/UsageParserPostProcessor.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/UsageParserPostProcessor.java
new file mode 100644
index 0000000000..76de2ac0e9
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/postprocessing/UsageParserPostProcessor.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+
+package org.omg.sysml.xtext.postprocessing;
+
+import org.omg.kerml.xtext.postprocessing.FeatureParserPostProcessor;
+import org.omg.sysml.lang.sysml.AttributeDefinition;
+import org.omg.sysml.lang.sysml.AttributeUsage;
+import org.omg.sysml.lang.sysml.Type;
+import org.omg.sysml.lang.sysml.Usage;
+import org.omg.sysml.util.UsageUtil;
+
+public class UsageParserPostProcessor extends FeatureParserPostProcessor {
+
+ public UsageParserPostProcessor(Usage element) {
+ super(element);
+ }
+
+ @Override
+ public Usage getTarget() {
+ return (Usage)super.getTarget();
+ }
+
+ @Override
+ public void postProcess () {
+ super.postProcess();
+ Usage target = getTarget();
+ if (target.isVariation()) {
+ target.setIsAbstract(true);
+ }
+ Type featuringType = UsageUtil.getExpectedFeaturingTypeOf(target);
+ if (target.getDirection() != null || target.isEnd() || featuringType == null ||
+ featuringType instanceof AttributeDefinition || featuringType instanceof AttributeUsage) {
+ target.setIsComposite(false);
+ }
+ }
+
+ @Override
+ protected void setIsVariableIfConstant() {
+ }
+}
diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/scoping/SysMLLinker.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/scoping/SysMLLinker.java
new file mode 100644
index 0000000000..2423a3cf6a
--- /dev/null
+++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/scoping/SysMLLinker.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * SysML 2 Pilot Implementation
+ * Copyright (c) 2026 Obeo
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *******************************************************************************/
+package org.omg.sysml.xtext.scoping;
+
+import org.omg.kerml.xtext.postprocessing.ElementParserPostProcessor;
+import org.omg.kerml.xtext.scoping.KerMLLinker;
+import org.omg.sysml.lang.sysml.Element;
+import org.omg.sysml.xtext.postprocessing.SysMLParserPostProcessorFactory;
+
+public class SysMLLinker extends KerMLLinker{
+
+ @Override
+ protected ElementParserPostProcessor doGetPostProcessor(Element element) {
+ return SysMLParserPostProcessorFactory.getPostProcessor(element);
+ }
+
+}
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 cb988f95ae..b9f3328e6e 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
@@ -152,7 +152,7 @@ class SysMLValidator extends KerMLValidator {
public static val INVALID_USAGE_IS_REFERENTIAL = "validateUsageIsReferential"
public static val INVALID_USAGE_IS_REFERENTIAL_MSG_1 = "A directed usage must be referential."
public static val INVALID_USAGE_IS_REFERENTIAL_MSG_2 = "An end usage must be referential."
- public static val INVALID_USAGE_IS_REFERENTIAL_MSG_3 = "A package-lebel usage must be referential."
+ public static val INVALID_USAGE_IS_REFERENTIAL_MSG_3 = "A package-level usage must be referential."
public static val INVALID_USAGE_VARIATION_IS_ABSTRACT = "validateUsageVariationIsAbstract"
public static val INVALID_USAGE_VARIATION_IS_ABSTRACT_MSG = "A variation must be abstract."
public static val INVALID_USAGE_VARIATION_MEMBERSHIP = "validateUsageVariationMembership"