Генерация скаля АСТ для рекурсивного метода - PullRequest
5 голосов
/ 11 апреля 2010

Я генерирую scala AST, используя следующий код:

  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)

Полагаю, это стандартный код, используемый для запуска компилятора в коде и генерации AST для работы. Приведенный выше код работал до сих пор для любого действительного кода Scala в Test.scala. Когда я использую рекурсивную функцию в Test.scala, например

def xMethod (x: Int): Int = if (x == 0) -1, иначе xMethod (x-1)

Это дает мне исключение java.lang.NullPointerException. Несколько верхних строк трассировки стека выглядят так:

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)

Код отлично работает для метода, подобного

def aMethod(c:Int):Int = { bMethod(c) }
def bMethod(x:Int):Int = aMethod(x)

Пожалуйста, дайте мне знать, если рекурсивным функциям нужна какая-либо другая настройка.

1 Ответ

1 голос
/ 11 апреля 2010

Я не могу сказать вам, что вы делаете неправильно, но я использую compiler.typedTree, чтобы получить AST в моем проекте. Может быть, это работает и для вас.

Подробнее см. http://scala.ifs.hsr.ch/browser/src/scala/tools/refactoring/util/CompilerProvider.scala.

...