package jetbrains.mps.build.ant.generation;
/*Generated by MPS */
import jetbrains.mps.build.ant.MpsLoadTask;
import jetbrains.mps.tool.common.GeneratorProperties;
import jetbrains.mps.tool.common.JavaCompilerProperties;
import jetbrains.mps.build.ant.LibraryDataType;
import java.io.File;
import jetbrains.mps.tool.common.ScriptProperties;
import java.util.Set;
import java.util.List;
import jetbrains.mps.build.ant.MPSClasspathUtil;
import org.apache.tools.ant.BuildException;
import java.util.LinkedHashSet;
public class GenerateTask extends MpsLoadTask {
private final GeneratorProperties myGenProps;
private final JavaCompilerProperties myJavaCompilerProperties;
public GenerateTask() {
myGenProps = new GeneratorProperties(myWhatToDo);
myGenProps.setStrictMode(true).setParallelMode(false).setInplaceTransform(false).setHideWarnings(false).setCreateStaticRefs(true);
myJavaCompilerProperties = new JavaCompilerProperties(myWhatToDo);
}
@Override
protected String getWorkerClass() {
return "jetbrains.mps.tool.builder.make.GeneratorWorker";
}
public void addConfiguredChunk(Chunk chunk) {
myWhatToDo.addChunk(chunk.getModules(), chunk.getBootstrap());
}
public void addConfiguredLibrary(LibraryDataType jar) {
File file = jar.getFile();
if (file == null) {
return;
}
myWhatToDo.addLibraryJar(file.getAbsolutePath());
String fname = file.getName();
if (file.isFile() && fname.endsWith(".jar")) {
// perhaps, it's a language.jar, register corresponding generator.jar, if any.
// FIXME note, this is a hack as build language doesn't record generators among MPSModulesClosure.generationDependenciesClosure()
// (check MPSModulesPartitioner.buildExternalDependencies() and <generate> task template.
// MPS used to guess (aka 'derive') generator module from language's module (ProjectPathUtil gave file with "-generator.jar" suffix
// as classpath for packaged Generator module), in 2017.1 we try to switch to 'honest' modules, gradually moving towards generators listed
// inside <generate> task. For the transition period, however, the code below mimics what we would have explicitly specified in <generate>.
File generatorJar = new File(file.getParent(), fname.substring(0, fname.length() - 4) + "-generator.jar");
if (generatorJar.isFile()) {
myWhatToDo.addLibraryJar(generatorJar.getAbsolutePath());
}
// FIXME if I don't fix build language templates to list generator.jar explicitly, shall account for lang-N-generator.jar here to support multiple generators per language case.
}
}
public void setStrictMode(boolean strictMode) {
myGenProps.setStrictMode(strictMode);
}
public void setParallelMode(boolean parallelMode) {
myGenProps.setParallelMode(parallelMode);
}
public void setUseInplaceTransform(boolean inplaceEnabled) {
myGenProps.setInplaceTransform(inplaceEnabled);
}
public void setParallelThreads(int threadCount) {
myGenProps.setParallelThreads(threadCount);
}
public void setHideWarnings(boolean hideWarnings) {
myGenProps.setHideWarnings(hideWarnings);
}
public void setCreateStaticRefs(boolean useStaticRefs) {
myGenProps.setCreateStaticRefs(useStaticRefs);
}
public void addConfiguredPlugin(Plugin plugin) {
String property = myWhatToDo.getProperty(ScriptProperties.PLUGIN_PATHS);
if ((property == null || property.length() == 0)) {
property = plugin.getPath().getAbsolutePath();
} else {
property += File.pathSeparator + plugin.getPath().getAbsolutePath();
}
myWhatToDo.putProperty(ScriptProperties.PLUGIN_PATHS, property);
}
public void setTargetJavaVersion(String targetJavaVersion) {
myJavaCompilerProperties.setTargetJavaVersion(targetJavaVersion);
}
@Override
protected Set<File> calculateClassPath(boolean fork) {
List<File> classPathRoots = MPSClasspathUtil.getClassPathRootsFromDependencies(getProject());
if (classPathRoots.isEmpty()) {
throw new BuildException("Dependency on MPS build scripts is required to generate MPS modules.");
}
Set<File> classPath = new LinkedHashSet<File>();
for (File file : classPathRoots) {
MPSClasspathUtil.gatherAllClassesAndJarsUnder(file, classPath);
}
return classPath;
}
}