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 bb4518fa2..c5811bbb5 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 e76ec65cb..3cc9aa600 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.adapter, 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/adapter/AnnotationParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/AnnotationParserAdapter.java new file mode 100644 index 000000000..1fa87bd1d --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/AnnotationParserAdapter.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.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 AnnotationParserAdapter extends ElementParserAdapter { + + public AnnotationParserAdapter(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/adapter/CommentParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/CommentParserAdapter.java new file mode 100644 index 000000000..8069d065d --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/CommentParserAdapter.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * 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.adapter; + +import org.omg.sysml.lang.sysml.Comment; +import org.omg.sysml.util.ElementUtil; + +public class CommentParserAdapter extends ElementParserAdapter { + + public CommentParserAdapter(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/adapter/ConjugationParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ConjugationParserAdapter.java new file mode 100644 index 000000000..d57eacfdc --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ConjugationParserAdapter.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.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 ConjugationParserAdapter extends ElementParserAdapter { + + public ConjugationParserAdapter(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/adapter/DependencyParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/DependencyParserAdapter.java new file mode 100644 index 000000000..1d2a74cfa --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/DependencyParserAdapter.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.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 DependencyParserAdapter extends ElementParserAdapter { + + public DependencyParserAdapter(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/adapter/DifferencingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/DifferencingParserAdapter.java new file mode 100644 index 000000000..f93f28fd4 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/DifferencingParserAdapter.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.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 DifferencingParserAdapter extends ElementParserAdapter { + + public DifferencingParserAdapter(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/adapter/DisjoiningParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/DisjoiningParserAdapter.java new file mode 100644 index 000000000..372a23642 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/DisjoiningParserAdapter.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.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 DisjoiningParserAdapter extends ElementParserAdapter { + + public DisjoiningParserAdapter(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/adapter/ElementParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ElementParserAdapter.java new file mode 100644 index 000000000..c5fc03579 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ElementParserAdapter.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * 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.adapter; + +import org.eclipse.emf.common.notify.impl.AdapterImpl; +import org.omg.sysml.lang.sysml.Element; +import org.omg.sysml.util.ElementUtil; + +public class ElementParserAdapter extends AdapterImpl { + + protected Class kind; + + public ElementParserAdapter(Element element) { + super(); + kind = element.getClass(); + } + + public Element getTarget() { + return (Element)super.getTarget(); + } + + @Override + public boolean isAdapterForType(Object object) { + return kind.isInstance(object); + } + + 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/adapter/EndFeatureMembershipParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/EndFeatureMembershipParserAdapter.java new file mode 100644 index 000000000..46def0642 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/EndFeatureMembershipParserAdapter.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * 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.adapter; + +import org.omg.sysml.lang.sysml.EndFeatureMembership; +import org.omg.sysml.lang.sysml.Feature; + +public class EndFeatureMembershipParserAdapter extends MembershipParserAdapter { + + public EndFeatureMembershipParserAdapter(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/adapter/FeatureInvertingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/FeatureInvertingParserAdapter.java new file mode 100644 index 000000000..06ffa56c0 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/FeatureInvertingParserAdapter.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.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 FeatureInvertingParserAdapter extends ElementParserAdapter { + + public FeatureInvertingParserAdapter(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/adapter/FeatureParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/FeatureParserAdapter.java new file mode 100644 index 000000000..197bf7119 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/FeatureParserAdapter.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.kerml.xtext.adapter; + +import org.omg.sysml.lang.sysml.Feature; + +public class FeatureParserAdapter extends ElementParserAdapter { + + public FeatureParserAdapter(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/adapter/FeatureTypingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/FeatureTypingParserAdapter.java new file mode 100644 index 000000000..8ac280150 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/FeatureTypingParserAdapter.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.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 FeatureTypingParserAdapter extends SpecializationParserAdapter { + + public FeatureTypingParserAdapter(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/adapter/ImportParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ImportParserAdapter.java new file mode 100644 index 000000000..a517a7bc4 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ImportParserAdapter.java @@ -0,0 +1,41 @@ +/******************************************************************************* + * 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.adapter; + +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 ImportParserAdapter extends ElementParserAdapter { + + public ImportParserAdapter(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/adapter/IntersectingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/IntersectingParserAdapter.java new file mode 100644 index 000000000..f351221e4 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/IntersectingParserAdapter.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.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 IntersectingParserAdapter extends ElementParserAdapter { + + public IntersectingParserAdapter(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/adapter/KerMLParserAdapterFactory.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/KerMLParserAdapterFactory.java new file mode 100644 index 000000000..49e13dc37 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/KerMLParserAdapterFactory.java @@ -0,0 +1,183 @@ +/******************************************************************************* + * 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.adapter; + +import java.util.Optional; + +import org.omg.sysml.lang.sysml.*; +import org.omg.sysml.lang.sysml.util.SysMLSwitch; + +public final class KerMLParserAdapterFactory { + + public static ElementParserAdapter getAdapter(Element element) { + return getExistingAdapter(element).orElseGet(() -> createAdapter(element)); + } + + public static void removeAdapter(Element element) { + getExistingAdapter(element).ifPresent(element.eAdapters()::remove); + } + + protected static Optional getExistingAdapter(Element element) { + return element == null ? Optional.empty() : + element.eAdapters().stream() + .filter(ElementParserAdapter.class::isInstance) + .map(ElementParserAdapter.class::cast) + .findFirst(); + } + + public static ElementParserAdapter createAdapter(Element element) { + ElementParserAdapter adapter = null; + if (element != null) { + adapter = SWITCH.doSwitch(element); + } + if (adapter != null) { + element.eAdapters().add(adapter); + } + return adapter; + } + + private KerMLParserAdapterFactory() { + } + + private static final SysMLSwitch SWITCH = new KerMLFactoryAdapterSwitch(); + + + + public static class KerMLFactoryAdapterSwitch extends SysMLSwitch { + + @Override + public ElementParserAdapter caseAnnotation(Annotation element) { + return new AnnotationParserAdapter(element); + } + + @Override + public ElementParserAdapter caseComment(Comment element) { + return new CommentParserAdapter(element); + } + + @Override + public ElementParserAdapter caseConjugation(Conjugation element) { + return new ConjugationParserAdapter(element); + } + + @Override + public ElementParserAdapter caseDependency(Dependency element) { + return new DependencyParserAdapter(element); + } + + @Override + public ElementParserAdapter caseDifferencing(Differencing element) { + return new DifferencingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseDisjoining(Disjoining element) { + return new DisjoiningParserAdapter(element); + } + + @Override + public ElementParserAdapter caseElement(Element element) { + return new ElementParserAdapter(element); + } + + @Override + public ElementParserAdapter caseEndFeatureMembership(EndFeatureMembership element) { + return new EndFeatureMembershipParserAdapter(element); + } + + @Override + public ElementParserAdapter caseFeature(Feature element) { + return new FeatureParserAdapter(element); + } + + @Override + public ElementParserAdapter caseFeatureInverting(FeatureInverting element) { + return new FeatureInvertingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseFeatureTyping(FeatureTyping element) { + return new FeatureTypingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseImport(Import element) { + return new ImportParserAdapter(element); + } + + @Override + public ElementParserAdapter caseIntersecting(Intersecting element) { + return new IntersectingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseLiteralString(LiteralString element) { + return new LiteralStringParserAdapter(element); + } + + @Override + public ElementParserAdapter caseMembership(Membership element) { + return new MembershipParserAdapter(element); + } + + @Override + public ElementParserAdapter caseNamespaceImport(NamespaceImport element) { + return new NamespaceImportParserAdapter(element); + } + + @Override + public ElementParserAdapter caseParameterMembership(ParameterMembership element) { + return new ParameterMembershipParserAdapter(element); + } + + @Override + public ElementParserAdapter caseRedefinition(Redefinition element) { + return new RedefinitionParserAdapter(element); + } + + @Override + public ElementParserAdapter caseReferenceSubsetting(ReferenceSubsetting element) { + return new ReferenceSubsettingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseSpecialization(Specialization element) { + return new SpecializationParserAdapter(element); + } + + @Override + public ElementParserAdapter caseSubclassification(Subclassification element) { + return new SubclassificationParserAdapter(element); + } + + @Override + public ElementParserAdapter caseSubsetting(Subsetting element) { + return new SubsettingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseTextualRepresentation(TextualRepresentation element) { + return new TextualRepresentationParserAdapter(element); + } + + @Override + public ElementParserAdapter caseTypeFeaturing(TypeFeaturing element) { + return new TypeFeaturingParserAdapter(element); + } + + @Override + public ElementParserAdapter caseUnioning(Unioning element) { + return new UnioningParserAdapter(element); + } + + }; +} diff --git a/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/LiteralStringParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/LiteralStringParserAdapter.java new file mode 100644 index 000000000..fc68b8b92 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/LiteralStringParserAdapter.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.adapter; + +import org.omg.sysml.lang.sysml.LiteralString; +import org.omg.sysml.util.ElementUtil; + +public class LiteralStringParserAdapter extends FeatureParserAdapter { + + public LiteralStringParserAdapter(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/adapter/MembershipParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/MembershipParserAdapter.java new file mode 100644 index 000000000..830ed30e9 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/MembershipParserAdapter.java @@ -0,0 +1,38 @@ +/******************************************************************************* + * 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.adapter; + +import org.omg.sysml.lang.sysml.Membership; +import org.omg.sysml.lang.sysml.OwningMembership; +import org.omg.sysml.util.ElementUtil; + +public class MembershipParserAdapter extends ElementParserAdapter { + + public MembershipParserAdapter(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/adapter/NamespaceImportParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/NamespaceImportParserAdapter.java new file mode 100644 index 000000000..83bbcf62c --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/NamespaceImportParserAdapter.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.adapter; + +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 NamespaceImportParserAdapter extends ImportParserAdapter { + + public NamespaceImportParserAdapter(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/adapter/ParameterMembershipParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ParameterMembershipParserAdapter.java new file mode 100644 index 000000000..e51881a13 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ParameterMembershipParserAdapter.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * 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.adapter; + +import org.omg.sysml.lang.sysml.Feature; +import org.omg.sysml.lang.sysml.ParameterMembership; + +public class ParameterMembershipParserAdapter extends MembershipParserAdapter { + + public ParameterMembershipParserAdapter(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/adapter/RedefinitionParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/RedefinitionParserAdapter.java new file mode 100644 index 000000000..adb5fe40b --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/RedefinitionParserAdapter.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.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 RedefinitionParserAdapter extends SubsettingParserAdapter { + + public RedefinitionParserAdapter(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/adapter/ReferenceSubsettingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ReferenceSubsettingParserAdapter.java new file mode 100644 index 000000000..19aa23357 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/ReferenceSubsettingParserAdapter.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.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 ReferenceSubsettingParserAdapter extends SubsettingParserAdapter { + + public ReferenceSubsettingParserAdapter(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/adapter/SpecializationParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/SpecializationParserAdapter.java new file mode 100644 index 000000000..42f125d30 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/SpecializationParserAdapter.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.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 SpecializationParserAdapter extends ElementParserAdapter { + + public SpecializationParserAdapter(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/adapter/SubclassificationParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/SubclassificationParserAdapter.java new file mode 100644 index 000000000..95c03cf40 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/SubclassificationParserAdapter.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.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 SubclassificationParserAdapter extends SpecializationParserAdapter { + + public SubclassificationParserAdapter(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/adapter/SubsettingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/SubsettingParserAdapter.java new file mode 100644 index 000000000..4d9d2ccbe --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/SubsettingParserAdapter.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.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 SubsettingParserAdapter extends SpecializationParserAdapter { + + public SubsettingParserAdapter(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/adapter/TextualRepresentationParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/TextualRepresentationParserAdapter.java new file mode 100644 index 000000000..2aa9f223d --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/TextualRepresentationParserAdapter.java @@ -0,0 +1,35 @@ +/******************************************************************************* + * 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.adapter; + +import org.omg.sysml.lang.sysml.TextualRepresentation; +import org.omg.sysml.util.ElementUtil; + +public class TextualRepresentationParserAdapter extends ElementParserAdapter { + + public TextualRepresentationParserAdapter(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/adapter/TypeFeaturingParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/TypeFeaturingParserAdapter.java new file mode 100644 index 000000000..ed5607811 --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/TypeFeaturingParserAdapter.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.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 TypeFeaturingParserAdapter extends ElementParserAdapter { + + public TypeFeaturingParserAdapter(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/adapter/UnioningParserAdapter.java b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/UnioningParserAdapter.java new file mode 100644 index 000000000..cef19228f --- /dev/null +++ b/org.omg.kerml.xtext/src/org/omg/kerml/xtext/adapter/UnioningParserAdapter.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.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 UnioningParserAdapter extends ElementParserAdapter { + + public UnioningParserAdapter(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 a03d9faa7..75018671c 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.adapter.ElementParserAdapter; +import org.omg.kerml.xtext.adapter.KerMLParserAdapterFactory; 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; @@ -70,14 +72,29 @@ protected void postProcessAll(EObject model) { cache.execWithoutCacheClear(model.eResource(), new IUnitOfWork.Void() { @Override 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); + try { + TreeIterator iterator = getAllLinkableContents(model); + while (iterator.hasNext()) { + EObject obj = iterator.next(); + if (obj instanceof Element element) { + doGetAdapter(element).postProcess(); + } + } + } finally { + TreeIterator iterator = getAllLinkableContents(model); + while (iterator.hasNext()) { + EObject obj = iterator.next(); + if (obj instanceof Element element) { + KerMLParserAdapterFactory.removeAdapter(element); + } } } } + }); } + + protected ElementParserAdapter doGetAdapter(Element element) { + return KerMLParserAdapterFactory.getAdapter(element); + } } diff --git a/org.omg.sysml.interactive.tests/META-INF/MANIFEST.MF b/org.omg.sysml.interactive.tests/META-INF/MANIFEST.MF index 28cea1dd5..616c070a3 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/ParserAdapterTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ParserAdapterTest.java new file mode 100644 index 000000000..9afda9f69 --- /dev/null +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ParserAdapterTest.java @@ -0,0 +1,166 @@ +/******************************************************************************* + * 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.assertTrue; + +import org.junit.BeforeClass; +import org.junit.Test; +import org.omg.kerml.xtext.adapter.ElementParserAdapter; +import org.omg.kerml.xtext.adapter.ImportParserAdapter; +import org.omg.kerml.xtext.adapter.LiteralStringParserAdapter; +import org.omg.sysml.xtext.adapter.OccurrenceUsageParserAdapter; +import org.omg.sysml.xtext.adapter.SysMLParserAdapterFactory; +import org.omg.sysml.xtext.adapter.PortUsageParserAdapter; +import org.omg.kerml.xtext.adapter.RedefinitionParserAdapter; +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.SysMLPackage; +import org.omg.sysml.lang.sysml.Usage; +import org.omg.sysml.logic.SysMLLogicStandaloneSetup; +import org.omg.sysml.util.TypeUtil; + +public class ParserAdapterTest extends SysMLInteractiveTest { + + @BeforeClass + public static void setUp() { + SysMLLogicStandaloneSetup.doSetup(); + SysMLPackage.eINSTANCE.eClass(); + } + + @Test + public void factorySelectsTheMostSpecificParserAdapterAndAvoidsDuplicates() { + PortUsage port = SysMLFactory.eINSTANCE.createPortUsage(); + ElementParserAdapter portAdapter = SysMLParserAdapterFactory.getAdapter(port); + assertTrue(portAdapter instanceof PortUsageParserAdapter); + assertEquals(portAdapter, SysMLParserAdapterFactory.getAdapter(port)); + assertEquals(1L, port.eAdapters().stream().filter(ElementParserAdapter.class::isInstance).count()); + + OccurrenceUsage occurrence = SysMLFactory.eINSTANCE.createOccurrenceUsage(); + assertTrue(SysMLParserAdapterFactory.getAdapter(occurrence) instanceof OccurrenceUsageParserAdapter); + assertTrue(SysMLParserAdapterFactory.getAdapter(SysMLFactory.eINSTANCE.createConnectionUsage()) + instanceof OccurrenceUsageParserAdapter); + assertTrue(SysMLParserAdapterFactory.getAdapter(SysMLFactory.eINSTANCE.createAllocationUsage()) + instanceof OccurrenceUsageParserAdapter); + + LiteralString literal = SysMLFactory.eINSTANCE.createLiteralString(); + assertTrue(SysMLParserAdapterFactory.getAdapter(literal) instanceof LiteralStringParserAdapter); + + assertTrue(SysMLParserAdapterFactory.getAdapter(SysMLFactory.eINSTANCE.createRedefinition()) + instanceof RedefinitionParserAdapter); + assertTrue(SysMLParserAdapterFactory.getAdapter(SysMLFactory.eINSTANCE.createMembershipImport()) + instanceof ImportParserAdapter); + + SysMLParserAdapterFactory.removeAdapter(port); + assertFalse(port.eAdapters().stream().anyMatch(ElementParserAdapter.class::isInstance)); + } + + @Test + public void parserAdapterHierarchyPreservesSpecialCaseBehavior() { + 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); + assertFalse(port.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) { + SysMLParserAdapterFactory.getAdapter(element).postProcess(); + SysMLParserAdapterFactory.removeAdapter(element); + assertFalse(element.eAdapters().stream().anyMatch(ElementParserAdapter.class::isInstance)); + } + } + + protected static PartUsage createPartUsage() { + return SysMLFactory.eINSTANCE.createPartUsage(); + } + + protected static PartUsage createPartUsageOwnedByFeatureMembership() { + PartUsage owner = createPartUsage(); + PartUsage usage = createPartUsage(); + 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 000000000..ac033a18c --- /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 56c2da7b4..89bf37cce 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 65addbb32..1063a0e91 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 2d60c5dac..daad36341 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 60a890242..b215db289 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 b6f92f314..c3046a8c6 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 0cf60033e..81a4dd865 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 ba3dbce90..2dad7b313 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 6df64089d..9bc642f24 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 454c0371d..7a72a2621 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 268494295..bc65d4adb 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 d24992bd0..b332f58bf 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 0e0674807..587deb293 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 441e88661..065f143ed 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 fc9c5bd9c..e27b46fe2 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 4f5aeb141..879dbe219 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 b7e208a6c..e596d5037 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 44f69f58b..b018161d0 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 145f8370c..403da4bc3 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 c10f8936a..a2aa76a10 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 65cd0d56f..efff98bca 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 4c4283ef6..587882323 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 80a275eb6..2f9416528 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 a52f5e2eb..e5e7502ff 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 0eeccb4e0..9c00acecf 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 781f86a4e..f8b8b99d2 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 cba4bbde6..5125ea768 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 4014d6398..6e6ada6e7 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 7578e47e5..5c5a143fa 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 7d8c67864..909f806d4 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 6d539361f..c88004699 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 21c49b75d..72e58bf0c 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 2072d544c..a263c5a4d 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 f50987559..be418e844 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 065ce7108..000000000 --- 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 bdb380425..dc5acad34 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 4907a9777..d7ca865e8 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.adapter, 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 eb937ca74..2444a9b91 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 bindILinker() { - KerMLLinker + SysMLLinker } def void configureUseEObjectValidator(Binder binder) { diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/DefinitionParserAdapter.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/DefinitionParserAdapter.java new file mode 100644 index 000000000..86765e557 --- /dev/null +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/DefinitionParserAdapter.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.adapter; + +import org.omg.kerml.xtext.adapter.ElementParserAdapter; +import org.omg.sysml.lang.sysml.Definition; + +public class DefinitionParserAdapter extends ElementParserAdapter { + + public DefinitionParserAdapter(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/adapter/OccurrenceUsageParserAdapter.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/OccurrenceUsageParserAdapter.java new file mode 100644 index 000000000..af953e63a --- /dev/null +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/OccurrenceUsageParserAdapter.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.adapter; + +import org.omg.sysml.lang.sysml.OccurrenceUsage; + +public class OccurrenceUsageParserAdapter extends UsageParserAdapter { + + public OccurrenceUsageParserAdapter(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/adapter/PortConjugationParserAdapter.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/PortConjugationParserAdapter.java new file mode 100644 index 000000000..adb3e54d4 --- /dev/null +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/PortConjugationParserAdapter.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.adapter; + +import org.omg.sysml.lang.sysml.PortConjugation; +import org.omg.sysml.lang.sysml.PortDefinition; +import org.omg.kerml.xtext.adapter.ConjugationParserAdapter; +import org.omg.sysml.lang.sysml.ConjugatedPortDefinition; +import org.omg.sysml.lang.sysml.Element; +import org.omg.sysml.lang.sysml.SysMLPackage; + +public class PortConjugationParserAdapter extends ConjugationParserAdapter { + + public PortConjugationParserAdapter(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/adapter/PortUsageParserAdapter.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/PortUsageParserAdapter.java new file mode 100644 index 000000000..6e011413b --- /dev/null +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/PortUsageParserAdapter.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.adapter; + +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 PortUsageParserAdapter extends UsageParserAdapter { + + public PortUsageParserAdapter(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/adapter/SysMLParserAdapterFactory.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/SysMLParserAdapterFactory.java new file mode 100644 index 000000000..a202bbaaf --- /dev/null +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/SysMLParserAdapterFactory.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * 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.adapter; + +import java.util.Optional; + +import org.omg.kerml.xtext.adapter.ElementParserAdapter; +import org.omg.kerml.xtext.adapter.KerMLParserAdapterFactory.KerMLFactoryAdapterSwitch; +import org.omg.sysml.lang.sysml.Definition; +import org.omg.sysml.lang.sysml.Element; +import org.omg.sysml.lang.sysml.OccurrenceUsage; +import org.omg.sysml.lang.sysml.PortConjugation; +import org.omg.sysml.lang.sysml.PortUsage; +import org.omg.sysml.lang.sysml.Usage; +import org.omg.sysml.lang.sysml.util.SysMLSwitch; + +public class SysMLParserAdapterFactory { + + public static ElementParserAdapter getAdapter(Element element) { + return getExistingAdapter(element).orElseGet(() -> createAdapter(element)); + } + + public static void removeAdapter(Element element) { + getExistingAdapter(element).ifPresent(element.eAdapters()::remove); + } + + protected static Optional getExistingAdapter(Element element) { + return element == null ? Optional.empty() : + element.eAdapters().stream() + .filter(ElementParserAdapter.class::isInstance) + .map(ElementParserAdapter.class::cast) + .findFirst(); + } + + protected static ElementParserAdapter createAdapter(Element element) { + ElementParserAdapter adapter = null; + // PortUsage must be checked before OccurrenceUsage because its parser adapter deliberately + // inherits directly from UsageParserAdapter and applies port-specific post-processing. + if (element instanceof PortUsage portUsage) { + adapter = new PortUsageParserAdapter(portUsage); + // Some concrete OccurrenceUsage subtypes have multiple inheritance. In the generated + // SysMLSwitch, caseFeature may then be visited before caseOccurrenceUsage and would select + // a FeatureParserAdapter, skipping the occurrence-specific portion post-processing. + } else if (element instanceof OccurrenceUsage occurrenceUsage) { + adapter = new OccurrenceUsageParserAdapter(occurrenceUsage); + // For the same reason, some other concrete Usage subtypes reach caseFeature before caseUsage. + // Selecting UsageParserAdapter here guarantees that their common Usage post-processing runs. + } else if (element instanceof Usage usage) { + adapter = new UsageParserAdapter(usage); + } else if (element != null) { + adapter = SWITCH.doSwitch(element); + } + if (adapter != null) { + element.eAdapters().add(adapter); + } + return adapter; + } + + private SysMLParserAdapterFactory() { + } + + public static final SysMLSwitch SWITCH = new SysMLFactoryAdapterSwitch(); + + public static class SysMLFactoryAdapterSwitch extends KerMLFactoryAdapterSwitch { + + @Override + public ElementParserAdapter caseDefinition(Definition element) { + return new DefinitionParserAdapter(element); + } + + @Override + public ElementParserAdapter caseOccurrenceUsage(OccurrenceUsage element) { + return new OccurrenceUsageParserAdapter(element); + } + + @Override + public ElementParserAdapter casePortConjugation(PortConjugation element) { + return new PortConjugationParserAdapter(element); + } + + @Override + public ElementParserAdapter casePortUsage(PortUsage element) { + return new PortUsageParserAdapter(element); + } + + @Override + public ElementParserAdapter caseUsage(Usage element) { + return new UsageParserAdapter(element); + } + + } + + +} diff --git a/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/UsageParserAdapter.java b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/UsageParserAdapter.java new file mode 100644 index 000000000..8265b6312 --- /dev/null +++ b/org.omg.sysml.xtext/src/org/omg/sysml/xtext/adapter/UsageParserAdapter.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.adapter; + +import org.omg.kerml.xtext.adapter.FeatureParserAdapter; +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 UsageParserAdapter extends FeatureParserAdapter { + + public UsageParserAdapter(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 000000000..0291410f0 --- /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.adapter.ElementParserAdapter; +import org.omg.kerml.xtext.scoping.KerMLLinker; +import org.omg.sysml.lang.sysml.Element; +import org.omg.sysml.xtext.adapter.SysMLParserAdapterFactory; + +public class SysMLLinker extends KerMLLinker{ + + @Override + protected ElementParserAdapter doGetAdapter(Element element) { + return SysMLParserAdapterFactory.getAdapter(element); + } + +}