package org.xpect.xtext.lib.setup; import java.io.IOException; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.CoreException; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.ui.resource.IResourceSetProvider; import org.xpect.Environment; import org.xpect.XpectImport; import org.xpect.XpectRequiredEnvironment; import org.xpect.setup.XpectSetupFactory; import org.xpect.state.Creates; import org.xpect.state.Invalidates; import org.xpect.xtext.lib.setup.workspace.Workspace; import org.xpect.xtext.lib.setup.workspace.Workspace.Instance; import org.xpect.xtext.lib.setup.workspace.WorkspaceDefaultsSetup; import org.xpect.xtext.lib.util.XtextOffsetAdapter; import org.xpect.xtext.lib.util.XtextTargetSyntaxSupport; import com.google.inject.Inject; import com.google.inject.Injector; @XpectSetupFactory @XpectRequiredEnvironment(Environment.PLUGIN_TEST) @XpectImport({ WorkspaceDefaultsSetup.class, XtextTargetSyntaxSupport.class, XtextTestObjectSetup.class, InjectorSetup.class, XtextValidatingSetup.class, FileSetupContext.class, XtextOffsetAdapter.class }) public class XtextWorkspaceSetup { private final FileSetupContext ctx; private Workspace.Instance workspace; private final Workspace workspaceConfig; @Inject private IResourceSetProvider resourceSetProvider; public XtextWorkspaceSetup(FileSetupContext ctx, Workspace workspace, Injector injector) { this.ctx = ctx; this.workspaceConfig = workspace; injector.injectMembers(this); } @Creates(ThisFile.class) public IFile createThisFile() { return getInstance().getThisFile(); } @Creates(ThisProject.class) public IProject createThisProject() { return getInstance().getThisProject(); } @Creates public IWorkspace createWorkspace() { return getInstance().getWorkspace(); } protected Workspace.Instance getInstance() { if (workspace == null) { workspaceConfig.cleanWorkspace(); workspace = workspaceConfig.configureWorkspace(ctx); if (workspaceConfig.isAutobuild()) { workspaceConfig.waitForAutoBuild(); } else { workspaceConfig.buildIncrementally(); } // System.out.println(new IResourceFormatter().formatWorkspace()); } return workspace; } public void invalidate() { workspaceConfig.cleanWorkspace(); this.workspace = null; } @Invalidates public void invalidateWorkspace(IWorkspace workspace) { invalidate(); } @Creates(ThisResource.class) public XtextResource createThisResource() throws IOException, CoreException { Instance instance = getInstance(); IFile file = instance.getThisFile(); URI uri = URI.createPlatformResourceURI(file.getFullPath().toString(), true); ResourceSet resourceSet = resourceSetProvider.get(instance.getThisProject()); XtextResource resource = (XtextResource) ctx.load(resourceSet, uri, file.getContents()); return resource; } }