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 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; }