Skip to content

Instantly share code, notes, and snippets.

@unarist
Last active September 8, 2016 16:28
Show Gist options
  • Save unarist/2924d5929a2e6a68d753eaec94ca39e5 to your computer and use it in GitHub Desktop.
Save unarist/2924d5929a2e6a68d753eaec94ca39e5 to your computer and use it in GitHub Desktop.
指定した型のシグネチャをVisual F# Power Toolsで取得する
// #r "FSharp.Compiler.Services.dll"
// #r "FSharpVSPowerTools.Core.dll"
open Microsoft.FSharp.Compiler.SourceCodeServices
open FSharpVSPowerTools.CodeGeneration.SignatureGenerator
System.Diagnostics.Trace.Listeners.Clear()
let checker = FSharpChecker.Create()
let tempfile = Path.ChangeExtension(Path.GetTempFileName(), "fs")
let parseAndTypeCheckSingleFile (file, input) =
async {
File.WriteAllText(file, input)
let! projOptions = checker.GetProjectOptionsFromScript(file, input)
return! checker.ParseAndCheckProject(projOptions)
}
let symbolForTypeName name =
async {
let! checkResult = parseAndTypeCheckSingleFile(tempfile, "typeof<" + name + "> |> ignore")
let! symbolUses = checkResult.GetAllUsesOfAllSymbols()
let symbolUse =
match Array.isEmpty symbolUses with
| true -> None
| false -> Some (symbolUses |> Seq.filter (fun x -> x.IsFromType) |> Seq.last)
return symbolUse |> Option.map (fun x -> x.Symbol)
} |> Async.RunSynchronously
let sigForSymbol (symbol: FSharpSymbol) =
formatSymbol
(fun x -> XmlDoc.Empty) //getXmlDocBySignature (XmlDocSig -> XmlDoc)
4 //indentation
FSharpDisplayContext.Empty //displayContext (FSharpDisplayContext)
Seq.empty //openDeclarations seq<OpenDeclaration>
symbol //symbol (FSharpSymbol)
Filterer.NoFilters //filterer (Filterer)
BlankLines.Default //blankLines (BlankLines)
symbolForTypeName "option" |> Option.bind sigForSymbol |> Option.iter stdout.WriteLine
symbolForTypeName "Microsoft.FSharp.Core.Option" |> Option.bind sigForSymbol |> Option.iter stdout.WriteLine
symbolForTypeName "System.DateTime" |> Option.bind sigForSymbol |> Option.iter stdout.WriteLine
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment