blob: 48994bf52105cc09899b8bba9771a9992bb5c18b [file] [log] [blame]
import com.google.common.base.Charsets
import com.google.common.collect.Range
import com.google.common.collect.RangeSet
import com.google.common.collect.TreeRangeSet
import com.google.common.io.Files
import com.google.googlejavaformat.FormatterDiagnostic
import com.google.googlejavaformat.java.Formatter
import com.google.googlejavaformat.java.JavaCommentsHelper
import com.google.googlejavaformat.java.JavaInput
import com.google.googlejavaformat.java.JavaOutput
import org.gradle.api.DefaultTask
import org.gradle.api.file.FileCollection
import org.gradle.api.tasks.TaskAction
import org.gradle.api.tasks.TaskExecutionException
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.util.concurrent.*
class FormatTask extends DefaultTask {
private static final Logger logger = LoggerFactory.getLogger(FormatTask)
private List<FileCollection> filesToFormat = []
private int maxWidthColumns = 100
private int indentationMultiplier = 1
private int maxParallelism = Runtime.getRuntime().availableProcessors()
public void format(FileCollection files) {
filesToFormat.add(files)
}
public void maxColumns(int columns) {
this.maxWidthColumns = columns
}
public void indentationMultiplier(int multiplier) {
this.indentationMultiplier = multiplier
}
@TaskAction
public void doFormatting() {
ExecutorService executor = Executors.newFixedThreadPool(maxParallelism)
ExecutorCompletionService<Void> service = new ExecutorCompletionService(executor)
int tasks = 0
filesToFormat.each { fileCollection ->
fileCollection.each { fileToFormat ->
logger.info('Going to format {}', fileToFormat)
service.submit({
formatFile(fileToFormat)
})
tasks++
}
}
executor.shutdown()
for (int i = 0; i < tasks; i++) {
Future<Void> task = service.take()
try {
task.get()
} catch (ExecutionException e) {
throw new TaskExecutionException(this, e)
}
}
logger.info('Finished formatting {} file(s)', tasks)
}
public void formatFile(File file) {
JavaInput input = new JavaInput(file.getAbsolutePath(), Files.toString(file, Charsets.UTF_8))
JavaOutput output = new JavaOutput(input, new JavaCommentsHelper());
List<FormatterDiagnostic> errors = []
Formatter.format(input, output, maxWidthColumns, errors, indentationMultiplier)
if (!errors.isEmpty()) {
logger.warn("Could not format {}, {} error(s)", file, errors.size())
for (FormatterDiagnostic diagnostic : errors) {
logger.warn(diagnostic.toString())
}
} else {
RangeSet<Integer> rangeSet = TreeRangeSet.create()
rangeSet.add(Range.all())
FileWriter writer = new FileWriter(file)
try {
output.writeMerged(writer, rangeSet)
} finally {
writer.close()
}
}
}
}