/**
* generated by Xtext
*/
package org.occiware.clouddesigner.occi.xtext.scoping;
import java.util.ArrayList;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.naming.QualifiedName;
import org.eclipse.xtext.resource.EObjectDescription;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.scoping.IScope;
import org.eclipse.xtext.scoping.impl.AbstractDeclarativeScopeProvider;
import org.eclipse.xtext.scoping.impl.SimpleScope;
import org.occiware.clouddesigner.occi.Attribute;
import org.occiware.clouddesigner.occi.Configuration;
import org.occiware.clouddesigner.occi.Entity;
import org.occiware.clouddesigner.occi.Extension;
import org.occiware.clouddesigner.occi.Kind;
import org.occiware.clouddesigner.occi.Link;
import org.occiware.clouddesigner.occi.Mixin;
import org.occiware.clouddesigner.occi.Resource;
/**
* 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.
*/
@SuppressWarnings("all")
public class OCCIScopeProvider extends AbstractDeclarativeScopeProvider {
private IScope scopeForExtensions(final EList<Extension> extensions) {
final ArrayList<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
for (Extension extension : extensions) {
result.add(EObjectDescription.create(QualifiedName.create(EcoreUtil.getURI(extension).toString()), extension));
}
return new SimpleScope(IScope.NULLSCOPE, result);
}
public IScope scope_Extension_import(final Extension extension, final EReference ref) {
return scopeForExtensions(extension.getImport());
}
public IScope scope_Kind_parent(final Kind kind, final EReference ref) {
final ArrayList<IEObjectDescription> res = new ArrayList<IEObjectDescription>();
Extension extension = (Extension)kind.eContainer();
for(Kind k : extension.getKinds()) {
res.add(EObjectDescription.create(QualifiedName.create(k.getTerm()), k));
}
for(Extension importExtension : extension.getImport()) {
for(Kind k : importExtension.getKinds()) {
res.add(EObjectDescription.create(QualifiedName.create(importExtension.getName(), k.getTerm()), k));
}
}
return new SimpleScope(IScope.NULLSCOPE, res);
}
public IScope scope_Mixin_depends(final Mixin mixin, final EReference ref) {
final ArrayList<IEObjectDescription> res = new ArrayList<IEObjectDescription>();
Extension extension = (Extension)mixin.eContainer();
for(Mixin m : extension.getMixins()) {
res.add(EObjectDescription.create(QualifiedName.create(m.getTerm()), m));
}
for(Extension importExtension : extension.getImport()) {
for(Mixin m : importExtension.getMixins()) {
res.add(EObjectDescription.create(QualifiedName.create(importExtension.getName(), m.getTerm()), m));
}
}
return new SimpleScope(IScope.NULLSCOPE, res);
}
public IScope scope_Mixin_applies(final Mixin mixin, final EReference ref) {
final ArrayList<IEObjectDescription> res = new ArrayList<IEObjectDescription>();
Extension extension = (Extension)mixin.eContainer();
for(Kind k : extension.getKinds()) {
res.add(EObjectDescription.create(QualifiedName.create(k.getTerm()), k));
}
for(Extension importExtension : extension.getImport()) {
for(Kind k : importExtension.getKinds()) {
res.add(EObjectDescription.create(QualifiedName.create(importExtension.getName(), k.getTerm()), k));
}
}
return new SimpleScope(IScope.NULLSCOPE, res);
}
public IScope scope_Attribute_type(final Attribute attribute, final EReference ref) {
final ArrayList<IEObjectDescription> res = new ArrayList<IEObjectDescription>();
Extension extension = (Extension)EcoreUtil2.getRootContainer(attribute);
for(EDataType type : extension.getTypes()) {
res.add(EObjectDescription.create(QualifiedName.create(type.getName()), type));
}
for(Extension importExtension : extension.getImport()) {
for(EDataType type : importExtension.getTypes()) {
res.add(EObjectDescription.create(QualifiedName.create(importExtension.getName(), type.getName()), type));
}
}
return new SimpleScope(IScope.NULLSCOPE, res);
}
public IScope scope_Configuration_use(final Configuration configuration, final EReference ref) {
return scopeForExtensions(configuration.getUse());
}
public IScope scope_Entity_kind(final Entity entity, final EReference ref) {
final ArrayList<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
Configuration configuration = (Configuration)EcoreUtil2.getRootContainer(entity);
for(Extension useExtension : configuration.getUse()) {
for(Kind kind : useExtension.getKinds()) {
result.add(EObjectDescription.create(QualifiedName.create(useExtension.getName(), kind.getTerm()), kind));
}
}
return new SimpleScope(IScope.NULLSCOPE, result);
}
public IScope scope_Entity_mixins(final Entity entity, final EReference ref) {
final ArrayList<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
Configuration configuration = (Configuration)EcoreUtil2.getRootContainer(entity);
for(Extension useExtension : configuration.getUse()) {
for(Mixin mixin : useExtension.getMixins()) {
result.add(EObjectDescription.create(QualifiedName.create(useExtension.getName(), mixin.getTerm()), mixin));
}
}
return new SimpleScope(IScope.NULLSCOPE, result);
}
public IScope scope_Link_target(final Link link, final EReference ref) {
final ArrayList<IEObjectDescription> result = new ArrayList<IEObjectDescription>();
Configuration configuration = (Configuration)EcoreUtil2.getRootContainer(link);
for(Resource resource : configuration.getResources()) {
result.add(EObjectDescription.create(QualifiedName.create(resource.getId()), resource));
}
return new SimpleScope(IScope.NULLSCOPE, result);
}
}