Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for generating docs for type providers #143

Merged
merged 3 commits into from
Mar 10, 2014
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion RELEASE_NOTES.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,6 @@
* 2.3.7-beta - Add auto-formatting for links and output sample usage for DU cases
* 2.3.8-beta - Update FSharp.Compiler.Service to v0.0.17
* 2.3.9-beta - Update FSharp.Compiler.Service to v0.0.20, include inherited members when the base type was ommited from the documentation, fix properties displaying as methods, fix functions with unit input rendering incorrectly
* 2.3.10-beta - Support output embedding in literate scripts
* 2.3.10-beta - Support output embedding in literate scripts
* 2.4.0 - Incrementing version and stop using the beta versioning
* 2.4.1 - Support for generating docs for type providers
6 changes: 6 additions & 0 deletions misc/templates/reference/type.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,12 @@
TableHeader = "Record Field",
Members = g.Members.Where(m => m.Kind == MemberKind.RecordField)
})

@RenderPart("part-members", new {
Header = "Static parameters",
TableHeader = "Static parameters",
Members = g.Members.Where(m => m.Kind == MemberKind.StaticParameter)
})

@RenderPart("part-members", new {
Header = "Constructors",
Expand Down
2 changes: 1 addition & 1 deletion nuget/FSharp.Formatting.nuspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
<dependencies>
<dependency id="Microsoft.AspNet.Razor" version="2.0.30506.0" />
<dependency id="RazorEngine" version="3.3.0" />
<dependency id="FSharp.Compiler.Service" version="0.0.20" />
<dependency id="FSharp.Compiler.Service" version="0.0.32" />
</dependencies>
</metadata>
<files>
Expand Down
6 changes: 3 additions & 3 deletions src/Common/AssemblyInfo.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ open System.Reflection
[<assembly: AssemblyTitleAttribute("FSharp.Formatting")>]
[<assembly: AssemblyProductAttribute("FSharp.Formatting")>]
[<assembly: AssemblyDescriptionAttribute("A package of libraries for building great F# documentation, samples and blogs")>]
[<assembly: AssemblyVersionAttribute("2.3.10")>]
[<assembly: AssemblyFileVersionAttribute("2.3.10")>]
[<assembly: AssemblyVersionAttribute("2.4.1")>]
[<assembly: AssemblyFileVersionAttribute("2.4.1")>]
[<assembly: AssemblyCopyrightAttribute("Apache 2.0 License")>]
do ()

module internal AssemblyVersionInformation =
let [<Literal>] Version = "2.3.10"
let [<Literal>] Version = "2.4.1"
2 changes: 1 addition & 1 deletion src/FSharp.CodeFormat/FSharp.CodeFormat.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@
</ItemGroup>
<ItemGroup>
<Reference Include="FSharp.Compiler.Service">
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.20\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.32\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
Expand Down
2 changes: 1 addition & 1 deletion src/FSharp.CodeFormat/packages.config
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FSharp.Compiler.Service" version="0.0.20" targetFramework="net40" />
<package id="FSharp.Compiler.Service" version="0.0.32" targetFramework="net40" />
</packages>
4 changes: 0 additions & 4 deletions src/FSharp.Formatting.CommandTool/Exec.fs
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,6 @@ open CommandLine
open CommandLine.Text

open System.Collections.Generic
open FSharp.Data
open FSharp.Data.Json
open FSharp.Data.Json.Extensions


/// configuration of the supported FSharp.Formatting functions
let OptionsMapping = new Dictionary<string, IExecutable>(HashIdentity.Structural)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,14 +47,6 @@
<HintPath>..\..\packages\CommandLineParser.1.9.71\lib\net45\CommandLine.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FSharp.Data">
<HintPath>..\..\packages\FSharp.Data.1.1.10\lib\net40\FSharp.Data.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FSharp.Data.DesignTime">
<HintPath>..\..\packages\FSharp.Data.1.1.10\lib\net40\FSharp.Data.DesignTime.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<Private>False</Private>
Expand All @@ -65,6 +57,7 @@
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Numerics" />
<Reference Include="System.Xml.Linq" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
Expand Down
1 change: 0 additions & 1 deletion src/FSharp.Formatting.CommandTool/packages.config
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="CommandLineParser" version="1.9.71" targetFramework="net451" />
<package id="FSharp.Data" version="1.1.10" targetFramework="net451" />
</packages>
2 changes: 1 addition & 1 deletion src/FSharp.Literate/FSharp.Literate.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@
</ItemGroup>
<ItemGroup>
<Reference Include="FSharp.Compiler.Service">
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.20\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.32\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
Expand Down
2 changes: 1 addition & 1 deletion src/FSharp.Literate/packages.config
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FSharp.Compiler.Service" version="0.0.20" targetFramework="net45" />
<package id="FSharp.Compiler.Service" version="0.0.32" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
<package id="RazorEngine" version="3.3.0" targetFramework="net40" />
</packages>
2 changes: 1 addition & 1 deletion src/FSharp.MetadataFormat/FSharp.MetadataFormat.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="FSharp.Compiler.Service">
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.20\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.32\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FSharp.Core, Version=4.3.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
Expand Down
77 changes: 62 additions & 15 deletions src/FSharp.MetadataFormat/Main.fs
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ type MemberKind =
// In a class, F# special members
| UnionCase = 100
| RecordField = 101
| StaticParameter = 102

type Member =
{ Name : string
Expand All @@ -65,16 +66,23 @@ type Type =

UnionCases : Member list
RecordFields : Member list
StaticParameters : Member list

AllMembers : Member list
Constructors : Member list
InstanceMembers : Member list
StaticMembers : Member list }
static member Create(name, url, comment, cases, fields, ctors, inst, stat) =
{ Type.Name = name; UrlName = url; Comment = comment;
UnionCases = cases; RecordFields = fields
AllMembers = List.concat [ ctors; inst; stat; cases; fields ] ;
Constructors = ctors; InstanceMembers = inst; StaticMembers = stat }
static member Create(name, url, comment, cases, fields, statParams, ctors, inst, stat) =
{ Type.Name = name
UrlName = url
Comment = comment
UnionCases = cases
RecordFields = fields
StaticParameters = statParams
AllMembers = List.concat [ ctors; inst; stat; cases; fields; statParams ]
Constructors = ctors
InstanceMembers = inst
StaticMembers = stat }

type Module =
{ Name : string
Expand Down Expand Up @@ -261,15 +269,15 @@ module ValueReader =
let formatArgUsage generateTypes i (arg:FSharpParameter) =
let nm =
match arg.Name with
| null ->
| None ->
if arg.Type.IsNamedType && arg.Type.NamedEntity.XmlDocSig = "T:Microsoft.FSharp.Core.unit" then "()"
else "arg" + string i
| nm -> nm
| Some nm -> nm
// Detect an optional argument
let isOptionalArg = hasAttrib<OptionalArgumentAttribute> arg.Attributes
let argName = if isOptionalArg then "?" + nm else nm
if generateTypes then
(if String.IsNullOrWhiteSpace(arg.Name) then "" else argName + ":") +
(match arg.Name with None -> "" | Some argName -> argName + ":") +
formatTypeWithPrec 2 arg.Type
else argName

Expand Down Expand Up @@ -341,12 +349,12 @@ module ValueReader =
let signature =
match argInfos with
| [] -> retType
| [[x]] when v.IsGetterMethod && x.Name = null && x.Type.NamedEntity.XmlDocSig = "T:Microsoft.FSharp.Core.unit" -> retType
| [[x]] when v.IsGetterMethod && x.Name.IsNone && x.Type.NamedEntity.XmlDocSig = "T:Microsoft.FSharp.Core.unit" -> retType
| _ -> (formatArgsUsage true v argInfos) + " -> " + retType

let usage =
match argInfos with
| [[x]] when v.IsGetterMethod && x.Name = null && x.Type.NamedEntity.XmlDocSig = "T:Microsoft.FSharp.Core.unit" -> ""
| [[x]] when v.IsGetterMethod && x.Name.IsNone && x.Type.NamedEntity.XmlDocSig = "T:Microsoft.FSharp.Core.unit" -> ""
| _ -> formatArgsUsage false v argInfos

let buildShortUsage length =
Expand Down Expand Up @@ -392,7 +400,7 @@ module ValueReader =
*)

let readUnionCase (ctx:ReadingContext) (case:FSharpUnionCase) =
let formatFieldUsage (field:FSharpRecordField) =
let formatFieldUsage (field:FSharpField) =
if field.Name.StartsWith("Item") then
formatType field.FieldType
else
Expand Down Expand Up @@ -551,13 +559,49 @@ module Reader =
// Reading modules types (mutually recursive, because of nesting)
// ----------------------------------------------------------------------------------------------

// Create a xml documentation snippet and add it to the XmlMemberMap
let registerXmlDoc (ctx:ReadingContext) xmlDocSig (xmlDoc:string) =
let xmlDoc = if xmlDoc.Contains "<summary>" then xmlDoc else "<summary>" + xmlDoc + "</summary>"
let xmlDoc = "<member name=\"" + xmlDocSig + "\">" + xmlDoc + "</member>"
let xmlDoc = XElement.Parse xmlDoc
ctx.XmlMemberMap.Add(xmlDocSig, xmlDoc)
xmlDoc

// Type providers don't have their docs dumped into the xml file,
// so we need to add them to the XmlMemberMap separately
let processTypeProvider (ctx:ReadingContext) (typ:FSharpEntity) =
let xmlDocSig = "T:" + typ.AccessPath + "." + typ.LogicalName
let xmlDoc = registerXmlDoc ctx xmlDocSig (String.concat "" typ.XmlDoc)
let statParams =
xmlDoc.Descendants(XName.Get "param")
|> Seq.choose (fun p -> let nameAttr = p.Attribute(XName.Get "name")
if nameAttr = null
then None
else Some (nameAttr.Value, p.Value))
|> Seq.choose (fun (name, xmlDoc) ->
let xmlDocSig = "P:" + typ.AccessPath + "." + typ.LogicalName + "." + name
registerXmlDoc ctx xmlDocSig (Security.SecurityElement.Escape xmlDoc) |> ignore
readCommentsInto ctx xmlDocSig (fun cat cmds comment ->
Member.Create(name,
MemberKind.StaticParameter,
cat,
MemberOrValue.Create((fun _ -> name), [], [], name, None),
comment)))
|> Seq.toList
xmlDocSig, statParams

let rec readModulesAndTypes ctx (entities:seq<_>) =
let modules = readChildren ctx entities readModule (fun x -> x.IsFSharpModule)
let types = readChildren ctx entities readType (fun x -> not x.IsFSharpModule)
modules, types

and readType (ctx:ReadingContext) (typ:FSharpEntity) =
readCommentsInto ctx typ.XmlDocSig (fun cat cmds comment ->
let xmlDocSig, statParams =
if typ.XmlDocSig <> "" then typ.XmlDocSig, []
elif typ.XmlDoc.Count = 0 then "", []
// assume is a type provider
else processTypeProvider ctx typ
readCommentsInto ctx xmlDocSig (fun cat cmds comment ->
let urlName = ctx.UniqueUrlName (sprintf "%s.%s" typ.AccessPath typ.CompiledName)

let rec getMembers (typ:FSharpEntity) = [
Expand Down Expand Up @@ -600,7 +644,7 @@ module Reader =
let inst = readAllMembers ctx MemberKind.InstanceMember ivals
let stat = readAllMembers ctx MemberKind.StaticMember svals
Type.Create
( name, urlName, comment, cases, fields, ctors, inst, stat ))
( name, urlName, comment, cases, fields, statParams, ctors, inst, stat ))

and readModule (ctx:ReadingContext) (modul:FSharpEntity) =
readCommentsInto ctx modul.XmlDocSig (fun cat cmd comment ->
Expand Down Expand Up @@ -632,11 +676,14 @@ module Reader =

// Read in the supplied XML file, map its name attributes to document text
let doc = XDocument.Load(xmlFile)
let xmlMemberMap =
// don't use 'dict' to allow the dictionary to be mutated later on
let xmlMemberMap = Dictionary()
for key, value in
[ for e in doc.Descendants(XName.Get "member") do
let attr = e.Attribute(XName.Get "name")
if attr <> null && not (String.IsNullOrEmpty(attr.Value)) then
yield attr.Value, e ] |> dict
yield attr.Value, e ] do
xmlMemberMap.Add(key, value)
let ctx = ReadingContext.Create(publicOnly, xmlMemberMap, sourceFolderRepo)

//
Expand Down
2 changes: 1 addition & 1 deletion src/FSharp.MetadataFormat/packages.config
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FSharp.Compiler.Service" version="0.0.20" targetFramework="net40" />
<package id="FSharp.Compiler.Service" version="0.0.32" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net45" />
<package id="RazorEngine" version="3.3.0" targetFramework="net45" />
</packages>
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
</PropertyGroup>
<ItemGroup>
<Reference Include="FSharp.Compiler.Service">
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.20\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<HintPath>..\..\packages\FSharp.Compiler.Service.0.0.32\lib\net40\FSharp.Compiler.Service.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="FSharp.Core, Version=$(TargetFSharpCoreVersion), Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
Expand Down
2 changes: 1 addition & 1 deletion tests/FSharp.MetadataFormat.Tests/packages.config
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="FSharp.Compiler.Service" version="0.0.20" targetFramework="net40" />
<package id="FSharp.Compiler.Service" version="0.0.32" targetFramework="net40" />
<package id="Microsoft.AspNet.Razor" version="2.0.30506.0" targetFramework="net40" />
<package id="NUnit" version="2.6.3" targetFramework="net40" />
<package id="RazorEngine" version="3.3.0" targetFramework="net40" />
Expand Down