Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@xuwei-k
Created March 27, 2022 14:46
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xuwei-k/8ec65701cd19ff6b59abb5a3bc0843a8 to your computer and use it in GitHub Desktop.
Save xuwei-k/8ec65701cd19ff6b59abb5a3bc0843a8 to your computer and use it in GitHub Desktop.
scalaVersion := "3.1.3-RC1-bin-20220325-6f3fe05-NIGHTLY"
run / fork := true
libraryDependencies ++= Seq(
"io.get-coursier" % "coursier" % "2.1.0-M5" cross CrossVersion.for3Use2_13,
"org.scala-lang" %% "scala3-tasty-inspector" % scalaVersion.value,
"org.wartremover" %% "wartremover" % "3.0.0-RC4",
)
sbt-shell > run org.typelevel cats-core
[info] running (fork) example.WartremoverTastyInspector org.typelevel cats-core
[info] start inspect cats-core_3-2.7.0.jar
[info] tasty file count = 902
[error] -- Error: core/src/main/scala/cats/instances/vector.scala:174:22 ---------------
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: core/src/main/scala/cats/instances/seq.scala:136:22 ------------------
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: core/src/main/scala/cats/instances/list.scala:24:60 ------------------
[error] [wartremover:ListAppend] Don't use List `:+` method because too slow
[error] -- Error: core/src/main/scala-2.13+/cats/instances/arraySeq.scala:165:22 -------
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: core/src/main/scala/cats/data/NonEmptyList.scala:128:23 --------------
[error] [wartremover:ListAppend] Don't use List `:+` method because too slow
[error] -- Error: core/src/main/scala/cats/data/NonEmptyList.scala:648:37 --------------
[error] [wartremover:ListAppend] Don't use List `:+` method because too slow
[error] 6 errors found
[info] start inspect cats-kernel_3-2.7.0.jar
[info] tasty file count = 301
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/SortedMapInstances.scala:93:8
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/SortedMapInstances.scala:74:6
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/SetInstances.scala:20:13 -
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/SetInstances.scala:21:13 -
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/MapInstances.scala:63:8 --
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/MapInstances.scala:50:6 --
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/BitSetInstances.scala:19:13
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] -- Error: kernel/src/main/scala/cats/kernel/instances/BitSetInstances.scala:20:13
[error] [wartremover:SizeIs] Maybe you can use `sizeIs` instead of `size`
[error] 8 errors found
[info] start inspect scala3-library_3-3.0.2.jar
[info] tasty file count = 74
[error] -- Error: library/src/scala/IArray.scala:259:92 --------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] -- Error: library/src/scala/IArray.scala:272:82 --------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] -- Error: library/src/scala/IArray.scala:298:81 --------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] -- Error: library/src/scala/IArray.scala:299:101 -------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] -- Error: library/src/scala/IArray.scala:300:50 --------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] -- Error: library/src/scala/IArray.scala:301:50 --------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] -- Error: library/src/scala/IArray.scala:307:10 --------------------------------
[error] [wartremover:RedundantConversions] redundant toSeq conversion
[error] 7 errors found
[info] start inspect simulacrum-scalafix-annotations_3-0.5.4.jar
[info] tasty file count = 3
[info] start inspect scala-library-2.13.6.jar
[info] tasty file count = 0
[success] Total time: 166 s (02:46), completed Mar 27, 2022 11:44:44 PM
package example
import org.wartremover.LogLevel
import org.wartremover.WartTraverser
import org.wartremover.WartUniverse
import scala.quoted.Quotes
import scala.tasty.inspector.Inspector
import scala.tasty.inspector.Tasty
import scala.tasty.inspector.TastyInspector
object WartremoverTastyInspector {
extension (groupId: String) {
def %(artifactId: String): coursier.core.Module =
coursier.core.Module(
coursier.core.Organization(groupId),
coursier.core.ModuleName(artifactId),
Map.empty
)
def %%(artifactId: String): coursier.core.Module =
%(artifactId + "_3")
}
extension (module: coursier.core.Module) {
def %(version: String): coursier.core.Dependency =
coursier.core.Dependency(module, version)
}
def main(args: Array[String]): Unit = {
val jarName = args match {
case Array(groupId, artifactId, version) =>
(groupId %% artifactId % version)
case Array(groupId, artifactId) =>
(groupId %% artifactId % "latest.release")
case _ =>
println("usage: groupId artifactId version")
sys.exit(0)
}
val jars = coursier.Fetch().addDependencies(jarName).run()
jars.foreach { jar =>
println("start inspect " + jar.getName)
run(
traverser = {
import org.wartremover.warts.*
List[WartTraverser](
ArrayEquals,
CollectHeadOption,
DropTakeToSlice,
FilterHeadOption,
FilterSize,
GetGetOrElse,
GetOrElseNull,
ListAppend,
ListUnapply,
RedundantConversions,
ReverseFind,
ReverseTakeReverse,
ScalaApp,
SizeIs,
SortFilter,
ThreadSleep,
).reduceLeft(_ compose _)
},
jars = jar.getAbsolutePath :: Nil,
dependenciesClasspath = jars.map(_.getAbsolutePath).toList,
)
}
}
def run(
traverser: WartTraverser,
jars: List[String],
dependenciesClasspath: List[String],
): Unit = {
val inspector = new Inspector {
def inspect(using q: Quotes)(tastys: List[Tasty[q.type]]): Unit = {
import q.reflect.*
val universe: WartUniverse.Aux[q.type] =
WartUniverse(onlyWarning = false, logLevel = LogLevel.Debug, quotes = q)
val treeTraverser = traverser.apply(universe)
val count = tastys.size
println("tasty file count = " + count)
tastys.foreach { tasty =>
val tree = tasty.ast
treeTraverser.traverseTree(tree)(tree.symbol)
}
}
}
TastyInspector.inspectAllTastyFiles(
tastyFiles = Nil,
jars = jars,
dependenciesClasspath = dependenciesClasspath,
)(inspector)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment