Ответ 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 Угол компилятора".