2016-05-09 4 views
3

静的にパラメータ化された静的メソッドを持つ型を提供する、静的にパラメータ化された新しい型プロバイダを使いこなしています。私は許可されていないことについての文書を見つけられませんでした。私はいくつかの奇妙なタイププロバイダの動作を取得しています:TypeProviderの予期しない開発時の動作

enter image description here

このタイプのプロバイダのかかるコードが正しく実行されますがインテリセンスが安っぽいの情報を提供します。メンバーは追加され続けますが、削除されることはありません。 OpDefメソッドは型パラメータなしでは使用できないはずですが、intellisenseちょっとしたことがオプションとして表示されていますが、私が実際に参照すると、行方不明の呼び出し側に関するエラーが表示されます。提供されたOpDefメソッドに必要な引数は表示されません - 私が現在見たいと思っているOpDef(suffix : string * id : string) -> unitではなく、常にOpDef() -> unitと表示されます(このタイププロバイダのドラフトから)。しかし、私が本当に必要とするすべての議論をしたので、それは不平を言い止める。

私はサポートされていないか、正しいものをやっていますか?あるいは、間違いなく、f#にバグがあります(バグがどこにあるのか分かりますか?)。

ここには、スターターパックファイルを使用する完全な実装があります。

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() 

答えて

関連する問題