From 8c6b9454eb1c188a0d3b2e4f06e53627f7d70e1e Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sat, 21 Mar 2026 00:05:16 -0400 Subject: [PATCH 1/2] ST6RI-923 Added Xpect test for edge case of name resolution. - Fixes the handling of resolution of names of references to members inherited from the implied base type. --- .../ParsingTests_SemanticMetadata.kerml.xt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/parsing/ParsingTests_SemanticMetadata.kerml.xt diff --git a/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/parsing/ParsingTests_SemanticMetadata.kerml.xt b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/parsing/ParsingTests_SemanticMetadata.kerml.xt new file mode 100644 index 000000000..97ea24a74 --- /dev/null +++ b/org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/parsing/ParsingTests_SemanticMetadata.kerml.xt @@ -0,0 +1,52 @@ +//* XPECT_SETUP org.omg.kerml.xpect.tests.parsing.KerMLParsingTest + ResourceSet { + ThisFile {} + File {from ="/library/Base.kerml"} + File {from ="/library/Links.kerml"} + File {from ="/library/Occurrences.kerml"} + File {from ="/library/Objects.kerml"} + File {from ="/library/Performances.kerml"} + File {from ="/library/Metaobjects.kerml"} + File {from ="/library/KerML.kerml"} + File {from ="/library/BaseFunctions.kerml"} + } + Workspace { + JavaProject { + SrcFolder { + ThisFile {} + File {from ="/library/Base.kerml"} + File {from ="/library/Links.kerml"} + File {from ="/library/Occurrences.kerml"} + File {from ="/library/Objects.kerml"} + File {from ="/library/Performances.kerml"} + File {from ="/library/Metaobjects.kerml"} + File {from ="/library/KerML.kerml"} + File {from ="/library/BaseFunctions.kerml"} + } + } + } +END_SETUP +*/ + +// XPECT noErrors ---> "" +package SemanticMetadataTest { + private import Metaobjects::SemanticMetadata; + + classifier P { + feature a; + } + feature p : P; + + metaclass M :> SemanticMetadata { + :>> baseType = p meta KerML::Feature; + } + + classifier Q { + feature a = 1; + #M feature p1 { + // This feature should redefine P::a, not Q::a. + // Redefining Q::a will causes a feature value override error. + feature :>> a = 2; + } + } +} \ No newline at end of file From 1739812969e1f4688b1de58602cd849a098efde7 Mon Sep 17 00:00:00 2001 From: Ed Seidewitz Date: Sat, 21 Mar 2026 00:07:48 -0400 Subject: [PATCH 2/2] ST6RI-923 "Pre-resolved" metaclasses of nested metadata features. - Avoids possibility of improper resolution of other names when using semantic metadata. --- .../src/org/omg/sysml/adapter/TypeAdapter.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java b/org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java index 02722948d..6672b698b 100644 --- a/org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java +++ b/org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java @@ -1,6 +1,6 @@ /******************************************************************************* * SysML 2 Pilot Implementation - * Copyright (c) 2021-2025 Model Driven Solutions, Inc. + * Copyright (c) 2021-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 @@ -436,23 +436,25 @@ public Type getLibraryType(String... defaultNames) { protected List getBaseTypes() { List baseTypes = new ArrayList<>(); if (isGetBaseTypes) { - isGetBaseTypes = false; Type target = getTarget(); for (MetadataFeature metadataFeature : ElementUtil.getAllMetadataFeaturesOf(target)) { + // Resolve metaclass proxy before getting base type, to avoid problems + // with name resolution when applying semantic metadata. + metadataFeature.getMetaclass(); + isGetBaseTypes = false; metadataFeature.getFeature().stream(). filter(f->TypeUtil.specializes(f, getBaseTypeFeature(metadataFeature))). map(FeatureUtil::getValueExpressionFor). filter(expr->expr != null). - map(expr-> - expr.evaluate(metadataFeature)). + map(expr->expr.evaluate(metadataFeature)). filter(results->results != null && !results.isEmpty()). map(results->results.get(0)). map(EvaluationUtil::getMetaclassReferenceOf). filter(Type.class::isInstance). map(Type.class::cast). forEachOrdered(baseTypes::add); + isGetBaseTypes = true; } - isGetBaseTypes = true; } return baseTypes; }