Skip to content

Commit bf163ed

Browse files
authored
Merge pull request #701 from Systems-Modeling/ST6RI-881
ST6RI-881 Conditional computation of baseType of semantic metadata doesn't work
2 parents 161bb62 + 87fccb8 commit bf163ed

5 files changed

Lines changed: 80 additions & 50 deletions

File tree

kerml/src/examples/Simple Tests/MetadataTest.kerml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,18 @@ package MetadataTest {
3838
}
3939
}
4040

41+
class CC;
42+
struct SS {
43+
feature cc : CC;
44+
}
45+
46+
metaclass M :> Metaobjects::SemanticMetadata {
47+
:>> annotatedElement : KerML::Class;
48+
:>> baseType = if annotatedElement istype KerML::Structure ?
49+
SS meta KerML::Type else CC meta KerML::Class;
50+
}
51+
52+
#M struct T {
53+
feature :>> cc;
54+
}
4155
}

org.omg.kerml.xpect.tests/src/org/omg/kerml/xpect/tests/parsing/ParsingTests_Metadata.kerml.xt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
File {from ="/library/Performances.kerml"}
99
File {from ="/library/Metaobjects.kerml"}
1010
File {from ="/library/KerML.kerml"}
11+
File {from ="/library/BaseFunctions.kerml"}
12+
File {from ="/library/ControlFunctions.kerml"}
1113
}
1214
Workspace {
1315
JavaProject {
@@ -20,6 +22,8 @@
2022
File {from ="/library/Performances.kerml"}
2123
File {from ="/library/Metaobjects.kerml"}
2224
File {from ="/library/KerML.kerml"}
25+
File {from ="/library/BaseFunctions.kerml"}
26+
File {from ="/library/ControlFunctions.kerml"}
2327
}
2428
}
2529
}
@@ -54,4 +58,19 @@ package Metadata {
5458
#A #B metadata C;
5559
#A #B @C;
5660
}
61+
62+
class CC;
63+
struct SS {
64+
feature cc : CC;
65+
}
66+
67+
metaclass M :> Metaobjects::SemanticMetadata {
68+
:>> annotatedElement : KerML::Class;
69+
:>> baseType = if annotatedElement istype KerML::Structure ?
70+
SS meta KerML::Type else CC meta KerML::Class;
71+
}
72+
73+
#M struct T {
74+
feature :>> cc;
75+
}
5776
}

org.omg.sysml/src/org/omg/sysml/adapter/FeatureAdapter.java

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import org.eclipse.emf.common.util.EList;
3636
import org.eclipse.emf.ecore.EClass;
37+
import org.eclipse.emf.ecore.InternalEObject;
3738
import org.omg.sysml.lang.sysml.Association;
3839
import org.omg.sysml.lang.sysml.BindingConnector;
3940
import org.omg.sysml.lang.sysml.Connector;
@@ -61,6 +62,7 @@
6162
import org.omg.sysml.util.ElementUtil;
6263
import org.omg.sysml.util.ExpressionUtil;
6364
import org.omg.sysml.util.FeatureUtil;
65+
import org.omg.sysml.util.NonNotifyingEObjectEList;
6466
import org.omg.sysml.util.TypeUtil;
6567

6668
public class FeatureAdapter extends TypeAdapter {
@@ -112,15 +114,6 @@ public String getEffectiveShortName() {
112114
return storedEffectiveShortName;
113115
}
114116

115-
public EList<Type> getTypes() {
116-
return types;
117-
}
118-
119-
public EList<Type> setTypes(EList<Type> types) {
120-
this.types = types;
121-
return types;
122-
}
123-
124117
Set<Feature> allRedefinedFeatures = null;
125118

126119
@Override
@@ -549,6 +542,45 @@ public boolean isComputeRedefinitions() {
549542
target.getOwnedRedefinition().isEmpty());
550543
}
551544

545+
public EList<Type> getAllTypes() {
546+
if (types == null) {
547+
types = new NonNotifyingEObjectEList<Type>(Type.class, (InternalEObject)getTarget(), SysMLPackage.FEATURE__TYPE);
548+
getTypes(types, new HashSet<Feature>());
549+
removeRedundantTypes(types);
550+
}
551+
return types;
552+
}
553+
554+
public void getTypes(List<Type> types, Set<Feature> visitedFeatures) {
555+
Feature feature = getTarget();
556+
visitedFeatures.add(feature);
557+
computeImplicitGeneralTypes();
558+
getFeatureTypes(types, visitedFeatures);
559+
for (Feature typingFeature : feature.typingFeatures()) {
560+
if (!visitedFeatures.contains(typingFeature)) {
561+
FeatureUtil.getTypesOf(typingFeature, types, visitedFeatures);
562+
}
563+
}
564+
}
565+
566+
public void getFeatureTypes(List<Type> types, Set<Feature> visitedFeatures) {
567+
Feature feature = getTarget();
568+
feature.getOwnedTyping().stream().
569+
map(typing->typing.getType()).
570+
filter(type->type != null).
571+
forEachOrdered(types::add);
572+
types.addAll(getImplicitGeneralTypes(SysMLPackage.eINSTANCE.getFeatureTyping()));
573+
}
574+
575+
protected static void removeRedundantTypes(List<Type> types) {
576+
for (int i = types.size() - 1; i >= 0 ; i--) {
577+
Type type = types.get(i);
578+
if (types.stream().anyMatch(otherType->otherType != type && TypeUtil.specializes(otherType, type))) {
579+
types.remove(i);
580+
}
581+
}
582+
}
583+
552584
/**
553585
* Compute relevant implicit Redefinitions, as appropriate.
554586
*/

org.omg.sysml/src/org/omg/sysml/adapter/TypeAdapter.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,8 @@ protected List<Type> getBaseTypes() {
443443
filter(f->TypeUtil.specializes(f, getBaseTypeFeature(metadataFeature))).
444444
map(FeatureUtil::getValueExpressionFor).
445445
filter(expr->expr != null).
446-
map(expr->expr.evaluate(target)).
446+
map(expr->
447+
expr.evaluate(metadataFeature)).
447448
filter(results->results != null && !results.isEmpty()).
448449
map(results->results.get(0)).
449450
map(EvaluationUtil::getMetaclassReferenceOf).
@@ -456,7 +457,7 @@ protected List<Type> getBaseTypes() {
456457
return baseTypes;
457458
}
458459

459-
protected Feature getBaseTypeFeature(Element element) {
460+
protected static Feature getBaseTypeFeature(Element element) {
460461
return (Feature)SysMLLibraryUtil.getLibraryType(element,
461462
ImplicitGeneralizationMap.getDefaultSupertypeFor(element.getClass(), "baseType"));
462463
}

org.omg.sysml/src/org/omg/sysml/util/FeatureUtil.java

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
import java.util.Optional;
3030
import java.util.Set;
3131
import java.util.function.Consumer;
32-
import java.util.function.Supplier;
3332
import java.util.stream.Collectors;
3433
import java.util.stream.Stream;
3534

@@ -58,7 +57,6 @@
5857
import org.omg.sysml.lang.sysml.Step;
5958
import org.omg.sysml.lang.sysml.Subsetting;
6059
import org.omg.sysml.lang.sysml.SysMLFactory;
61-
import org.omg.sysml.lang.sysml.SysMLPackage;
6260
import org.omg.sysml.lang.sysml.Type;
6361
import org.omg.sysml.lang.sysml.TypeFeaturing;
6462

@@ -120,12 +118,6 @@ public static boolean checkIsOrdered(Feature feature, Set<Feature> visited) {
120118

121119
// Typing
122120

123-
public static EList<Type> cacheTypesOf(Feature feature, Supplier<EList<Type>> supplier) {
124-
FeatureAdapter adapter = getFeatureAdapter(feature);
125-
EList<Type> types = adapter.getTypes();
126-
return types == null? adapter.setTypes(supplier.get()): types;
127-
}
128-
129121
public static <T> T getFirstTypeOf(Feature feature, Class<T> kind) {
130122
return FeatureUtil.getAllTypesOf(feature).stream().
131123
filter(kind::isInstance).
@@ -144,39 +136,11 @@ public static <T> EList<T> getAllTypesOf(Feature feature, Class<T> kind, int fea
144136
}
145137

146138
public static EList<Type> getAllTypesOf(Feature feature) {
147-
return FeatureUtil.cacheTypesOf(feature, ()->{
148-
EList<Type> types = new NonNotifyingEObjectEList<Type>(Type.class, (InternalEObject)feature, SysMLPackage.FEATURE__TYPE);
149-
getTypesOf(feature, types, new HashSet<Feature>());
150-
removeRedundantTypes(types);
151-
return types;
152-
});
139+
return getFeatureAdapter(feature).getAllTypes();
153140
}
154141

155-
private static void getTypesOf(Feature feature, List<Type> types, Set<Feature> visitedFeatures) {
156-
visitedFeatures.add(feature);
157-
getFeatureTypesOf(feature, types, visitedFeatures);
158-
for (Feature typingFeature : feature.typingFeatures()) {
159-
if (!visitedFeatures.contains(typingFeature)) {
160-
getTypesOf(typingFeature, types, visitedFeatures);
161-
}
162-
}
163-
}
164-
165-
private static void getFeatureTypesOf(Feature feature, List<Type> types, Set<Feature> visitedFeatures) {
166-
feature.getOwnedTyping().stream().
167-
map(typing->typing.getType()).
168-
filter(type->type != null).
169-
forEachOrdered(types::add);
170-
types.addAll(TypeUtil.getImplicitGeneralTypesFor(feature, SysMLPackage.eINSTANCE.getFeatureTyping()));
171-
}
172-
173-
protected static void removeRedundantTypes(List<Type> types) {
174-
for (int i = types.size() - 1; i >= 0 ; i--) {
175-
Type type = types.get(i);
176-
if (types.stream().anyMatch(otherType->otherType != type && TypeUtil.specializes(otherType, type))) {
177-
types.remove(i);
178-
}
179-
}
142+
public static void getTypesOf(Feature feature, List<Type> types, Set<Feature> visitedFeatures) {
143+
getFeatureAdapter(feature).getTypes(types, visitedFeatures);
180144
}
181145

182146
public static FeatureTyping addFeatureTypingTo(Feature feature) {

0 commit comments

Comments
 (0)