Skip to content

Commit 8558fd2

Browse files
committed
ST6RI-795 Added caching of redefined features to inheritance calc.
1 parent 049b9d9 commit 8558fd2

3 files changed

Lines changed: 34 additions & 17 deletions

File tree

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

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,6 @@
6363

6464
public class FeatureAdapter extends TypeAdapter {
6565

66-
EList<Type> types = null;
67-
6866
public FeatureAdapter(Feature element) {
6967
super(element);
7068
}
@@ -89,9 +87,27 @@ public EList<Membership> getInheritedMembership(Collection<Namespace> excludedNa
8987
}
9088
return inheritedMemberships;
9189
}
90+
91+
public boolean redefinesAnyOf(Collection<Feature> features, Set<Feature> visited) {
92+
Feature feature = getTarget();
93+
if (features.contains(feature) || features.stream().anyMatch(redefinedFeatures::contains)) {
94+
return true;
95+
} else {
96+
visited.add(feature);
97+
for (var redefined: getRedefinedFeaturesWithComputed(null)) {
98+
if (!visited.contains(redefined) && FeatureUtil.redefinesAnyOf(redefined, features, visited)) {
99+
redefinedFeatures.add(redefined);
100+
return true;
101+
}
102+
}
103+
return false;
104+
}
105+
}
92106

93107
// Caching
94108

109+
EList<Type> types = null;
110+
95111
public EList<Type> getTypes() {
96112
return types;
97113
}
@@ -100,11 +116,14 @@ public EList<Type> setTypes(EList<Type> types) {
100116
this.types = types;
101117
return types;
102118
}
119+
120+
Collection<Feature> redefinedFeatures = new HashSet<>();
103121

104122
@Override
105123
public void clearCaches() {
106124
super.clearCaches();
107125
types = null;
126+
redefinedFeatures.clear();
108127
}
109128

110129
// Implicit Elements

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public EList<Membership> getInheritedMembership(Collection<Namespace> excludedNa
102102
}
103103
}
104104
Collection<Feature> newRedefinedFeatures = new HashSet<>(redefinedFeatures);
105-
newRedefinedFeatures.addAll(TypeUtil.getAllFeaturesRedefinedBy(target));
105+
newRedefinedFeatures.addAll(getAllFeaturesRedefinedByType());
106106
for (Type general: TypeUtil.getGeneralTypesOf(target)) {
107107
if (general != null && !excludedTypes.contains(general)) {
108108
inheritedMemberships.addAll(TypeUtil.getNonPrivateMembershipFor(general, excludedNamespaces, excludedTypes, includeProtected, excludeImplied, newRedefinedFeatures));
@@ -129,10 +129,18 @@ protected static void removeRedefinedFeatures(Collection<Membership> memberships
129129
FeatureUtil.redefinesAnyOf((Feature)memberElement, redefinedFeatures);
130130
});
131131
}
132+
133+
protected Collection<Feature> getAllFeaturesRedefinedByType() {
134+
if (allRedefinedFeatures == null) {
135+
allRedefinedFeatures = TypeUtil.getAllFeaturesRedefinedBy(getTarget());
136+
}
137+
return allRedefinedFeatures;
138+
}
132139

133140
// Caching
134141

135142
private EList<Membership> inheritedMembership = null;
143+
private Collection<Feature> allRedefinedFeatures = null;
136144

137145
public EList<Membership> getInheritedMembership() {
138146
return inheritedMembership;
@@ -146,6 +154,7 @@ public EList<Membership> setInheritedMembership(EList<Membership> inheritedMembe
146154
public void clearCaches() {
147155
super.clearCaches();
148156
inheritedMembership = null;
157+
allRedefinedFeatures = null;
149158
}
150159

151160
// Implicit Elements

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

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -243,20 +243,9 @@ public static boolean redefinesAnyOf(Feature feature, Collection<Feature> redefi
243243
return redefinesAnyOf(feature, redefinedFeatures, new HashSet<>());
244244
}
245245

246-
private static boolean redefinesAnyOf(Feature feature, Collection<Feature> redefinedFeatures, Set<Feature> visited) {
247-
if (feature == null) {
248-
return false;
249-
} else if (redefinedFeatures.contains(feature)) {
250-
return true;
251-
} else {
252-
visited.add(feature);
253-
for (var redefined: FeatureUtil.getRedefinedFeaturesWithComputedOf(feature, null)) {
254-
if (!visited.contains(redefined) && redefinesAnyOf(redefined, redefinedFeatures, visited)) {
255-
return true;
256-
}
257-
}
258-
return false;
259-
}
246+
public static boolean redefinesAnyOf(Feature feature, Collection<Feature> redefinedFeatures, Set<Feature> visited) {
247+
return feature != null &&
248+
getFeatureAdapter(feature).redefinesAnyOf(redefinedFeatures, visited);
260249
}
261250

262251
// Feature values

0 commit comments

Comments
 (0)