Created
March 27, 2022 14:46
-
-
Save xuwei-k/8ec65701cd19ff6b59abb5a3bc0843a8 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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", | |
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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