F# 编译器服务错误地解析程序
F# Compiler Services incorrectly parses program
更新:
我现在意识到这个问题很愚蠢,我应该提交这个问题。事后看来,我不明白我为什么问这个问题。
问题在这里: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
该程序在最后一行没有调用 (+)
的情况下生成 TAST。也就是说,编译器服务 returns TAST 就好像最后一行只是 let h = g 2
.
问题是:这是我应该报告的合法错误还是我遗漏了什么?
一些笔记
- Here is a repo 包含最少的重现(我不想将它包括在这个问题中,因为编译器服务需要相当多的舞蹈)。
- Adding more statements
let h
行后不改变结果。
- 当编译为 IL(而不是用编译器服务解析)时,它似乎按预期工作(例如参见 [=19=])
- If I make
g
a value,程序正确解析。
- If I make
g
a normal function(而不是部分应用),程序正确解析。
我没有使用 FSharp.Compiler.Services
的先验经验,但我还是使用 Visual Studio 的调试器做了一个小调查。我分析了以下字符串的抽象语法树:
"""
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 无法正确显示它的最可能的解释是库中的错误(可能 AST 处于不一致状态或漂亮打印已损坏)。我认为您应该在 project's issue tracker.
中提交错误
更新:
上述对象可以通过以下方式在调试器中获取:
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
更新:
我现在意识到这个问题很愚蠢,我应该提交这个问题。事后看来,我不明白我为什么问这个问题。
问题在这里: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
该程序在最后一行没有调用 (+)
的情况下生成 TAST。也就是说,编译器服务 returns TAST 就好像最后一行只是 let h = g 2
.
问题是:这是我应该报告的合法错误还是我遗漏了什么?
一些笔记
- Here is a repo 包含最少的重现(我不想将它包括在这个问题中,因为编译器服务需要相当多的舞蹈)。
- Adding more statements
let h
行后不改变结果。 - 当编译为 IL(而不是用编译器服务解析)时,它似乎按预期工作(例如参见 [=19=])
- If I make
g
a value,程序正确解析。 - If I make
g
a normal function(而不是部分应用),程序正确解析。
我没有使用 FSharp.Compiler.Services
的先验经验,但我还是使用 Visual Studio 的调试器做了一个小调查。我分析了以下字符串的抽象语法树:
"""
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 无法正确显示它的最可能的解释是库中的错误(可能 AST 处于不一致状态或漂亮打印已损坏)。我认为您应该在 project's issue tracker.
中提交错误更新:
上述对象可以通过以下方式在调试器中获取:
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