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