package org.jnario.feature.scoping;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtend.core.xtend.XtendTypeDeclaration;
import org.eclipse.xtext.common.types.JvmDeclaredType;
import org.eclipse.xtext.common.types.JvmMember;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.ISelectable;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.impl.MultimapBasedSelectable;
import org.jnario.feature.feature.Feature;
import org.jnario.feature.feature.FeatureFile;
import org.jnario.feature.feature.FeaturePackage;
import org.jnario.feature.feature.Scenario;
import org.jnario.feature.feature.Step;
import org.jnario.scoping.JnarioImportedNamespaceScopeProvider;
import com.google.common.collect.Lists;
public class FeatureImportedNamespaceScopeProvider extends
JnarioImportedNamespaceScopeProvider {
@Override
public IScope getScope(final EObject context, final EReference reference) {
if (reference == FeaturePackage.Literals.STEP_REFERENCE__REFERENCE
|| reference == FeaturePackage.Literals.STEP_REFERENCE__SYNTHETIC_STEP_REFERENCE) {
IScope globalScope = getGlobalScope(context.eResource(), reference);
return internalGetScope(globalScope, globalScope, context,
reference);
} else {
return super.getScope(context, reference);
}
}
@Override
protected ISelectable internalGetAllDescriptions(final Resource resource) {
List<IEObjectDescription> descriptions = Lists.newArrayList();
for (EObject content : resource.getContents()) {
if (content instanceof JvmDeclaredType) {
doGetAllDescriptions((JvmDeclaredType) content, descriptions);
} else if (content instanceof FeatureFile) {
doGetAllDescriptions(((FeatureFile) content), descriptions);
}
}
return new MultimapBasedSelectable(descriptions);
}
private void doGetAllDescriptions(FeatureFile featureFile,
List<IEObjectDescription> descriptions) {
for (XtendTypeDeclaration typeDeclaration : featureFile.getXtendTypes()) {
if (typeDeclaration instanceof Feature) {
doGetAllDescriptions((Feature) typeDeclaration, descriptions);
}
}
}
private void doGetAllDescriptions(Feature feature,
List<IEObjectDescription> descriptions) {
for (Scenario scenario : feature.getScenarios()) {
doGetAllDescriptions(descriptions, scenario);
}
}
private void doGetAllDescriptions(List<IEObjectDescription> descriptions,
Scenario scenario) {
for (Step step : scenario.getSteps()) {
descriptions.add(EObjectDescription.create(
getQualifiedNameProvider().apply(step), step));
}
}
private void doGetAllDescriptions(JvmDeclaredType type,
List<IEObjectDescription> descriptions) {
descriptions.add(EObjectDescription.create(getQualifiedNameConverter()
.toQualifiedName(type.getIdentifier()), type));
for (JvmMember member : type.getMembers()) {
if (member instanceof JvmDeclaredType) {
doGetAllDescriptions((JvmDeclaredType) member, descriptions);
}
}
}
}