package org.eclipse.emf.ecore.xcore.resource;
import java.util.Iterator;
import java.util.List;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.xcore.XPackage;
import org.eclipse.emf.ecore.xcore.mappings.XcoreMapper;
import org.eclipse.emf.ecore.xcore.util.XcoreEcoreBuilder;
import org.eclipse.emf.ecore.xcore.util.XcoreGenmodelBuilder;
import org.eclipse.emf.ecore.xcore.util.XcoreJvmInferrer;
import org.eclipse.xtext.common.types.JvmGenericType;
import org.eclipse.xtext.parser.antlr.IReferableElementsUnloader;
import org.eclipse.xtext.resource.DerivedStateAwareResource;
import org.eclipse.xtext.resource.IDerivedStateComputer;
import com.google.inject.Inject;
import com.google.inject.Provider;
import static com.google.common.collect.Lists.*;
public class LateInferrer implements IDerivedStateComputer
{
@Inject
private XcoreJvmInferrer jvmInferrer;
@Inject
private XcoreGenmodelBuilder genModelBuilder;
@Inject
private Provider<XcoreEcoreBuilder> xcoreEcoreBuilderProvider;
@Inject
private XcoreMapper mapper;
@Inject
private IReferableElementsUnloader unloader;
public void installDerivedState(DerivedStateAwareResource resource, boolean preLinkingPhase)
{
if (resource.getParseResult() != null && resource.getParseResult().getRootASTElement() instanceof XPackage)
{
XPackage model = (XPackage) resource.getParseResult().getRootASTElement();
XcoreEcoreBuilder xcoreEcoreBuilder = xcoreEcoreBuilderProvider.get();
EPackage ePackage = xcoreEcoreBuilder.getEPackage(model);
resource.getContents().add(ePackage);
GenModel genModel = genModelBuilder.getGenModel(model);
xcoreEcoreBuilder.link();
genModelBuilder.initializeUsedGenPackages(genModel);
resource.getContents().addAll(jvmInferrer.getDeclaredTypes(model));
resource.getCache().clear(resource);
}
}
public void discardDerivedState(DerivedStateAwareResource resource)
{
EList<EObject> contents = resource.getContents();
int size = contents.size();
if (size > 1)
{
List<EObject> toBeRemoved = newArrayList();
for (Iterator<EObject> i = contents.iterator(); i.hasNext();)
{
EObject eObject = i.next();
if (eObject instanceof XPackage)
{
mapper.unsetMapping((XPackage) eObject);
}
else
{
unloader.unloadRoot(eObject);
toBeRemoved.add(eObject);
}
}
contents.removeAll(toBeRemoved);
}
}
}