package com.prezi.haxe.gradle;
import com.google.common.collect.Sets;
import com.prezi.haxe.gradle.incubating.BinaryContainer;
import com.prezi.haxe.gradle.incubating.BinaryInternal;
import com.prezi.haxe.gradle.incubating.DefaultBinaryContainer;
import com.prezi.haxe.gradle.incubating.DefaultProjectSourceSet;
import com.prezi.haxe.gradle.incubating.ProjectSourceSet;
import org.gradle.api.Action;
import org.gradle.api.NamedDomainObjectContainer;
import org.gradle.api.NamedDomainObjectFactory;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.internal.reflect.Instantiator;
import java.io.File;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Set;
public class HaxeExtension extends DefaultHaxeCompilerParameters implements Serializable {
private final NamedDomainObjectContainer<TargetPlatform> targetPlatforms;
private final ProjectSourceSet sources;
private final BinaryContainer binaries;
private final Set<Object> compilerVersions = Sets.newLinkedHashSet();
private File munitNodeModuleInstallDir;
public HaxeExtension(final Project project, Instantiator instantiator) {
this.sources = instantiator.newInstance(DefaultProjectSourceSet.class, instantiator);
this.binaries = instantiator.newInstance(DefaultBinaryContainer.class, instantiator);
this.targetPlatforms = project.container(TargetPlatform.class, new TargetPlatformNamedDomainObjectFactory(project));
binaries.withType(BinaryInternal.class).all(new Action<BinaryInternal>() {
public void execute(BinaryInternal binary) {
Task binaryLifecycleTask = project.task(binary.getNamingScheme().getLifecycleTaskName());
binaryLifecycleTask.setGroup("build");
binaryLifecycleTask.setDescription(String.format("Assembles %s.", binary));
binary.setBuildTask(binaryLifecycleTask);
}
});
}
public File getMunitNodeModuleInstallDir() {
return munitNodeModuleInstallDir;
}
public void setMunitNodeModuleInstallDir(File munitNodeModuleInstallDir) {
this.munitNodeModuleInstallDir = munitNodeModuleInstallDir;
}
public ProjectSourceSet getSources() {
return sources;
}
public void sources(Action<ProjectSourceSet> action) {
action.execute(sources);
}
public BinaryContainer getBinaries() {
return binaries;
}
public void binaries(Action<BinaryContainer> action) {
action.execute(binaries);
}
public NamedDomainObjectContainer<TargetPlatform> getTargetPlatforms() {
return targetPlatforms;
}
public void targetPlatforms(Action<? super NamedDomainObjectContainer<TargetPlatform>> action) {
action.execute(targetPlatforms);
}
public void setCompilerVersions(Object... versions) {
compilerVersions.addAll(Arrays.asList(versions));
}
public void setCompilerVersion(Object... versions) {
setCompilerVersions(versions);
}
public void compilerVersions(Object... versions) {
setCompilerVersions(versions);
}
public void compilerVersion(Object... versions) {
setCompilerVersions(versions);
}
public Set<Object> getCompilerVersions() {
return compilerVersions;
}
private static class TargetPlatformNamedDomainObjectFactory implements NamedDomainObjectFactory<TargetPlatform>, Serializable {
private final Project project;
public TargetPlatformNamedDomainObjectFactory(Project project) {
this.project = project;
}
@Override
public TargetPlatform create(String platformName) {
return new DefaultTargetPlatform(platformName, project);
}
}
}