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

F#编译器服务错误地解析程序 更新:,f#,f#-compiler-services,F#,F# Compiler Services,我现在意识到这个问题很愚蠢,我应该把这个问题归档。事后看来,我不明白为什么我会问这个问题。 问题在于: 原始问题: 我正在使用FSharp编译器服务解析一些F#代码。 我现在面临的特殊代码是: let f x y = x+y let g = f 1 let h = (g 2) + 3 此程序生成一个TAST,最后一行没有(+)调用。也就是说,编译器服务返回TAST,就好像最后一行是let h=g2 问题是:这是一个我应该报告的合法错误,还是我遗漏了什么 一些注释 包含最少的re

我现在意识到这个问题很愚蠢,我应该把这个问题归档。事后看来,我不明白为什么我会问这个问题。
问题在于:


原始问题: 我正在使用FSharp编译器服务解析一些F#代码。
我现在面临的特殊代码是:

  let f x y = x+y
  let g = f 1
  let h = (g 2) + 3
此程序生成一个TAST,最后一行没有
(+)
调用。也就是说,编译器服务返回TAST,就好像最后一行是
let h=g2

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


一些注释
  • 包含最少的repo(我不想在这个问题中包括它,因为编译器服务需要大量的工作)
  • 之后,让h
    行不改变结果
  • 当编译到IL(与使用编译器服务解析相反)时,它似乎能按预期工作(例如,请参阅)
  • ,程序将正确解析
  • (而不是部分应用),程序正确解析

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

                """
                  module X
    
                  let f x y = x+y
                  let g = f 1
                  let h = (g 2) + 3
                """ 
    
    我发现里面有以下物体:

    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 (...,...))),...,...,...)
    
    如您所见,在第6行中,在字符32和33之间增加了一个字符

    F#Interactive无法正确显示的最可能的解释是库中的一个bug(可能AST处于不一致状态,或者漂亮的打印被破坏)。我认为你应该把一个bug归档

    更新:

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

    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