scala abide: a lint tool for scala

23
Scala Iulian Dragos

Upload: iulian-dragos

Post on 14-Jul-2015

1.198 views

Category:

Software


2 download

TRANSCRIPT

Page 1: Scala Abide: A lint tool for Scala

Scala

Iulian Dragos

Page 2: Scala Abide: A lint tool for Scala

Overview

• Static checker tool

• Based on type-checked ASTs

• Easy to use and write rules

Page 3: Scala Abide: A lint tool for Scala

Goals

• Unify existing approaches in one platform

• Easy to write rules

• Easy to use other people’s rules

• Reasonable performance

• Good integrations

Page 4: Scala Abide: A lint tool for Scala

Abide

• Rules are decoupled from the tool

• rule packages

• project-specific rules

• Integrates with Sbt

• planned: Maven, Eclipse

Page 5: Scala Abide: A lint tool for Scala

Examples• Core package

• Unused members

• Vars that are never re-assigned

• Renamed arguments with defaults

• Akka

• sender method called inside future

Page 6: Scala Abide: A lint tool for Scala

Architecture

Abide

abide-plugin

scalac

core rules

extra rules

project-specific

. . .

Page 7: Scala Abide: A lint tool for Scala

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")

Page 8: Scala Abide: A lint tool for Scala

Anatomy

Page 9: Scala Abide: A lint tool for Scala

Traversers

• Fused: one-pass for all rules

• Optimised: rules are filtered on what they match

Page 10: Scala Abide: A lint tool for Scala

Directives

• Shared context between rules

• compiler universe

• user-defined mix-ins

Page 11: Scala Abide: A lint tool for Scala

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`

Page 12: Scala Abide: A lint tool for Scala

Rules

• partial function Tree => Unit

• collect keys that can do one transition

• nok (not ok)

• ok (stable state)

Page 13: Scala Abide: A lint tool for Scala

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

Page 14: Scala Abide: A lint tool for Scala

Coding a rule

Page 15: Scala Abide: A lint tool for Scala

For example..

Page 16: Scala Abide: A lint tool for Scala

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 }

Page 17: Scala Abide: A lint tool for Scala

Simplifying assumptions

• purely syntactical matching (no points-to analysis)

• name-based

xs map { x => xs -= x }

Page 18: Scala Abide: A lint tool for Scala

Let’s code

Page 19: Scala Abide: A lint tool for Scala

Future

Page 20: Scala Abide: A lint tool for Scala

Next

• SupressWarning support

• Integrations: maven and IDEs

• More rules

Page 21: Scala Abide: A lint tool for Scala

Contribute!

• The value is in rules

• Contribute to scala/scala-abide

• ..or write your own rule package

Page 22: Scala Abide: A lint tool for Scala

Acknowledgements

Nicolas Voirol (@samarion) did all the work during his internship at Typesafe Switzerland

Page 23: Scala Abide: A lint tool for Scala

Thank you