我弄乱了我的新的静态参数化类型提供程序,它提供了一个静态参数化静态方法的类型。我还没有找到关于这个不被允许的文件。我得到了一些奇怪的类型提供者行为:
这种类型提供者消耗代码正确运行但智能感知提供了蹩脚的信息。成员只是不断添加但从未删除。 OpDef方法在没有类型参数的情况下不可用,但intellisense有点显示作为一个选项,但如果我实际引用它仍然会给出一个关于缺少调用者的错误。未显示所提供的OpDef方法的必需参数 - 始终显示我目前期望看到的OpDef() -> unit
而不是OpDef(suffix : string * id : string) -> unit
(来自类型提供程序的此草稿)。但是,由于我已经给出了真正需要的所有论据,所以它就会停止抱怨。
我做的事情是不支持或纠正的吗?或者,令人怀疑的是,f#中是否存在错误(你可以找出错误明显的地方)吗?
以下是使用starter-pack文件的完整实现。
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 ()
答案 0 :(得分:2)
这与已修复的错误直接相关:
感谢@guthier在functionalprogramming.slack.com/fsharp上的查找。