summaryrefslogtreecommitdiffstats
path: root/rba.tool.editor/src/rba/tool/editor/scoping/RBAModelScopeProvider.xtend
diff options
context:
space:
mode:
Diffstat (limited to 'rba.tool.editor/src/rba/tool/editor/scoping/RBAModelScopeProvider.xtend')
-rw-r--r--rba.tool.editor/src/rba/tool/editor/scoping/RBAModelScopeProvider.xtend85
1 files changed, 85 insertions, 0 deletions
diff --git a/rba.tool.editor/src/rba/tool/editor/scoping/RBAModelScopeProvider.xtend b/rba.tool.editor/src/rba/tool/editor/scoping/RBAModelScopeProvider.xtend
new file mode 100644
index 0000000..8fe190f
--- /dev/null
+++ b/rba.tool.editor/src/rba/tool/editor/scoping/RBAModelScopeProvider.xtend
@@ -0,0 +1,85 @@
+/*
+ * generated by Xtext 2.12.0
+ */
+package rba.tool.editor.scoping
+
+import java.util.ArrayList
+import org.eclipse.emf.ecore.EObject
+import org.eclipse.emf.ecore.EReference
+import org.eclipse.xtext.EcoreUtil2
+import org.eclipse.xtext.scoping.IScope
+import org.eclipse.xtext.scoping.Scopes
+import rba.core.AbstractProperty
+import rba.core.ComplexExpression
+import rba.core.Content
+import rba.core.ContentState
+import rba.core.Expression
+import rba.core.LambdaExpression
+import rba.core.ObjectReference
+import rba.core.RBACorePackage
+import rba.core.Scene
+import rba.core.State
+import rba.tool.editor.rbaEditorModel.MemberFeatureReference
+
+/**
+ * This class contains custom scoping description.
+ *
+ * See https://www.eclipse.org/Xtext/documentation/303_runtime_concepts.html#scoping
+ * on how and when to use it.
+ */
+class RBAModelScopeProvider extends AbstractRBAModelScopeProvider {
+
+ override getScope(EObject context, EReference reference) {
+ val scope = super.getScope(context, reference);
+
+ if(reference == RBACorePackage.Literals.OBJECT_REFERENCE__REF_OBJECT) {
+ if(context instanceof MemberFeatureReference) {
+ var Expression expression = (context as MemberFeatureReference).operand.get(0);
+ if(expression !== null) {
+ if(!(expression instanceof ObjectReference)) {
+ return IScope.NULLSCOPE;
+ }
+ val rootElement = (expression as ObjectReference).refObject;
+ if(rootElement instanceof Scene) {
+ val candidates = EcoreUtil2.getAllContentsOfType(rootElement, AbstractProperty);
+ return Scopes.scopeFor(candidates);
+ } else if(rootElement instanceof Content) {
+ val candidates = #[ContentState].map(clazz|EcoreUtil2.getAllContentsOfType(rootElement, clazz).filter(c|c.eContainer === rootElement)).flatten;
+ return Scopes.scopeFor(candidates);
+ } else if(rootElement instanceof State) {
+ val candidates = EcoreUtil2.getAllContentsOfType(rootElement, State).filter(c|c.eContainer === rootElement);
+ return Scopes.scopeFor(candidates);
+ }
+ }
+ } else if(context instanceof ObjectReference) {
+ val candidates = EcoreUtil2.getAllContainers(context).filter(Expression).map [ container |
+ val list = new ArrayList<EObject>();
+ if(container instanceof LambdaExpression) {
+ val lambda = container as LambdaExpression;
+ if(lambda.x !== null)
+ list.add(lambda.x);
+ if(lambda.letStatements !== null && lambda.letStatements.size > 0)
+ list.addAll(lambda.letStatements.map(l|l.variable));
+ if(lambda.bodyText !== null && lambda.bodyText.letStatements !== null && lambda.bodyText.letStatements.size > 0)
+ list.addAll(lambda.bodyText.letStatements.map(l|l.variable));
+ } else if(container instanceof ComplexExpression) {
+ val complex = container as ComplexExpression;
+ if(complex.letStatements !== null && complex.letStatements.size > 0)
+ list.addAll(complex.letStatements.map(l|l.variable));
+ } else {
+ if(container.letStatements !== null && container.letStatements.size > 0)
+ list.addAll(container.letStatements.map(l|l.variable));
+ }
+ return list;
+ ].flatten
+
+ if(candidates.size > 0) {
+ return Scopes.scopeFor(candidates, scope);
+ }
+ }
+ }
+
+ return scope;
+ }
+
+}