Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcbrun2015-03-30 13:49:26 +0000
committercbrun2015-04-17 11:19:12 +0000
commit7ca9001b6977d26829e37e539f8ecf23133e7b5d (patch)
treeca880a0f532b5a297df3d13246ba4bee2fee4fc2
parent309f55a1134dccf4823b121169b651e46c91d9d5 (diff)
downloadorg.eclipse.sirius-7ca9001b6977d26829e37e539f8ecf23133e7b5d.tar.gz
org.eclipse.sirius-7ca9001b6977d26829e37e539f8ecf23133e7b5d.tar.xz
org.eclipse.sirius-7ca9001b6977d26829e37e539f8ecf23133e7b5d.zip
[463430] FeatureInterpreter returns possible result types
Bug: 463430 Change-Id: Ib86095b1d094965dfdddc227d1d16d688d5ddaeb Signed-off-by: Cedric Brun <cedric.brun@obeo.fr>
-rw-r--r--plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/VariableType.java16
-rw-r--r--plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/FeatureInterpreter.java21
2 files changed, 33 insertions, 4 deletions
diff --git a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/VariableType.java b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/VariableType.java
index 092b352a36..d0c6686e5b 100644
--- a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/VariableType.java
+++ b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/api/interpreter/VariableType.java
@@ -16,6 +16,7 @@ import java.util.List;
import java.util.Set;
import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EPackage;
import com.google.common.base.Joiner;
@@ -74,6 +75,21 @@ public final class VariableType {
}
/**
+ * Create a new {@link VariableType} from a collection of EClassifiers.
+ *
+ * @param types
+ * a collection of EClassifiers
+ * @return the newly created instance.
+ */
+ public static VariableType fromEClassifiers(Collection<EClassifier> types) {
+ VariableType result = new VariableType();
+ for (EClassifier domainClass : types) {
+ result.types.add(TypeName.fromEClassifier(domainClass));
+ }
+ return result;
+ }
+
+ /**
* Return a {@link TypeName} representation of a common type matching all
* the definitions. This should only be used by interpreters or code which
* can't take into account the fact that a Variable can have multiple types
diff --git a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/FeatureInterpreter.java b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/FeatureInterpreter.java
index 92b2438bcb..ac42a702a1 100644
--- a/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/FeatureInterpreter.java
+++ b/plugins/org.eclipse.sirius.common/src/org/eclipse/sirius/common/tools/internal/interpreter/FeatureInterpreter.java
@@ -11,9 +11,12 @@
package org.eclipse.sirius.common.tools.internal.interpreter;
import java.util.Iterator;
+import java.util.Set;
import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.sirius.common.tools.api.interpreter.EvaluationException;
import org.eclipse.sirius.common.tools.api.interpreter.IInterpreter;
@@ -27,6 +30,7 @@ import org.eclipse.sirius.common.tools.api.interpreter.VariableType;
import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
/**
* A specialized interpreter which only supports direct access to a named
@@ -116,26 +120,35 @@ public class FeatureInterpreter extends AbstractInterpreter implements org.eclip
String featureName = expression.substring(PREFIX.length());
VariableType targetType = context.getTargetType();
if (!isDefaultFeatureName(featureName)) {
+ Set<EClassifier> possibleReturnTypes = Sets.newLinkedHashSet();
for (TypeName typeName : targetType.getPossibleTypes()) {
Iterator<EClass> possibleEClasses = Iterators.filter(typeName.search(context.getAvailableEPackages()).iterator(), EClass.class);
boolean foundAtLeastOneValid = false;
while (!foundAtLeastOneValid && possibleEClasses.hasNext()) {
EClass cur = possibleEClasses.next();
- foundAtLeastOneValid = hasFeatureName(cur, featureName);
+ foundAtLeastOneValid = hasFeatureNameAndCollectReturnTypes(cur, featureName, possibleReturnTypes);
}
if (!foundAtLeastOneValid) {
interpreterStatus.addStatus(InterpreterStatusFactory.createInterpreterStatus(context, IInterpreterStatus.ERROR, "The current element " + typeName.getCompleteName("::")
+ " does not have the feature named : " + featureName));
}
}
+ if (possibleReturnTypes.size() > 0) {
+ interpreterStatus.setReturnType(VariableType.fromEClassifiers(possibleReturnTypes));
+ }
}
}
return interpreterStatus;
}
- private boolean hasFeatureName(EClass currentElementType, String featureName) {
- boolean hasFeatureName = currentElementType.getEStructuralFeature(featureName) != null;
- return hasFeatureName;
+ private boolean hasFeatureNameAndCollectReturnTypes(EClass currentElementType, String featureName, Set<EClassifier> possibleTargetTypes) {
+ EStructuralFeature feature = currentElementType.getEStructuralFeature(featureName);
+ if (feature instanceof EReference) {
+ if (feature.getEType() != null) {
+ possibleTargetTypes.add(feature.getEType());
+ }
+ }
+ return feature != null;
}
private boolean isDefaultFeatureName(String featureName) {

Back to the top