F# TypeProvider提供了意外的开发时间行为

F# TypeProvider提供了意外的开发时间行为,f#,type-providers,F#,Type Providers,我正在处理新的静态参数化类型提供程序,它提供了一个带有静态参数化静态方法的类型。我还没有找到关于这是不允许的文档。我遇到了一些奇怪的类型提供程序行为: 此类型提供程序使用的代码运行正常,但intellisense提供的信息糟糕。成员不断增加,但从未删除。OpDef方法在没有类型参数的情况下是不可用的,但是intellisense显示了这一点,作为一个选项,但是如果我实际引用它,仍然会给出一个关于缺少调用程序的错误。未显示提供的OpDef方法所需的参数-始终显示OpDef()->unit,而不是

我正在处理新的静态参数化类型提供程序,它提供了一个带有静态参数化静态方法的类型。我还没有找到关于这是不允许的文档。我遇到了一些奇怪的类型提供程序行为:

此类型提供程序使用的代码运行正常,但intellisense提供的信息糟糕。成员不断增加,但从未删除。OpDef方法在没有类型参数的情况下是不可用的,但是intellisense显示了这一点,作为一个选项,但是如果我实际引用它,仍然会给出一个关于缺少调用程序的错误。未显示提供的OpDef方法所需的参数-始终显示
OpDef()->unit
,而不是我当前希望看到的
OpDef(后缀:string*id:string)->unit
(从类型提供程序的此草稿中)。但我已经给出了它真正需要的所有论据,它就不再抱怨了

我正在做一些不受支持或不正确的事情吗?或者,令人怀疑的是,f#东西中是否存在缺陷(你能找出缺陷明显的地方吗)

下面是使用starterpack文件的完整实现

namespace OfflineSql

open ProviderImplementation.ProvidedTypes
open Microsoft.FSharp.Core.CompilerServices
open System.Text.RegularExpressions

#nowarn "0025"

[<TypeProvider>]
type OfflineSqlProvider (config : TypeProviderConfig) as this =
    inherit TypeProviderForNamespaces ()

    let ns = "OfflineSql"
    let asm = System.Reflection.Assembly.GetExecutingAssembly()

    let buildDomainProvider nm schema invariants =
        let parameterizedType = ProvidedTypeDefinition(asm, ns, nm, None)
        let m = ProvidedMethod("OpDef", list.Empty, typeof<unit>, IsStaticMethod = true)
        m.DefineStaticParameters(
            [
                ProvidedStaticParameter("script", typeof<string>)
            ],
            fun nm [| :? string as operation |] -> 
                let results = 
                    Regex.Matches(operation, "@([a-zA-Z_][a-zA-Z0-9_]*)") |> Seq.cast
                    |> Seq.map (fun (regmatch: Match) -> regmatch.Groups.[1].Captures.[0].ToString())
                let ps = [ for a in results -> ProvidedParameter(a, typeof<string>) ] |> List.distinct
                let opDef = ProvidedMethod(nm, ps, typeof<unit>, IsStaticMethod = true, InvokeCode = (fun _ -> <@@ () @@>))
                opDef.AddXmlDoc("Constructs a guarded method for the operation's script")
                parameterizedType.AddMember(opDef)
                opDef)
        let schemaProp = 
            ProvidedProperty("Schema", typeof<string>, IsStatic = true, 
                GetterCode = (fun _ -> <@@ schema @@>))
        let invariantsProp = 
            ProvidedProperty("Invariants", typeof<string>, IsStatic = true, 
                GetterCode = (fun _ -> <@@ invariants @@>))
        parameterizedType.AddMember(m)
        parameterizedType.AddMember(schemaProp)
        parameterizedType.AddMember(invariantsProp)
        parameterizedType

    do
        let root = ProvidedTypeDefinition(asm, ns, "Domain", None)
        root.DefineStaticParameters(
            [
                ProvidedStaticParameter("schema", typeof<string>)
                ProvidedStaticParameter("invariants", typeof<string>, "")
            ],
            fun nm [| :? string as schema ; :? string as invariants |] -> 
                buildDomainProvider nm schema invariants)
        this.AddNamespace(ns, [ root ])

[<assembly:TypeProviderAssembly>]
do ()
命名空间脱机SQL
打开ProviderImplementation.ProvidedTypes
打开Microsoft.FSharp.Core.CompilerServices
打开System.Text.RegularExpressions
#诺瓦恩“0025”
[]
键入OfflineSqlProvider(配置:TypeProviderConfig),如下所示=
继承TypeProviderForNamespaces()
让ns=“离线SQL”
设asm=System.Reflection.Assembly.GetExecutionGassembly()
让buildDomainProvider nm模式不变量=
让parameterizedType=ProvidedTypeDefinition(asm、ns、nm、None)
设m=ProvidedMethod(“OpDef”,list.Empty,typeof,IsStaticMethod=true)
m、 确定性参数(
[
ProvidedStaticParameter(“脚本”,类型)
],
fun nm[|:?字符串作为操作|]->
让结果=
正则表达式匹配(操作“@([a-zA-Z][a-zA-Z0-9\]*)”)|>Seq.cast
|>Seq.map(fun(regmatch:Match)->regmatch.Groups[1]。捕获[0]。ToString()
设ps=[对于结果->提供的参数(a,typeof)]|>List.distinct
让opDef=ProvidedMethod(nm,ps,typeof,IsStaticMethod=true,InvokeCode=(fun->)
AddXmlDoc(“为操作的脚本构造一个受保护的方法”)
parameterizedType.AddMember(opDef)
opDef)
设schemaProp=
ProvidedProperty(“Schema”,typeof,IsStatic=true,
GetterCode=(乐趣->)
设不变量sprop=
ProviderProperty(“不变量”、typeof、IsStatic=true、,
GetterCode=(乐趣->)
parameterizedType.AddMember(m)
parameterizedType.AddMember(schemaProp)
parameterizedType.AddMember(不变量sprop)
参数化类型
做
让root=ProvidedTypeDefinition(asm,ns,“域”,无)
root.DefineStaticParameters(
[
ProvidedStaticParameter(“架构”,类型)
ProvidedStaticParameter(“不变量”,typeof,”)
],
趣味nm[|:?字符串作为模式;:?字符串作为不变量|]->
buildDomainProvider nm模式不变量)
此.AddNamespace(ns,[root])
[]
do()

这与修复的已知错误直接相关:

感谢functionalprogramming.slack.com/fsharp上的@gauthier提供此发现