diff --git a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java index f2bee40d57..7c2898fee3 100644 --- a/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java +++ b/org.omg.sysml.interactive.tests/src/org/omg/sysml/interactive/tests/ModelLevelEvaluationTest.java @@ -465,6 +465,8 @@ public void testReflectiveAccess() throws Exception { assertTrue(evaluateBooleanValue(instance, null, "(P meta SysML::PartDefinition).isAbstract")); assertEquals("x", evaluateStringValue(instance, null, "(P meta SysML::PartDefinition).ownedAttribute.name")); assertEquals("PartDefinition", evaluateStringValue(instance, null, "(SysML::PartDefinition meta KerML::Element).name")); + + assertEquals("public", evaluateSingleValue(instance, null, "(P meta SysML::PartDefinition).owningMembership.visibility").getName()); } @Test diff --git a/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.63.0-SNAPSHOT.jar b/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.63.0-SNAPSHOT.jar index 9f62f5b33a..4de266a790 100644 Binary files a/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.63.0-SNAPSHOT.jar and b/org.omg.sysml.logic.bundle/lib/org.omg.sysml.logic-0.63.0-SNAPSHOT.jar differ diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/expressions/ModelLevelExpressionEvaluator.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/expressions/ModelLevelExpressionEvaluator.java index 5f29dd979e..aa2453a6ad 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/expressions/ModelLevelExpressionEvaluator.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/expressions/ModelLevelExpressionEvaluator.java @@ -156,14 +156,14 @@ public EList evaluateFeature(Feature feature, Type type) { Type t = types.get(i); if (t instanceof MetadataFeature && TypeUtil.specializes(feature, EvaluationUtil.getAnnotatedElementFeature((MetadataFeature)t))) { // Evaluate "Metaobject::annotatedElement" feature. - return EvaluationUtil.results(((MetadataFeature)t).getAnnotatedElement()); + return EvaluationUtil.results(feature, ((MetadataFeature)t).getAnnotatedElement()); } else if (EvaluationUtil.isMetaclassFeature(t)) { if (!(feature instanceof Expression)) { // Evaluate the feature as a reflective metaclass attribute. Element element = ((AnnotatingElement)t).getAnnotatedElement().get(0); EStructuralFeature eFeature = element.eClass().getEStructuralFeature(feature.getDeclaredName()); if (eFeature != null) { - return EvaluationUtil.results(element.eGet(eFeature, true)); + return EvaluationUtil.results(feature, element.eGet(eFeature, true)); } } } else { diff --git a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/EvaluationUtil.java b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/EvaluationUtil.java index 4bc09c4ff0..ae28ce68cd 100644 --- a/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/EvaluationUtil.java +++ b/org.omg.sysml.logic/src/main/java/org/omg/sysml/util/EvaluationUtil.java @@ -129,7 +129,7 @@ public static Expression expressionFor(EList results, Element context) public static Expression expressionFor(Element result) { if (result instanceof LiteralExpression) { Object value = valueOf(result); - return value == null? literalInfinity(): (Expression)elementFor(value); + return value == null? literalInfinity(): (Expression)elementFor(null, value); } else if (result instanceof Feature) { FeatureReferenceExpression featureRef = SysMLFactory.eINSTANCE.createFeatureReferenceExpression(); NamespaceUtil.addMemberTo(featureRef, result); @@ -140,29 +140,29 @@ public static Expression expressionFor(Element result) { } - public static EList results(Object object) { + public static EList results(Element context, Object object) { EList results = new BasicEList<>(); - if (object instanceof List) { - ((List)object).stream(). - map(EvaluationUtil::elementFor). + if (object instanceof List list) { + list.stream(). + map(obj->elementFor(context, obj)). filter(e->e != null). forEachOrdered(results::add); } else if (object != null) { - Element element = elementFor(object); - if (object != null) { + Element element = elementFor(context, object); + if (element != null) { results.add(element); } } return results; } - public static Element elementFor(Object object) { + public static Element elementFor(Element context, Object object) { return object instanceof Boolean? literalBoolean((Boolean)object): object instanceof String? literalString((String)object): object instanceof Integer? literalInteger((Integer)object): object instanceof Double? literalRational((Double)object): object instanceof Element? ElementUtil.getMetaclassFeatureFor((Element)object): - null; + enumUsage(context, object); } public static LiteralBoolean literalBoolean(boolean value) { @@ -193,6 +193,22 @@ public static LiteralInfinity literalInfinity() { return SysMLFactory.eINSTANCE.createLiteralInfinity(); } + public static Feature enumUsage(Element context, Object object) { + if (object != null) { + Class class_ = object.getClass(); + if (class_ != null) { + String name = class_.getSimpleName() + "::" + object; + Type type = SysMLLibraryUtil.getLibraryType(context, + "KerML::Root::" + name, "KerML::Core::" + name, "KerML::Kernel::" + name, + "SysML::Systems::" + name); + if (type instanceof Feature feature) { + return feature; + } + } + } + return null; + } + public static EList booleanResult(boolean value) { return singletonList(literalBoolean(value)); } diff --git a/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.63.0-SNAPSHOT.jar b/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.63.0-SNAPSHOT.jar index 14d2eb57e4..5dbc8217cd 100644 Binary files a/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.63.0-SNAPSHOT.jar and b/org.omg.sysml.model.bundle/lib/org.omg.sysml.model-0.63.0-SNAPSHOT.jar differ