package jetbrains.mps.tool.builder.make; /*Generated by MPS */ import jetbrains.mps.make.service.AbstractMakeService; import jetbrains.mps.make.IMakeService; import java.util.concurrent.Future; import jetbrains.mps.make.script.IResult; import jetbrains.mps.make.MakeSession; import jetbrains.mps.make.resources.IResource; import jetbrains.mps.make.script.IScript; import jetbrains.mps.make.script.IScriptController; import org.jetbrains.annotations.NotNull; import org.jetbrains.mps.openapi.util.ProgressMonitor; import jetbrains.mps.progress.EmptyProgressMonitor; import jetbrains.mps.make.IMakeNotificationListener; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.messages.Message; import jetbrains.mps.messages.MessageKind; import jetbrains.mps.internal.make.runtime.util.FutureValue; import jetbrains.mps.make.dependencies.MakeSequence; import jetbrains.mps.make.service.CoreMakeTask; import jetbrains.mps.make.script.ScriptBuilder; import jetbrains.mps.make.facet.IFacet; import jetbrains.mps.make.facet.ITarget; public class BuildMakeService extends AbstractMakeService implements IMakeService { public BuildMakeService() { } @Override public Future<IResult> make(MakeSession session, Iterable<? extends IResource> resources, IScript script, IScriptController controller, @NotNull ProgressMonitor monitor) { return doMake(session, resources, script, controller, monitor); } @Override public Future<IResult> make(MakeSession session, Iterable<? extends IResource> resources) { return make(session, resources, defaultMakeScript(), null, new EmptyProgressMonitor()); } @Override public boolean isSessionActive() { return false; } @Override public boolean openNewSession(MakeSession session) { return false; } @Override public void closeSession(MakeSession session) { } @Override public void addListener(IMakeNotificationListener listener) { throw new UnsupportedOperationException(); } @Override public void removeListener(IMakeNotificationListener listener) { throw new UnsupportedOperationException(); } private Future<IResult> doMake(MakeSession makeSession, Iterable<? extends IResource> inputRes, IScript defaultScript, IScriptController controller, @NotNull ProgressMonitor monitor) { String scrName = "Build"; if (Sequence.fromIterable(inputRes).isEmpty()) { String msg = scrName + " aborted: nothing to do"; makeSession.getMessageHandler().handle(new Message(MessageKind.ERROR, msg)); return new FutureValue<IResult>(new IResult.FAILURE(null)); } MakeSequence makeSeq = new MakeSequence(inputRes, defaultScript, makeSession); IScriptController ctl = this.completeController(makeSession, controller); CoreMakeTask task = new CoreMakeTask(scrName, makeSeq, ctl, makeSession.getMessageHandler()); task.run(monitor); return new FutureValue<IResult>(task.getResult()); } private IScriptController completeController(MakeSession msess, final IScriptController ctl) { // Assume if client supplied IScriptController, he knows what he's doing and bears full responsibility // to supply correct IConfigMonitor and IJobMonitor instances if (ctl != null) { return ctl; } // Although there's knowledge about default make targets (see #defaultMakeScript(), below), // I don't want IMakeService to configure any target here explicitly. It's up to caller to configure // actual targets (yes, they are not necessarily the same as in default script) with desired values, not // service's to guess defaults. Id rather fail and see which targets were not configured. return new IScriptController.Stub2(msess); } public static IScript defaultMakeScript() { return new ScriptBuilder().withFacetNames(new IFacet.Name("jetbrains.mps.lang.resources.Binaries"), new IFacet.Name("jetbrains.mps.lang.core.Generate"), new IFacet.Name("jetbrains.mps.lang.core.TextGen"), new IFacet.Name("jetbrains.mps.make.facets.JavaCompile"), new IFacet.Name("jetbrains.mps.make.facets.Make")).withFinalTarget(new ITarget.Name("jetbrains.mps.make.facets.Make.make")).toScript(); } }