diff options
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.xtend | 85 |
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; + } + +} |