F#编译器服务错误地解析程序

Fyo*_*kin 9 f# f#-compiler-services

更新:

我现在意识到这个问题很愚蠢,我本应该提出这个问题.事后来看,我不明白为什么我甚至都会问这个问题.
问题出在这里:https://github.com/fsharp/FSharp.Compiler.Service/issues/544


原始问题:

我正在使用FSharp编译器服务来解析一些F#代码.
我现在面对的特定代码是:

  let f x y = x+y
  let g = f 1
  let h = (g 2) + 3
Run Code Online (Sandbox Code Playgroud)

该程序(+)在最后一行没有调用的情况下产生TAST .也就是说,编译器服务返回TAST,就像最后一行一样let h = g 2.

问题是:这是一个我应该报告的合法错误,还是我错过了什么?


一些笔记

  1. 这是一个包含最小repro 的repo(我不想在这个问题中包含它,因为Compiler Services需要相当多的跳舞).
  2. let h在行之后添加更多语句不会改变结果.
  3. 当编译为IL(而不是使用编译器服务解析)时,它似乎按预期工作(例如,见小提琴)
  4. 如果我创建g一个值,程序会正确解析.
  5. 如果我创建g一个正常的函数(而不是部分应用),程序会正确解析.

Tom*_*ski 7

我没有先验经验FSharp.Compiler.Services但是我使用Visual Studio的调试器做了一个小的调查.我分析了以下字符串的抽象语法树:

            """
              module X

              let f x y = x+y
              let g = f 1
              let h = (g 2) + 3
            """ 
Run Code Online (Sandbox Code Playgroud)

我发现其中有以下对象:

App (Val (op_Addition,NormalValUse,D:\file.fs (6,32--6,33) IsSynthetic=false),TType_forall ([T1; T2; T3],TType_fun (TType_var T1,TType_fun (...,...))),...,...,...)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在 32和第33 字符之间有第6 行添加.

最有可能的解释为什么F#Interactive没有正确显示它是一个库中的错误(可能AST处于不一致状态或漂亮的打印被打破).我认为您应该在项目的问题跟踪器中提交错误.

更新:

上述对象可以通过以下方式在debbuger中获得:

error.[0] 
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpImplementationFileDeclaration.Entity) 
.Item2 
.[2]
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpImplementationFileDeclaration.MemberOrFunctionOrValue)
.Item3
.f (private member)
.Value
(option of Microsoft.FSharp.Compiler.SourceCodeServices.FSharpExprConvert.ConvExprOnDemand@903)
.expr
Run Code Online (Sandbox Code Playgroud)