Skip to content

Commit 775882f

Browse files
authored
Merge pull request #90 from Gedochao/maintenance/scalafix
`scalafix` & `scalafmt`
2 parents 20c82d4 + a95e796 commit 775882f

File tree

8 files changed

+183
-37
lines changed

8 files changed

+183
-37
lines changed

.github/workflows/ci.yml

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ on:
88
pull_request:
99
jobs:
1010
generate-launchers:
11+
timeout-minutes: 30
12+
needs:
13+
- scalafix
14+
- format
1115
runs-on: ${{ matrix.os }}
1216
strategy:
1317
fail-fast: false
@@ -47,6 +51,10 @@ jobs:
4751
UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
4852

4953
generate-static-launcher:
54+
timeout-minutes: 30
55+
needs:
56+
- scalafix
57+
- format
5058
runs-on: ubuntu-24.04
5159
steps:
5260
- uses: actions/checkout@v2
@@ -75,6 +83,10 @@ jobs:
7583
UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
7684

7785
generate-mostly-static-launcher:
86+
timeout-minutes: 30
87+
needs:
88+
- scalafix
89+
- format
7890
runs-on: ubuntu-24.04
7991
steps:
8092
- uses: actions/checkout@v2
@@ -102,8 +114,40 @@ jobs:
102114
env:
103115
UPLOAD_GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
104116

117+
scalafix:
118+
timeout-minutes: 15
119+
runs-on: ubuntu-24.04
120+
steps:
121+
- uses: actions/checkout@v2
122+
with:
123+
fetch-depth: 0
124+
submodules: true
125+
- uses: coursier/cache-action@v6
126+
- uses: coursier/setup-action@v1
127+
with:
128+
jvm: temurin:17
129+
- name: Run scalafix
130+
run: ./mill -i __.fix --check
131+
132+
format:
133+
timeout-minutes: 15
134+
runs-on: ubuntu-24.04
135+
steps:
136+
- uses: actions/checkout@v4
137+
with:
138+
fetch-depth: 0
139+
submodules: true
140+
- uses: VirtusLab/scala-cli-setup@v1
141+
- run: scala-cli fmt . --check
142+
105143
publish:
106-
needs: generate-launchers
144+
timeout-minutes: 30
145+
needs:
146+
- generate-launchers
147+
- generate-static-launcher
148+
- generate-mostly-static-launcher
149+
- scalafix
150+
- format
107151
if: github.event_name == 'push'
108152
runs-on: ubuntu-24.04
109153
steps:

.scalafix.conf

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
rules = [
2+
DisableSyntax,
3+
RemoveUnused,
4+
OrganizeImports,
5+
NoValInForComprehension,
6+
# ProcedureSyntax
7+
]
8+
DisableSyntax.noFinalize = true
9+
DisableSyntax.noIsInstanceOf = true
10+
DisableSyntax.noReturns = true
11+
12+
// `rules` on compilation
13+
triggered.rules = [
14+
DisableSyntax
15+
]
16+
17+
OrganizeImports {
18+
coalesceToWildcardImportThreshold = 6
19+
expandRelative = true
20+
groups = ["*", "re:javax?\\.", "scala."]
21+
groupedImports = AggressiveMerge
22+
targetDialect = Scala3
23+
}

.scalafmt.conf

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
version = "3.9.6"
2+
3+
align.preset = more
4+
maxColumn = 100
5+
assumeStandardLibraryStripMargin = true
6+
indent.defnSite = 2
7+
indentOperator.topLevelOnly = false
8+
align.preset = more
9+
align.openParenCallSite = false
10+
newlines.source = keep
11+
newlines.beforeMultiline = keep
12+
newlines.afterCurlyLambdaParams = keep
13+
newlines.alwaysBeforeElseAfterCurlyIf = true
14+
15+
runner.dialect = scala3
16+
17+
rewrite.rules = [
18+
RedundantBraces
19+
RedundantParens
20+
SortModifiers
21+
]
22+
23+
rewrite.redundantBraces {
24+
ifElseExpressions = true
25+
includeUnitMethods = false
26+
stringInterpolation = true
27+
}
28+
29+
rewrite.sortModifiers.order = [
30+
"private", "final", "override", "protected",
31+
"implicit", "sealed", "abstract", "lazy"
32+
]
33+
34+
project.excludeFilters = [
35+
".bloop"
36+
".metals"
37+
".scala-build"
38+
"examples" # Scala 3 scripts and using directives not supported yet
39+
"out"
40+
"scala-version.scala"
41+
]

build.mill.scala

Lines changed: 67 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import $ivy.`de.tototec::de.tobiasroeser.mill.vcs.version::0.4.1`
22
import $ivy.`io.github.alexarchambault.mill::mill-native-image::0.1.31-1`
33
import $ivy.`io.github.alexarchambault.mill::mill-native-image-upload:0.1.31-1`
4+
import $ivy.`com.goyeau::mill-scalafix::0.5.1`
45
import de.tobiasroeser.mill.vcs.version._
56
import io.github.alexarchambault.millnativeimage.NativeImage
67
import io.github.alexarchambault.millnativeimage.upload.Upload
@@ -13,15 +14,23 @@ import mill.api.Loose
1314
import scala.annotation.unused
1415
import scala.concurrent.duration.DurationInt
1516
import java.io.File
17+
import com.goyeau.mill.scalafix.ScalafixModule
1618

1719
object Versions {
1820
def scala = "3.3.6"
21+
1922
def scalaCli = "1.7.1"
23+
2024
def graalVmVersion = "22.1.0"
25+
2126
def coursier = "2.1.24"
27+
2228
def osLib = "0.11.4"
29+
2330
def uTest = "0.8.5"
31+
2432
def jline = "3.25.0"
33+
2534
def ubuntu = "24.04"
2635
}
2736

@@ -31,10 +40,15 @@ trait JavaMainClassNativeImage extends NativeImage {
3140
"--no-fallback"
3241
)
3342
}
43+
3444
def nativeImagePersist: Boolean = System.getenv("CI") != null
45+
3546
def nativeImageGraalVmJvmId = s"graalvm-java17:${Versions.graalVmVersion}"
47+
3648
def nativeImageName = "java-class-name"
49+
3750
def nativeImageMainClass = "scala.cli.javaclassname.JavaClassName"
51+
3852
def nameSuffix = ""
3953

4054
@unused
@@ -50,10 +64,14 @@ trait JavaMainClassNativeImage extends NativeImage {
5064
}
5165
}
5266

53-
trait JavaClassNameModule extends ScalaModule {
67+
trait JavaClassNameModule extends ScalaModule with ScalafixModule {
68+
override def scalacOptions: Target[Seq[String]] =
69+
super.scalacOptions.map(_ ++ Seq("-Wunused:all"))
70+
5471
override def scalaVersion: Target[String] = Versions.scala
5572

5673
private def jlineOrg = "org.jline"
74+
5775
def jlineDeps: Loose.Agg[Dep] = Agg(
5876
ivy"$jlineOrg:jline-reader:${Versions.jline}",
5977
ivy"$jlineOrg:jline-terminal:${Versions.jline}",
@@ -65,31 +83,38 @@ trait JavaClassNameModule extends ScalaModule {
6583
override def coursierDependency: Dependency =
6684
super.coursierDependency
6785
.addOverrides(
68-
jlineDeps.toSeq.map(jd => DependencyManagement.Key.from(jd.toDependency(jd.version, jd.version, "")) ->
69-
DependencyManagement.Values.empty.withVersionConstraint(VersionConstraint.Lazy(Versions.jline)))
86+
jlineDeps.toSeq.map(jd =>
87+
DependencyManagement.Key.from(jd.toDependency(jd.version, jd.version, "")) ->
88+
DependencyManagement.Values.empty.withVersionConstraint(
89+
VersionConstraint.Lazy(Versions.jline)
90+
)
91+
)
7092
)
7193

7294
override def allIvyDeps: Target[Agg[Dep]] = Task {
7395
super.allIvyDeps()
7496
.map(_.exclude(jlineOrg -> "jline-*")) ++ jlineDeps
7597
}
7698

77-
override def ivyDeps: Target[Agg[Dep]] = super.ivyDeps().map(_.exclude("org.jline" -> "jline-*")) ++ jlineDeps
99+
override def ivyDeps: Target[Agg[Dep]] =
100+
super.ivyDeps().map(_.exclude("org.jline" -> "jline-*")) ++ jlineDeps
78101
}
79102

80103
object `scala3-graal-processor` extends JavaClassNameModule {
81104
override def mainClass: Target[Option[String]] = Some("scala.cli.graal.CoursierCacheProcessor")
105+
82106
override def ivyDeps: Target[Agg[Dep]] = jlineDeps ++ Agg(
83107
ivy"org.virtuslab.scala-cli::scala3-graal:${Versions.scalaCli}"
84108
)
85109
}
86110

87-
object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeImage with JavaClassNamePublishModule {
111+
object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeImage
112+
with JavaClassNamePublishModule {
88113
def nativeImageClassPath: Target[Seq[PathRef]] = Task {
89114
// adapted from https://github.com/VirtusLab/scala-cli/blob/b19086697401827a6f8185040ceb248d8865bf21/build.sc#L732-L744
90115

91116
val classpath = runClasspath().map(_.path).mkString(File.pathSeparator)
92-
val cache = Task.dest / "native-cp"
117+
val cache = Task.dest / "native-cp"
93118
// `scala3-graal-processor`.run() do not give me output and I cannot pass dynamically computed values like classpath
94119
System.err.println("Calling scala3 graal processor on")
95120
for (f <- classpath.split(File.pathSeparator))
@@ -139,14 +164,16 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma
139164
)
140165
}
141166

142-
def writeNativeImageScript(scriptDest: String, imageDest: String = ""): Command[Unit] = Task.Command {
143-
buildHelperImage()
144-
super.writeNativeImageScript(scriptDest, imageDest)()
145-
}
167+
def writeNativeImageScript(scriptDest: String, imageDest: String = ""): Command[Unit] =
168+
Task.Command {
169+
buildHelperImage()
170+
super.writeNativeImageScript(scriptDest, imageDest)()
171+
}
146172
}
147173

148174
object `mostly-static` extends JavaMainClassNativeImage {
149175
def nameSuffix = "-mostly-static"
176+
150177
def nativeImageClassPath: Target[Seq[PathRef]] = Task {
151178
`java-class-name`.nativeImageClassPath()
152179
}
@@ -163,6 +190,7 @@ object `java-class-name` extends JavaClassNameModule with JavaMainClassNativeIma
163190
object `java-class-name-tests` extends JavaClassNameModule with SbtModule {
164191
trait Tests extends ScalaModule with super.SbtTests with TestModule.Utest {
165192
def launcher: Target[PathRef]
193+
166194
def ivyDeps: Target[Agg[Dep]] = super.ivyDeps() ++ jlineDeps ++ Seq(
167195
ivy"com.lihaoyi::os-lib:${Versions.osLib}",
168196
ivy"com.lihaoyi::utest:${Versions.uTest}"
@@ -181,11 +209,13 @@ object `java-class-name-tests` extends JavaClassNameModule with SbtModule {
181209

182210
object static extends Tests {
183211
def sources: Target[Seq[PathRef]] = Task.Sources(`java-class-name-tests`.test.sources())
212+
184213
def launcher: Target[PathRef] = `java-class-name`.static.nativeImage()
185214
}
186215

187216
object `mostly-static` extends Tests {
188217
def sources: Target[Seq[PathRef]] = Task.Sources(`java-class-name-tests`.test.sources())
218+
189219
def launcher: Target[PathRef] = `java-class-name`.`mostly-static`.nativeImage()
190220
}
191221
}
@@ -205,14 +235,15 @@ def publishVersion0: Target[String] = Task {
205235
Some(versionOrEmpty)
206236
.filter(_.nonEmpty)
207237
.getOrElse(state.format())
208-
} else
238+
}
239+
else
209240
state
210241
.lastTag
211242
.getOrElse(state.format())
212243
.stripPrefix("v")
213244
}
214245

215-
def ghOrg = "VirtusLab"
246+
def ghOrg = "VirtusLab"
216247
def ghName = "java-class-name"
217248

218249
trait JavaClassNamePublishModule extends PublishModule {
@@ -247,29 +278,30 @@ trait JavaClassNamePublishModule extends PublishModule {
247278
@unused
248279
object ci extends Module {
249280
@unused
250-
def publishSonatype(tasks: mill.main.Tasks[PublishModule.PublishData]): Command[Unit] = Task.Command {
251-
publishSonatype0(
252-
data = define.Target.sequence(tasks.value)(),
253-
log = Task.ctx().log
254-
)
255-
}
281+
def publishSonatype(tasks: mill.main.Tasks[PublishModule.PublishData]): Command[Unit] =
282+
Task.Command {
283+
publishSonatype0(
284+
data = define.Target.sequence(tasks.value)(),
285+
log = Task.ctx().log
286+
)
287+
}
256288

257289
private def publishSonatype0(
258-
data: Seq[PublishModule.PublishData],
259-
log: mill.api.Logger
260-
): Unit = {
290+
data: Seq[PublishModule.PublishData],
291+
log: mill.api.Logger
292+
): Unit = {
261293

262294
val credentials = sys.env("SONATYPE_USERNAME") + ":" + sys.env("SONATYPE_PASSWORD")
263295
val pgpPassword = sys.env("PGP_PASSWORD")
264-
val timeout = 10.minutes
296+
val timeout = 10.minutes
265297

266298
val artifacts = data.map { case PublishModule.PublishData(a, s) =>
267299
(s.map { case (p, f) => (p.path, f) }, a)
268300
}
269301

270302
val isRelease = {
271303
val versions = artifacts.map(_._2.version).toSet
272-
val set = versions.map(!_.endsWith("-SNAPSHOT"))
304+
val set = versions.map(!_.endsWith("-SNAPSHOT"))
273305
assert(
274306
set.size == 1,
275307
s"Found both snapshot and non-snapshot versions: ${versions.toVector.sorted.mkString(", ")}"
@@ -285,8 +317,10 @@ object ci extends Module {
285317
"--detach-sign",
286318
"--batch=true",
287319
"--yes",
288-
"--pinentry-mode", "loopback",
289-
"--passphrase", pgpPassword,
320+
"--pinentry-mode",
321+
"loopback",
322+
"--passphrase",
323+
pgpPassword,
290324
"--armor",
291325
"--use-agent"
292326
),
@@ -315,6 +349,13 @@ object ci extends Module {
315349
if (version.endsWith("-SNAPSHOT")) ("nightly", true)
316350
else ("v" + version, false)
317351

318-
Upload.upload(ghOrg, ghName, ghToken, tag, dryRun = false, overwrite = overwriteAssets)(launchers: _*)
352+
Upload.upload(
353+
ghOrg,
354+
ghName,
355+
ghToken,
356+
tag,
357+
dryRun = false,
358+
overwrite = overwriteAssets
359+
)(launchers: _*)
319360
}
320361
}

java-class-name-tests/test/src/scala/cli/javaclassname/JavaClassNameTests.scala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@ object JavaClassNameTests extends TestSuite {
3131
val className = res.out.text().trim
3232
assert(className == expectedClassName)
3333
}
34-
finally {
34+
finally
3535
os.remove.all(tmpDir)
36-
}
3736
}
3837
}
3938

java-class-name/src/scala/cli/javaclassname/JavaClassName.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ object JavaClassName {
2424
printHelp()
2525
sys.exit(1)
2626
}
27-
val content = Files.readAllBytes(p)
27+
val content = Files.readAllBytes(p)
2828
val classNameOpt = JavaParser.parseRootPublicClassName(content)
2929
for (className <- classNameOpt)
3030
println(className)

0 commit comments

Comments
 (0)