Derzeit entwickle ich ein Compiler-Plugin für Scala gemäß dem Artikel auf http://www.scala-lang.org/node/140 .
Hier ist der Code des Plugins:
package localhost
import scala.tools.nsc
import nsc.Global
import nsc.Phase
import nsc.plugins.Plugin
import nsc.plugins.PluginComponent
class DivByZero(val global: Global) extends Plugin {
import global._
val name = "divbyzero"
val description = "checks for division by zero"
val components = List[PluginComponent](Component)
private object Component extends PluginComponent {
val global: DivByZero.this.global.type = DivByZero.this.global
val runsAfter = "refchecks"
// Using the Scala Compiler 2.8.x the runsAfter should be written as below
// val runsAfter = List[String]("refchecks");
val phaseName = DivByZero.this.name
def newPhase(_prev: Phase) = new DivByZeroPhase(_prev)
class DivByZeroPhase(prev: Phase) extends StdPhase(prev) {
override def name = DivByZero.this.name
def apply(unit: CompilationUnit) {
for ( tree @ Apply(Select(rcvr, nme.DIV), List(Literal(Constant(0)))) <- unit.body;
if rcvr.tpe <:< definitions.IntClass.tpe)
{
unit.error(tree.pos, "definitely division by zero")
}
}
}
}
}
Ich tue die Dinge, die dort erwähnt werden und habe ein Makefile geschrieben, das alles kompiliert und dann eine Jar-Datei erstellt. Dann lade ich die Plugin-Jar-Datei mit der Testdatei mit dem folgenden Befehl:
scalac -Xplugin:myplugin.jar test.scala
und sehen Sie sich die Ausgabe an. Ich mag diesen Weg nicht, weil ich aus Ruby wusste, wie man tdd und bdd macht. Ich habe Scalatest installiert http://www.scalatest.org/ . Ist es irgendwie möglich, die jar-Datei oder die Klasse divbyzero zu testen? Ich weiß, dass das Plugin zuerst geladen wird, wenn es mit einer Datei ausgeführt wird. Ich bin sehr verdrahtet in meinem Kopf und weiß nicht, ob es möglich ist, direkt die Plugin-Klasse zu testen, ohne die jar-Datei zu erstellen (oder ist es sogar möglich, einige Funktionen und Klassen der jar-Datei zu testen)?
Wenn mir niemand helfen kann, kann ich mich weiter entwickeln wie in den guten alten Zeiten
Vielen Dank für Ihre Zeit und Hilfe Matthias