package org.eclipse.emf.ecore.xcore.scoping;
import static com.google.common.collect.Lists.newArrayList;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import org.apache.log4j.Logger;
import org.eclipse.emf.common.util.TreeIterator;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.xtext.EcoreUtil2;
import org.eclipse.xtext.parser.IParseResult;
import org.eclipse.xtext.resource.IDefaultResourceDescriptionStrategy;
import org.eclipse.xtext.resource.IEObjectDescription;
import org.eclipse.xtext.resource.XtextResource;
import org.eclipse.xtext.resource.impl.DefaultResourceDescription;
import org.eclipse.xtext.util.IAcceptor;
import org.eclipse.xtext.util.IResourceScopeCache;
/**
* This implementation ensures that the contents of the resource is not queried
* to compute the exported elements.
* @author Sebastian Zarnekow
*/
public class XcoreResourceDescription extends DefaultResourceDescription
{
private final static Logger log = Logger.getLogger(XcoreResourceDescription.class);
private final IDefaultResourceDescriptionStrategy strategy;
public XcoreResourceDescription(Resource resource, IDefaultResourceDescriptionStrategy strategy,
IResourceScopeCache cache)
{
super(resource, strategy, cache);
this.strategy = strategy;
}
@Override
protected List<IEObjectDescription> computeExportedObjects()
{
Resource resource = getResource();
if (resource instanceof XtextResource)
{
if (!resource.isLoaded())
{
try
{
resource.load(null);
}
catch (IOException e)
{
log.error(e.getMessage(), e);
return Collections.<IEObjectDescription> emptyList();
}
}
IParseResult parseResult = ((XtextResource) resource).getParseResult();
if (parseResult != null && parseResult.getRootASTElement() != null)
{
final List<IEObjectDescription> result = newArrayList();
IAcceptor<IEObjectDescription> acceptor = new IAcceptor<IEObjectDescription>()
{
public void accept(IEObjectDescription description)
{
result.add(description);
}
};
TreeIterator<EObject> allProperContents = EcoreUtil2.eAll(parseResult.getRootASTElement());
while (allProperContents.hasNext())
{
EObject content = allProperContents.next();
if (!strategy.createEObjectDescriptions(content, acceptor))
{
allProperContents.prune();
}
}
return result;
}
}
return super.computeExportedObjects();
}
}