Skip to content

Commit

Permalink
Merge pull request #23 from 2m/wip-google-formatter-2m
Browse files Browse the repository at this point in the history
Change to google formatter library
  • Loading branch information
2m authored Jun 17, 2018
2 parents 1db26d2 + 50af1b2 commit 9a9b464
Show file tree
Hide file tree
Showing 43 changed files with 38 additions and 1,517 deletions.
23 changes: 20 additions & 3 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,22 @@
sudo: false
language: scala
jdk:
- oraclejdk8
script: sbt scripted
jdk: oraclejdk8

jobs:
include:
- stage: test
script: sbt scripted

stages:
# runs on master commits and PRs
- name: test
if: NOT tag =~ ^v

before_cache:
- find $HOME/.ivy2/ -name "ivydata-*.properties" -print -delete
- find $HOME/.sbt -name "*.lock" -print -delete

cache:
directories:
- $HOME/.ivy2/cache
- $HOME/.sbt/boot
3 changes: 1 addition & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ lazy val plugin = project
name := "sbt-java-formatter",
sbtPlugin := true,
libraryDependencies ++= Seq(
Library.eclipseJdtCore,
Library.eclipseText
"com.google.googlejavaformat" % "google-java-format" % "1.6"
)
)
.settings(BintrayPlugin.bintrayPublishSettings: _*)
Expand Down
7 changes: 0 additions & 7 deletions plugin/scripted.sbt

This file was deleted.

62 changes: 9 additions & 53 deletions plugin/src/main/scala/com/lightbend/sbt/JavaFormatterPlugin.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
package com.lightbend.sbt

import com.lightbend.sbt.javaformatter.JavaFormatter
import com.lightbend.sbt.javaformatter.JavaFormatter.JavaFormatterSettings
import sbt._
import sbt.Keys._

Expand All @@ -39,15 +38,7 @@ object JavaFormatterPlugin extends AutoPlugin {

object JavaFormatterKeys {
val format: TaskKey[Seq[File]] =
TaskKey("java-formatter-format", "Format (Java) sources using the eclipse formatter")
val settings: SettingKey[Map[String, String]] =
SettingKey("java-formatter-settings", "A Map of eclipse formatter settings and values")
val sourceLevel: SettingKey[Option[String]] =
SettingKey("java-formatter-source-level", "Java source level. Overrides source level defined in settings.")
val targetLevel: SettingKey[Option[String]] =
SettingKey("java-formatter-target-level", "Java target level. Overrides target level defined in settings.")
val javaFormattingSettingsFilename: SettingKey[String] =
SettingKey("javaFormattingSettingsFile", "XML file with eclipse formatter settings.")
TaskKey("javafmt", "Format Java sources")
}

val autoImport = JavaFormatterKeys
Expand Down Expand Up @@ -76,59 +67,24 @@ object JavaFormatterPlugin extends AutoPlugin {
format := {
val streamz = streams.value
val log = streamz.log
val sourceLv = sourceLevel.value
val targetLv = targetLevel.value
val s = settings.value
val sD = (sourceDirectories in format).value.toList
val iF = (includeFilter in format).value
val eF = (excludeFilter in format).value
val tPR = thisProjectRef.value
val c = configuration.value
if (s.isEmpty) {
log.warn("Unable to locate formatting preferences, skipping formatting of Java sources!")
Seq.empty
} else {
log.info("")
val formatterSettings = new JavaFormatterSettings(s, sourceLv, targetLv)
JavaFormatter(
sD,
iF,
eF,
tPR,
c,
streamz,
formatterSettings)
}
JavaFormatter(
sD,
iF,
eF,
tPR,
c,
streamz)
}
)

def notToBeScopedSettings: Seq[Setting[_]] =
List(
includeFilter in format := "*.java",
sourceLevel := None,
targetLevel := None,
// Don't parse the XML file for every single project over and over again!
javaFormattingSettingsFilename := "formatting-java.xml",
settings := {
val filename = javaFormattingSettingsFilename.value
val settingsFile = locateFormattingXml((baseDirectory in ThisBuild).value, baseDirectory.value, filename)

settingsFile match {
case Some(s) => settingsFromProfile(s)
case None =>
System.err.println(s"Configured `javaFormattingSettingsFilename` (${baseDirectory.value / filename}) does not exist! Unable to format Java code.")
Map.empty
}
}
includeFilter in format := "*.java"
)

@tailrec final def locateFormattingXml(max: File, current: File, name: String): Option[File] = {
val now = current / name
val `now/project` = current / "project" / name
if (`now/project`.exists) Some(`now/project`)
else if (now.exists) Some(now)
else if (current == max) None
else locateFormattingXml(max, new File(current, ".."), name)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,58 +16,23 @@

package com.lightbend.sbt.javaformatter

import org.eclipse.jdt.core.formatter.CodeFormatter
import org.eclipse.jdt.core.{ ToolFactory, JavaCore }
import org.eclipse.jface.text.Document
import org.eclipse.text.edits.TextEdit
import com.google.googlejavaformat.java.Formatter
import sbt._
import sbt.Keys._

import scala.collection.immutable.Seq

object JavaFormatter {
// TODO configurable
private val LineSeparator = System.getProperty("line.separator")

object JavaFormatterSettings {
val defaults = Map[String, String](
JavaCore.COMPILER_SOURCE -> "1.8",
JavaCore.COMPILER_COMPLIANCE -> "1.8",
JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM -> "1.8")
}

class JavaFormatterSettings(
settingsMap: Map[String, String],
sourceVersion: Option[String],
targetVersion: Option[String]) {
import JavaFormatterSettings._

val settings: Map[String, String] = {
// override settings in the map if these are set
val merged = List(
JavaCore.COMPILER_SOURCE -> sourceVersion,
JavaCore.COMPILER_COMPLIANCE -> sourceVersion,
JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM -> targetVersion).foldLeft(settingsMap) {
case (r1, (key, value)) => value.foldLeft(r1) { case (r2, v) => r2.updated(key, v) }
}
// add defaults unless they are set in the map
val withDefaults = defaults.foldLeft(merged) {
case (r, (key, value)) => r.updated(key, r.getOrElse(key, value))
}
withDefaults
}
}

def apply(
sourceDirectories: Seq[File],
includeFilter: FileFilter,
excludeFilter: FileFilter,
ref: ProjectRef,
configuration: Configuration,
streams: TaskStreams,
settings: JavaFormatterSettings): Seq[File] = {
streams: TaskStreams): Seq[File] = {

import scala.collection.JavaConverters._
val formatter = ToolFactory.createCodeFormatter(settings.settings.asJava)
val formatter = new Formatter()

def log(label: String, logger: Logger)(message: String)(count: String) =
logger.info(message.format(count, label))
Expand All @@ -76,16 +41,7 @@ object JavaFormatter {
for (file <- files if file.exists) {
try {
val contents = IO.read(file)
val te: TextEdit = formatter.format(CodeFormatter.K_COMPILATION_UNIT, contents, 0, contents.length(), 0, LineSeparator)
val formatted = if (te == null) {
// TODO a bit more informative maybe?
streams.log.warn(s"Java Formatter can't create formatter for $file")
contents
} else {
val doc = new Document(contents)
te.apply(doc)
doc.get()
}
val formatted = formatter.formatSource(contents)
if (formatted != contents) IO.write(file, formatted)
} catch {
// TODO what type of exceptions can we get here?
Expand Down

This file was deleted.

Loading

0 comments on commit 9a9b464

Please sign in to comment.