/*
 * generated by Xtext 2.11.0
 */
package org.eclipse.osbp.xtext.action.scoping

import org.eclipse.emf.ecore.EObject
import org.eclipse.emf.ecore.EReference
import org.eclipse.osbp.xtext.action.ActionDSLPackage
import org.eclipse.osbp.xtext.action.ActionFunction
import org.eclipse.osbp.xtext.functionlibrarydsl.FunctionLibraryActionGroup
import org.eclipse.xtext.scoping.Scopes

/**
 * 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 ActionDSLScopeProvider extends AbstractActionDSLScopeProvider {

	override getScope(EObject context, EReference reference) {
		if (reference == ActionDSLPackage.Literals.ACTION_FUNCTION__CAN_EXECUTE) {
			return getScope_ActionFunctionCanExecute(context as ActionFunction, reference)
		} else if (reference == ActionDSLPackage.Literals.ACTION_FUNCTION__EXECUTE_IMMEDIATE) {
			return getScope_ActionFunctionExecuteImmediate(context as ActionFunction, reference)
		} else if (reference == ActionDSLPackage.Literals.ACTION_FUNCTION__EXECUTE_LATER) {
			return getScope_ActionFunctionExecuteLater(context as ActionFunction, reference)
		} else{
			return super.getScope(context, reference)
		}
	}

	def getScope_ActionFunctionCanExecute(ActionFunction context, EReference reference) {
		var result = <EObject>newArrayList
		for (can : (context.actionGroup as FunctionLibraryActionGroup).canExecutes) {
			result.add(can)
		}
		return Scopes::scopeFor(result)
	}

	def getScope_ActionFunctionExecuteImmediate(ActionFunction context, EReference reference) {
		var result = <EObject>newArrayList
		for (immediate : (context.actionGroup as FunctionLibraryActionGroup).executes) {
			result.add(immediate)
		}
		return Scopes::scopeFor(result)
	}

	def getScope_ActionFunctionExecuteLater(ActionFunction context, EReference reference) {
		var result = <EObject>newArrayList
		for (later : (context.actionGroup as FunctionLibraryActionGroup).executes) {
			result.add(later)
		}
		return Scopes::scopeFor(result)
	}
	
}
