/*
 * generated by Xtext
 */
package org.applause.lang.scoping;

import static org.eclipse.xtext.scoping.Scopes.scopeFor;

import org.applause.lang.applauseDsl.ApplauseDslPackage;
import org.applause.lang.applauseDsl.ObjectReference;
import org.applause.lang.applauseDsl.Parameter;
import org.applause.lang.applauseDsl.SectionCell;
import org.applause.lang.applauseDsl.TableView;
import org.applause.lang.applauseDsl.ViewSection;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;

import com.google.common.collect.Lists;

/**
 * This class contains custom scoping description.
 * 
 * see : http://www.eclipse.org/Xtext/documentation/latest/xtext.html#scoping
 * on how and when to use it 
 *
 */
public class ApplauseDslScopeProvider extends AbstractDeclarativeScopeProvider {
	IScope _scope_ObjectReference_object(SectionCell context, EReference ref) {
		ViewSection section = (ViewSection) context.eContainer();
		TableView tableView = (TableView) section.eContainer();
		Parameter parameter = tableView.getContent();
		return scopeFor(Lists.newArrayList(parameter));
	}
	
	@Override
	public IScope getScope(EObject context, EReference reference) {
		if (ApplauseDslPackage.Literals.VARIABLE_DECLARATION == reference.getEReferenceType()) {
			return getVariableDeclarationScope(context);
		}
		return super.getScope(context, reference);
	}
	
	private IScope getVariableDeclarationScope(EObject context) {
		if(context.eContainer() instanceof ObjectReference)
			return new NestedDeclarationScope((ObjectReference) context.eContainer());
		else
			return new VariableDeclarationScope(context);
	}
}
