scala abide: a lint tool for scala
TRANSCRIPT
Scala
Iulian Dragos
Overview
• Static checker tool
• Based on type-checked ASTs
• Easy to use and write rules
Goals
• Unify existing approaches in one platform
• Easy to write rules
• Easy to use other people’s rules
• Reasonable performance
• Good integrations
Abide
• Rules are decoupled from the tool
• rule packages
• project-specific rules
• Integrates with Sbt
• planned: Maven, Eclipse
Examples• Core package
• Unused members
• Vars that are never re-assigned
• Renamed arguments with defaults
• Akka
• sender method called inside future
Architecture
Abide
abide-plugin
scalac
core rules
extra rules
project-specific
. . .
Use
addSbtPlugin("com.typesafe" % "sbt-abide" % "0.1.0")
libraryDependencies += "com.typesafe" %% "abide-core" % “0.1.0” % "abide"
libraryDependencies += "com.typesafe" %% "abide-extra" % “0.1.0” % "abide"
Project(...).dependsOn(rules % "abide")
Anatomy
Traversers
• Fused: one-pass for all rules
• Optimised: rules are filtered on what they match
Directives
• Shared context between rules
• compiler universe
• user-defined mix-ins
Rules
val step = { case varDef @ q"$mods var $name : $tpt = $value" => nok(varDef.symbol, Warning(varDef)) case q"$rcv = $expr" => ok(rcv.symbol) }
quasi-quote
state helpers
Replace `var` with `val`
Rules
• partial function Tree => Unit
• collect keys that can do one transition
• nok (not ok)
• ok (stable state)
Rules• existential rules (what we’ve seen)
• scoping rules
• helpers to maintain nesting
• enter (no need for removing, handled by the library)
• path rules
• like scoping, but richer state checks
Coding a rule
For example..
Mutation inside iteration
• Let’s forbid mutating the underlying collection while iterating
for (x <- xs) xs -= x xs map { x => xs -= x }
ys foreach { case (k, v) => ys remove 1 }
for (p <- icodes; x <- xs) { icodes -= p._1 xs remove x }
Simplifying assumptions
• purely syntactical matching (no points-to analysis)
• name-based
xs map { x => xs -= x }
Let’s code
Future
Next
• SupressWarning support
• Integrations: maven and IDEs
• More rules
Contribute!
• The value is in rules
• Contribute to scala/scala-abide
• ..or write your own rule package
Acknowledgements
Nicolas Voirol (@samarion) did all the work during his internship at Typesafe Switzerland
Thank you