Подтвердить что ты не робот

Могу ли я получить АСТ из живого кода scala?

Я сказал "живой код", потому что я имею в виду не из текстовых исходных файлов или исходных строк, а из partialFunctions/lambdas. (Я знаю, что Ruby1.8 parseTree и С# linq могут это сделать)

рассмотрим partialFunction f:

val f = (i: Int, j: Int) => (i + j) * 2

Надеюсь, что какой-то инструмент работает следующим образом:

getBodyAstFrom(f) //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))

Мне все равно, что семантические вещи (синтаксический анализ контекста и implicits слишком сложны и ненужны для меня), мне просто нужно синтаксическое дерево из живого кода, возможно ли это?

Могут возникнуть проблемы с проверкой кода других пользователей, но как насчет моего собственного кода? Возможны ли следующие действия?

val f = AstFunction(i: Int, j: Int){(i + j) * 2}
f(5, 6) //=> 22
f.ast   //=> (Infix('*'), (Infix('+'), Id('i'), Id('j')), Val('2'))

Кажется, нужно немного взломать компилятор, хмммм...

4b9b3361

Ответ 1

Сам компилятор - это библиотека, которую вы можете вызвать. Это как работает REPL. Но пока вы можете получить дерево (на разных этапах) для строки кода, вы не сможете получить его для скомпилированного кода.

Кроме, конечно, если вы используете экспериментальные материалы, которые могут меняться в любой момент или просто перестать существовать. В этом случае вы можете попробовать:

scala.reflect.Code.lift(f).tree

И получим:

res17: scala.reflect.Tree = Select(Select(Select(Ident(Field(line26$object,PrefixedType(ThisType(RootSymbol),Class(line26$object)))),Field($iw,PrefixedType(ThisType(Class(line26$object)),Class($iw)))),Field($iw,PrefixedType(ThisType(Class($iw)),Class($iw)))),Method(f,PolyType(List(),List(),AppliedType(PrefixedType(ThisType(Class(scala)),Class(scala.Function2)),List(PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)), PrefixedType(ThisType(Class(scala)),Class(scala.Int)))))))

Помогает это или нет... Возможно, вы захотите проверить Miguel Garcia " Scala Угол компилятора".