如何在生成时生成F#Azure函数存根?

时间:2019-02-23 22:56:13

标签: f# azure-functions code-generation

假设我有一个漂亮的F#函数,如下所示:

let doWork (item: string) = 
    printf "Hello %s" item

,现在我要从中创建一个Azure函数。我需要做的就是声明另一个类似的函数,但是用特定的属性来装饰它,例如:

[<FunctionName("DoWork")>]
let DoWork([<QueueTrigger("myqueue")>] item: string) = doWork item

第20次这样做之后,我问自己是否可以在构建时使用属性生成那些函数。像

let functionApp = generateFunctionsMagic [doWork; doWork2; doWork3]

将扩展为3种带注释的方法。我可以用其他方式注释生成的内容。

什么是有效的方法?

1 个答案:

答案 0 :(得分:1)

在F#中没有简单的代码生成方法

您可以基于Fantomas使自己拥有代码生成器。

常用工作流程:

  1. 读取* .fs文件
  2. 调用FSharp.Compiler.Service从文本获取AST
  3. 分析AST
  4. 重写AST(例如在Fantomas的情况下,添加LongIdent个节点)
  5. 将AST转换为文本
  6. 将文本写入* .fs文件

您可以为自己的代码生成工具派遣Fantomas。

P.S。此外,这可能会有所帮助-Ionide Analyzers。但是afaik他们不支持AST重写。 AST仅用于分析问题,之后您必须直接使用文本。

已添加

我已经基于AST创建了example的代码源