Je génère le scala AST en utilisant le code suivant:Génération scala AST pour la méthode récursive
val setting = new Settings(error)
val reporter = new ConsoleReporter(setting, in, out) {
override def displayPrompt =()
}
val compiler = new Global(setting, reporter) with ASTExtractor{
override def onlyPresentation = true
}
//setting.PhasesSetting("parser", "parserPhase")
val run = new compiler.Run
val sourceFiles:List[String] = List("Test.scala")
run.compile(sourceFiles.toList)
Je suppose que cela est le code standard utilisé pour exécuter le compilateur dans le code et générer l'AST pour travailler avec. Le code ci-dessus a bien fonctionné pour tout code de scala valide dans Test.scala jusqu'à maintenant. Lors de l'utilisation d'une fonction récursive en Test.scala, comme
def xMethod (x: Int): Int = if (x == 0) -1 autre xMethod (x-1)
Cela me donne une exception java.lang.NullPointerException. Les principales lignes de la trace de la pile ressemblent à ce
at scala.tools.nsc.typechecker.Typers$Typer.checkNoDoubleDefsAndAddSynthetics$1(Typers.scala:2170)
at scala.tools.nsc.typechecker.Typers$Typer.typedStats(Typers.scala:2196)
at scala.tools.nsc.typechecker.Typers$Typer.typedBlock(Typers.scala:1951)
at scala.tools.nsc.typechecker.Typers$Typer.typed1(Typers.scala:3815)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4124)
at scala.tools.nsc.typechecker.Typers$Typer.typed(Typers.scala:4177)
at scala.tools.nsc.transform.TailCalls$TailCallElimination.transform(TailCalls.scala:199)
Le code fonctionne bien pour une méthode comme
def aMethod(c:Int):Int = { bMethod(c) }
def bMethod(x:Int):Int = aMethod(x)
S'il vous plaît laissez-moi savoir si les fonctions récursives besoin d'un autre paramètre.