enso/project/JavaFormatterPlugin.scala
Pavel Marek c1098865f2
Update java formatter sbt plugin (#8543)
Add a local clone of javaFormatter plugin. The upstream is not maintained anymore. And we need to update it to use the newest Google java formatter because the old one, that we use, cannot format sources with Java 8+ syntax.

# Important Notes
Update to Google java formatter 1.18.1 - https://github.com/google/google-java-format/releases/tag/v1.18.1
2023-12-15 14:45:23 +00:00

120 lines
4.3 KiB
Scala

/*
* Copyright 2015 Lightbend Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import com.google.googlejavaformat.java.JavaFormatterOptions
import sbt.*
import sbt.Keys.*
/** A local fork of https://github.com/sbt/sbt-java-formatter. The original plugin uses a very outdated version
* of `google-java-format` dependency which does not support syntax > JDK8. It's unlikely we will see the
* dependency upgraded any time soon, if ever, hence the almost one-to-one copy of the plugin.
*/
object JavaFormatterPlugin extends AutoPlugin {
object autoImport {
val javafmt: TaskKey[Unit] = taskKey("Format Java sources")
val javafmtCheck: TaskKey[Boolean] = taskKey(
"Fail, if a Java source needs reformatting."
)
val javafmtAll: TaskKey[Unit] = taskKey(
"Execute the javafmt task for all configurations in which it is enabled. " +
"(By default this means the Compile and Test configurations.)"
)
val javafmtCheckAll: TaskKey[Unit] = taskKey(
"Execute the javafmtCheck task for all configurations in which it is enabled. " +
"(By default this means the Compile and Test configurations.)"
)
val javafmtOnCompile = settingKey[Boolean](
"Format Java source files on compile, off by default."
)
val javafmtStyle =
settingKey[JavaFormatterOptions.Style](
"Define formatting style, Google Java Style (default) or AOSP"
)
val javafmtOptions = settingKey[JavaFormatterOptions](
"Define all formatting options such as style or enabling Javadoc formatting. See _JavaFormatterOptions_ for more"
)
}
import autoImport._
override def trigger = allRequirements
override def `requires` = plugins.JvmPlugin
override def projectSettings: Seq[Def.Setting[_]] = {
val anyConfigsInThisProject =
ScopeFilter(configurations = inAnyConfiguration)
notToBeScopedSettings ++
Seq(Compile, Test).flatMap(inConfig(_)(toBeScopedSettings)) ++
Seq(
javafmtAll := javafmt.?.all(anyConfigsInThisProject).value,
javafmtCheckAll := javafmtCheck.?.all(anyConfigsInThisProject).value
)
}
override def globalSettings: Seq[Def.Setting[_]] =
Seq(
javafmtOnCompile := false,
javafmtStyle := JavaFormatterOptions.Style.GOOGLE
)
def toBeScopedSettings: Seq[Setting[_]] =
List(
(javafmt / sourceDirectories) := List(javaSource.value),
javafmtOptions := JavaFormatterOptions
.builder()
.style(javafmtStyle.value)
.build(),
javafmt := {
val streamz = streams.value
val sD = (javafmt / sourceDirectories).value.toList
val iF = (javafmt / includeFilter).value
val eF = (javafmt / excludeFilter).value
val cache = streamz.cacheStoreFactory
val options = javafmtOptions.value
JavaFormatter(sD, iF, eF, streamz, cache, options)
},
javafmtCheck := {
val streamz = streams.value
val baseDir = (ThisBuild / baseDirectory).value
val sD = (javafmt / sourceDirectories).value.toList
val iF = (javafmt / includeFilter).value
val eF = (javafmt / excludeFilter).value
val cache = (javafmt / streams).value.cacheStoreFactory
val options = javafmtOptions.value
JavaFormatter.check(baseDir, sD, iF, eF, streamz, cache, options)
},
javafmtDoFormatOnCompile := Def.settingDyn {
if (javafmtOnCompile.value) {
javafmt in resolvedScoped.value.scope
} else {
Def.task(())
}
}.value,
compile / compileInputs := (compile / compileInputs)
.dependsOn(javafmtDoFormatOnCompile)
.value
)
def notToBeScopedSettings: Seq[Setting[_]] =
List(javafmt / includeFilter := "*.java")
private[this] val javafmtDoFormatOnCompile =
taskKey[Unit]("Format Java source files if javafmtOnCompile is on.")
}