我想使用抽象语法树为.fs文件生成F#代码。我能够使用Roslyn API生成.cs文件。以下是单元测试基于riak.cs生成的示例riak.proto文件。我想在F#中做同样的事情。我还不想创建一个类型提供者。有没有人使用FSharp.Compiler.Service进行任何示例,可能使用Fantomas?
答案 0 :(得分:8)
Fantomas肯定是正确的选择。如果要生成F#源代码,基本上需要两件事:
构建代表您要构建的源代码的AST。为此,您需要使用F#编译器服务中的无类型AST。 untyped syntax tree页面记录了如何处理它,但它应该是了解它的一个很好的起点。表达式的AST由SynExpr type定义。
构建AST后,需要对其进行格式化。 F#编译器不包含漂亮的打印机,但这正是Fantomas在CodePrinter file中所做的,所以你应该能够复制这个&将AST传递给那里实现的格式。我认为Visual F# PowerTools可能实际上有更新版本的Fantomas,所以请先检查一下。
这个答案全部使用无类型 AST,这可能非常适合使用该语言的语法。还有类型的 AST(在类型推断完成后创建),但这很难使用,并且不适合这里。
答案 1 :(得分:5)
我完全赞同Tomas'回答。你需要Fantomas管道的后半部分。以下是一些相关信息。
FSharp.Compiler.Service' s AST module由相关的AST和其他用于创建AST节点的实用程序函数组成,这可能对您有所帮助。
在Fantomas项目中,有formatAST
函数,它将AST作为输入并输出源代码字符串。