starlight-fsharp-oracle 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Directory.Build.props +25 -0
- package/Directory.Packages.props +18 -0
- package/README.md +80 -0
- package/dist/Extensions/StringBuilder.js +28 -0
- package/dist/Extensions/TextNode.js +115 -0
- package/dist/FSharp.Oracle.Schema/Schema.js +674 -0
- package/dist/Generate.js +254 -0
- package/dist/Helpers.js +69 -0
- package/dist/Plugin.js +139 -0
- package/dist/Render/Documentation.js +87 -0
- package/dist/Render/Entries.js +148 -0
- package/dist/Render/Pages.js +292 -0
- package/dist/Render/Primitives.js +114 -0
- package/dist/Render/Types.js +30 -0
- package/dist/Render.js +12 -0
- package/dist/Themes.js +78 -0
- package/oracle-bin/FSharp.Compiler.Service.dll +0 -0
- package/oracle-bin/FSharp.Core.dll +0 -0
- package/oracle-bin/FSharp.DependencyManager.Nuget.dll +0 -0
- package/oracle-bin/FSharp.Oracle.Schema.dll +0 -0
- package/oracle-bin/FSharp.Oracle.Schema.pdb +0 -0
- package/oracle-bin/FSharp.Oracle.Schema.xml +219 -0
- package/oracle-bin/Fable.Core.dll +0 -0
- package/oracle-bin/Oracle +0 -0
- package/oracle-bin/Oracle.deps.json +280 -0
- package/oracle-bin/Oracle.dll +0 -0
- package/oracle-bin/Oracle.pdb +0 -0
- package/oracle-bin/Oracle.runtimeconfig.json +13 -0
- package/oracle-bin/Oracle.xml +111 -0
- package/oracle-bin/Thoth.Json.Core.Auto.dll +0 -0
- package/oracle-bin/Thoth.Json.Core.dll +0 -0
- package/oracle-bin/Thoth.Json.System.Text.Json.dll +0 -0
- package/oracle-bin/cs/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/cs/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/cs/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/de/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/de/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/de/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/es/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/es/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/es/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/fr/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/fr/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/fr/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/it/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/it/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/it/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/ja/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/ja/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/ja/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/ko/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/ko/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/ko/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/pl/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/pl/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/pl/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/pt-BR/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/pt-BR/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/pt-BR/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/ru/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/ru/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/ru/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/tr/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/tr/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/tr/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/zh-Hans/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/zh-Hans/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/zh-Hans/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/oracle-bin/zh-Hant/FSharp.Compiler.Service.resources.dll +0 -0
- package/oracle-bin/zh-Hant/FSharp.Core.resources.dll +0 -0
- package/oracle-bin/zh-Hant/FSharp.DependencyManager.Nuget.resources.dll +0 -0
- package/package.json +38 -0
- package/packages/FSharp.Oracle/Extractor/Assembly.fs +160 -0
- package/packages/FSharp.Oracle/Extractor/EntityExtractor.fs +608 -0
- package/packages/FSharp.Oracle/Extractor/Helpers.fs +150 -0
- package/packages/FSharp.Oracle/Extractor/MemberExtractor.fs +172 -0
- package/packages/FSharp.Oracle/Extractor/ModuleExtractor.fs +45 -0
- package/packages/FSharp.Oracle/Extractor/ParameterExtractor.fs +47 -0
- package/packages/FSharp.Oracle/Extractor/SignatureRendering.fs +464 -0
- package/packages/FSharp.Oracle/Extractor/ValueExtractor.fs +171 -0
- package/packages/FSharp.Oracle/FSharp.Oracle.fsproj +36 -0
- package/packages/FSharp.Oracle/Program.fs +66 -0
- package/packages/FSharp.Oracle/XmlDoc.fs +463 -0
- package/packages/FSharp.Oracle.Schema/FSharp.Oracle.Schema.fsproj +16 -0
- package/packages/FSharp.Oracle.Schema/Schema.fs +454 -0
- package/packages/Starlight.FSharp.Oracle/components/DocEntry.astro +256 -0
- package/packages/Starlight.FSharp.Oracle/components/FSharpDocPage.astro +121 -0
- package/packages/Starlight.FSharp.Oracle/components/fsharp-doc.css +58 -0
- package/packages/Starlight.FSharp.Oracle/layouts/FSharpDocLayout.astro +27 -0
|
@@ -0,0 +1,608 @@
|
|
|
1
|
+
namespace FSharp.Oracle
|
|
2
|
+
|
|
3
|
+
open FSharp.Compiler.Symbols
|
|
4
|
+
open FSharp.Oracle.Schema
|
|
5
|
+
open Oracle.XmlDoc
|
|
6
|
+
open Helpers
|
|
7
|
+
open SignatureRendering
|
|
8
|
+
open MemberExtractor
|
|
9
|
+
|
|
10
|
+
module internal EntityExtractor =
|
|
11
|
+
let caseFieldNodes (fields: Field list) =
|
|
12
|
+
fields
|
|
13
|
+
|> List.mapi (fun i f ->
|
|
14
|
+
let separator =
|
|
15
|
+
if i = 0 then
|
|
16
|
+
[]
|
|
17
|
+
else
|
|
18
|
+
[
|
|
19
|
+
TextNode.Space
|
|
20
|
+
TextNode.Star
|
|
21
|
+
TextNode.Space
|
|
22
|
+
]
|
|
23
|
+
|
|
24
|
+
let nameNodes =
|
|
25
|
+
if f.Name = "" then
|
|
26
|
+
[]
|
|
27
|
+
else
|
|
28
|
+
[
|
|
29
|
+
TextNode.Text f.Name
|
|
30
|
+
TextNode.Space
|
|
31
|
+
TextNode.Colon
|
|
32
|
+
TextNode.Space
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
separator @ nameNodes @ [ f.Type ]
|
|
36
|
+
)
|
|
37
|
+
|> List.concat
|
|
38
|
+
|
|
39
|
+
let memberDeclarationLine (m: Member) : TextNode list =
|
|
40
|
+
let prefixNodes =
|
|
41
|
+
match m.Kind with
|
|
42
|
+
| MemberKind.Constructor -> [ TextNode.AnchoredKeyword("new", $"#{m.Name}") ]
|
|
43
|
+
| MemberKind.Operator ->
|
|
44
|
+
[
|
|
45
|
+
TextNode.Keyword "static"
|
|
46
|
+
TextNode.Space
|
|
47
|
+
TextNode.Keyword "member"
|
|
48
|
+
TextNode.Space
|
|
49
|
+
]
|
|
50
|
+
| MemberKind.Property ->
|
|
51
|
+
if m.IsStatic then
|
|
52
|
+
[
|
|
53
|
+
TextNode.Keyword "static"
|
|
54
|
+
TextNode.Space
|
|
55
|
+
TextNode.Keyword "property"
|
|
56
|
+
TextNode.Space
|
|
57
|
+
]
|
|
58
|
+
elif m.IsAbstract then
|
|
59
|
+
[
|
|
60
|
+
TextNode.Keyword "abstract"
|
|
61
|
+
TextNode.Space
|
|
62
|
+
TextNode.Keyword "property"
|
|
63
|
+
TextNode.Space
|
|
64
|
+
]
|
|
65
|
+
else
|
|
66
|
+
[
|
|
67
|
+
TextNode.Keyword "property"
|
|
68
|
+
TextNode.Space
|
|
69
|
+
]
|
|
70
|
+
| MemberKind.Method ->
|
|
71
|
+
if m.IsStatic then
|
|
72
|
+
[
|
|
73
|
+
TextNode.Keyword "static"
|
|
74
|
+
TextNode.Space
|
|
75
|
+
TextNode.Keyword "member"
|
|
76
|
+
TextNode.Space
|
|
77
|
+
]
|
|
78
|
+
elif m.IsAbstract then
|
|
79
|
+
[
|
|
80
|
+
TextNode.Keyword "abstract"
|
|
81
|
+
TextNode.Space
|
|
82
|
+
TextNode.Keyword "member"
|
|
83
|
+
TextNode.Space
|
|
84
|
+
]
|
|
85
|
+
else
|
|
86
|
+
[
|
|
87
|
+
TextNode.Keyword "member"
|
|
88
|
+
TextNode.Space
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
let allParams = m.Parameters |> List.collect id
|
|
92
|
+
|
|
93
|
+
let typeNodes =
|
|
94
|
+
if allParams.IsEmpty then
|
|
95
|
+
[ m.ReturnType ]
|
|
96
|
+
else
|
|
97
|
+
[
|
|
98
|
+
for i, param in List.indexed allParams do
|
|
99
|
+
if i > 0 then
|
|
100
|
+
yield TextNode.Space
|
|
101
|
+
yield TextNode.Arrow
|
|
102
|
+
yield TextNode.Space
|
|
103
|
+
|
|
104
|
+
yield param.Declaration
|
|
105
|
+
yield TextNode.Space
|
|
106
|
+
yield TextNode.Arrow
|
|
107
|
+
yield TextNode.Space
|
|
108
|
+
yield m.ReturnType
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
let withGetNodes =
|
|
112
|
+
if m.Kind = MemberKind.Property then
|
|
113
|
+
[
|
|
114
|
+
TextNode.Space
|
|
115
|
+
TextNode.Keyword "with"
|
|
116
|
+
TextNode.Space
|
|
117
|
+
TextNode.Keyword "get"
|
|
118
|
+
]
|
|
119
|
+
else
|
|
120
|
+
[]
|
|
121
|
+
|
|
122
|
+
[
|
|
123
|
+
yield TextNode.NewLine
|
|
124
|
+
yield TextNode.Spaces 4
|
|
125
|
+
yield! prefixNodes
|
|
126
|
+
if m.Kind <> MemberKind.Constructor then
|
|
127
|
+
yield TextNode.AnchoredProperty(m.Name, $"#{m.Name}")
|
|
128
|
+
yield TextNode.Space
|
|
129
|
+
yield TextNode.Colon
|
|
130
|
+
yield TextNode.Space
|
|
131
|
+
yield! typeNodes
|
|
132
|
+
yield! withGetNodes
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
let typeHeadNodes (entity: FSharpEntity) =
|
|
136
|
+
let name = entity.DisplayName
|
|
137
|
+
|
|
138
|
+
let genericParams =
|
|
139
|
+
if entity.GenericParameters.Count = 0 then
|
|
140
|
+
[]
|
|
141
|
+
else
|
|
142
|
+
[
|
|
143
|
+
TextNode.LessThan
|
|
144
|
+
for i in 0 .. entity.GenericParameters.Count - 1 do
|
|
145
|
+
let gp = entity.GenericParameters.[i]
|
|
146
|
+
|
|
147
|
+
if i > 0 then
|
|
148
|
+
TextNode.Comma
|
|
149
|
+
TextNode.Space
|
|
150
|
+
|
|
151
|
+
TextNode.Tick
|
|
152
|
+
TextNode.Text gp.DisplayName
|
|
153
|
+
TextNode.GreaterThan
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
[
|
|
157
|
+
TextNode.Keyword "type"
|
|
158
|
+
TextNode.Space
|
|
159
|
+
TextNode.Text name
|
|
160
|
+
yield! genericParams
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
let extractField
|
|
164
|
+
(toUrl: string -> string)
|
|
165
|
+
(docs: Map<string, string>)
|
|
166
|
+
(field: FSharpField)
|
|
167
|
+
: Field
|
|
168
|
+
=
|
|
169
|
+
let typeNode = renderFSharpType toUrl false field.FieldType
|
|
170
|
+
|
|
171
|
+
{
|
|
172
|
+
Name = field.Name
|
|
173
|
+
Type = typeNode
|
|
174
|
+
Declaration =
|
|
175
|
+
TextNode.Node
|
|
176
|
+
[
|
|
177
|
+
TextNode.Text field.Name
|
|
178
|
+
TextNode.Space
|
|
179
|
+
TextNode.Colon
|
|
180
|
+
TextNode.Space
|
|
181
|
+
typeNode
|
|
182
|
+
]
|
|
183
|
+
XmlDoc = xmlDocOf docs field.XmlDocSig
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
let extractUnionCase
|
|
187
|
+
(toUrl: string -> string)
|
|
188
|
+
(docs: Map<string, string>)
|
|
189
|
+
(uc: FSharpUnionCase)
|
|
190
|
+
: UnionCase
|
|
191
|
+
=
|
|
192
|
+
let fields = uc.Fields |> Seq.map (extractField toUrl docs) |> Seq.toList
|
|
193
|
+
|
|
194
|
+
let declaration =
|
|
195
|
+
TextNode.Node
|
|
196
|
+
[
|
|
197
|
+
TextNode.Keyword "|"
|
|
198
|
+
TextNode.Space
|
|
199
|
+
TextNode.Text uc.Name
|
|
200
|
+
if not fields.IsEmpty then
|
|
201
|
+
TextNode.Keyword " of"
|
|
202
|
+
TextNode.Space
|
|
203
|
+
yield! caseFieldNodes fields
|
|
204
|
+
]
|
|
205
|
+
|
|
206
|
+
{
|
|
207
|
+
Name = uc.Name
|
|
208
|
+
FullName = uc.FullName
|
|
209
|
+
Fields = fields
|
|
210
|
+
XmlDoc = xmlDocOf docs uc.XmlDocSig
|
|
211
|
+
Declaration = declaration
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
let extractEntity
|
|
215
|
+
(toUrl: string -> string)
|
|
216
|
+
(docs: Map<string, string>)
|
|
217
|
+
(entity: FSharpEntity)
|
|
218
|
+
: Entity
|
|
219
|
+
=
|
|
220
|
+
let name = entity.DisplayName
|
|
221
|
+
let fullName = safeFullName entity
|
|
222
|
+
let xmlDoc = xmlDocOf docs entity.XmlDocSig
|
|
223
|
+
let obsoleteInfo = obsoleteOfEntity entity
|
|
224
|
+
|
|
225
|
+
let members () =
|
|
226
|
+
let ms =
|
|
227
|
+
entity.MembersFunctionsAndValues
|
|
228
|
+
|> Seq.filter (fun m ->
|
|
229
|
+
not m.IsCompilerGenerated
|
|
230
|
+
&& not (entity.IsFSharpUnion && m.IsUnionCaseTester)
|
|
231
|
+
&& not m.IsPropertyGetterMethod
|
|
232
|
+
&& not m.IsPropertySetterMethod
|
|
233
|
+
)
|
|
234
|
+
|> Seq.map (extractMember toUrl docs)
|
|
235
|
+
|> Seq.sortBy (fun m ->
|
|
236
|
+
match m.Kind, m.IsStatic with
|
|
237
|
+
| MemberKind.Constructor, _ -> 0
|
|
238
|
+
| MemberKind.Method, false -> 1
|
|
239
|
+
| MemberKind.Property, false -> 2
|
|
240
|
+
| MemberKind.Method, true -> 3
|
|
241
|
+
| MemberKind.Property, true -> 4
|
|
242
|
+
| MemberKind.Operator, _ -> 5
|
|
243
|
+
)
|
|
244
|
+
|> Seq.toList
|
|
245
|
+
|
|
246
|
+
// When there are multiple constructors they all start as Name = "new".
|
|
247
|
+
// Assign unique anchor ids: first stays "new", subsequent get "new-1", "new-2", …
|
|
248
|
+
let ctorCount =
|
|
249
|
+
ms |> List.filter (fun m -> m.Kind = MemberKind.Constructor) |> List.length
|
|
250
|
+
|
|
251
|
+
if ctorCount <= 1 then
|
|
252
|
+
ms
|
|
253
|
+
else
|
|
254
|
+
ms
|
|
255
|
+
|> List.mapFold
|
|
256
|
+
(fun ctorIdx m ->
|
|
257
|
+
if m.Kind = MemberKind.Constructor then
|
|
258
|
+
let name =
|
|
259
|
+
if ctorIdx = 0 then
|
|
260
|
+
"new"
|
|
261
|
+
else
|
|
262
|
+
$"new-{ctorIdx}"
|
|
263
|
+
|
|
264
|
+
{ m with
|
|
265
|
+
Name = name
|
|
266
|
+
},
|
|
267
|
+
ctorIdx + 1
|
|
268
|
+
else
|
|
269
|
+
m, ctorIdx
|
|
270
|
+
)
|
|
271
|
+
0
|
|
272
|
+
|> fst
|
|
273
|
+
|
|
274
|
+
let isStruct = isStruct entity
|
|
275
|
+
|
|
276
|
+
if isMeasure entity then
|
|
277
|
+
let declaration =
|
|
278
|
+
TextNode.Node
|
|
279
|
+
[
|
|
280
|
+
TextNode.OpenTagWithClass("span", "fsharp-doc-attr")
|
|
281
|
+
TextNode.Text "[<Measure>]"
|
|
282
|
+
TextNode.CloseTag "span"
|
|
283
|
+
TextNode.NewLine
|
|
284
|
+
yield! typeHeadNodes entity
|
|
285
|
+
]
|
|
286
|
+
|
|
287
|
+
Entity.Measure
|
|
288
|
+
{
|
|
289
|
+
Name = name
|
|
290
|
+
FullName = fullName
|
|
291
|
+
XmlDoc = xmlDoc
|
|
292
|
+
Declaration = declaration
|
|
293
|
+
ObsoleteInfo = obsoleteInfo
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
elif entity.IsFSharpExceptionDeclaration then
|
|
297
|
+
let fields = entity.FSharpFields |> Seq.map (extractField toUrl docs) |> Seq.toList
|
|
298
|
+
|
|
299
|
+
let fieldNodes =
|
|
300
|
+
fields
|
|
301
|
+
|> List.mapi (fun i f ->
|
|
302
|
+
let separator =
|
|
303
|
+
if i = 0 then
|
|
304
|
+
[]
|
|
305
|
+
else
|
|
306
|
+
[ TextNode.Space; TextNode.Star; TextNode.Space ]
|
|
307
|
+
|
|
308
|
+
if f.Name = "" then
|
|
309
|
+
separator @ [ f.Type ]
|
|
310
|
+
else
|
|
311
|
+
separator
|
|
312
|
+
@ [
|
|
313
|
+
TextNode.Text f.Name
|
|
314
|
+
TextNode.Colon
|
|
315
|
+
TextNode.Space
|
|
316
|
+
f.Type
|
|
317
|
+
]
|
|
318
|
+
)
|
|
319
|
+
|> List.concat
|
|
320
|
+
|
|
321
|
+
let declaration =
|
|
322
|
+
TextNode.Node
|
|
323
|
+
[
|
|
324
|
+
TextNode.Keyword "exception"
|
|
325
|
+
TextNode.Space
|
|
326
|
+
TextNode.Text name
|
|
327
|
+
if not fields.IsEmpty then
|
|
328
|
+
TextNode.Keyword " of"
|
|
329
|
+
TextNode.Space
|
|
330
|
+
yield! fieldNodes
|
|
331
|
+
]
|
|
332
|
+
|
|
333
|
+
Entity.Exception
|
|
334
|
+
{
|
|
335
|
+
Name = name
|
|
336
|
+
FullName = fullName
|
|
337
|
+
XmlDoc = xmlDoc
|
|
338
|
+
Fields = fields
|
|
339
|
+
Declaration = declaration
|
|
340
|
+
ObsoleteInfo = obsoleteInfo
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
elif entity.IsDelegate then
|
|
344
|
+
let invokeMethod =
|
|
345
|
+
entity.MembersFunctionsAndValues
|
|
346
|
+
|> Seq.tryFind (fun m -> m.LogicalName = "Invoke")
|
|
347
|
+
|
|
348
|
+
let signature =
|
|
349
|
+
match invokeMethod with
|
|
350
|
+
| Some m ->
|
|
351
|
+
let parameters = m.CurriedParameterGroups |> Seq.toList
|
|
352
|
+
|
|
353
|
+
let paramNodes =
|
|
354
|
+
parameters
|
|
355
|
+
|> List.collect (fun group ->
|
|
356
|
+
group
|
|
357
|
+
|> Seq.map (fun p ->
|
|
358
|
+
renderFSharpType toUrl false p.Type
|
|
359
|
+
)
|
|
360
|
+
|> Seq.toList
|
|
361
|
+
)
|
|
362
|
+
|> List.mapi (fun i t ->
|
|
363
|
+
if i = 0 then
|
|
364
|
+
[ t ]
|
|
365
|
+
else
|
|
366
|
+
[ TextNode.Space; TextNode.Star; TextNode.Space; t ]
|
|
367
|
+
)
|
|
368
|
+
|> List.concat
|
|
369
|
+
|
|
370
|
+
let returnNode = renderFSharpType toUrl false m.ReturnParameter.Type
|
|
371
|
+
|
|
372
|
+
TextNode.Node
|
|
373
|
+
[
|
|
374
|
+
TextNode.Keyword "delegate"
|
|
375
|
+
TextNode.Space
|
|
376
|
+
TextNode.Keyword "of"
|
|
377
|
+
TextNode.Space
|
|
378
|
+
yield! paramNodes
|
|
379
|
+
TextNode.Space
|
|
380
|
+
TextNode.Arrow
|
|
381
|
+
TextNode.Space
|
|
382
|
+
returnNode
|
|
383
|
+
]
|
|
384
|
+
| None -> TextNode.Text "delegate"
|
|
385
|
+
|
|
386
|
+
let declaration =
|
|
387
|
+
TextNode.Node
|
|
388
|
+
[
|
|
389
|
+
yield! typeHeadNodes entity
|
|
390
|
+
TextNode.Space
|
|
391
|
+
TextNode.Equal
|
|
392
|
+
TextNode.Space
|
|
393
|
+
signature
|
|
394
|
+
]
|
|
395
|
+
|
|
396
|
+
Entity.Delegate
|
|
397
|
+
{
|
|
398
|
+
Name = name
|
|
399
|
+
FullName = fullName
|
|
400
|
+
XmlDoc = xmlDoc
|
|
401
|
+
Signature = signature
|
|
402
|
+
Declaration = declaration
|
|
403
|
+
ObsoleteInfo = obsoleteInfo
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
elif entity.IsFSharpUnion then
|
|
407
|
+
let cases = entity.UnionCases |> Seq.map (extractUnionCase toUrl docs) |> Seq.toList
|
|
408
|
+
let ms = members ()
|
|
409
|
+
|
|
410
|
+
let caseNodes =
|
|
411
|
+
cases
|
|
412
|
+
|> List.collect (fun case ->
|
|
413
|
+
[
|
|
414
|
+
TextNode.NewLine
|
|
415
|
+
TextNode.Spaces 4
|
|
416
|
+
TextNode.Keyword "|"
|
|
417
|
+
TextNode.Space
|
|
418
|
+
TextNode.Anchor(case.Name, $"#{case.Name}")
|
|
419
|
+
if not case.Fields.IsEmpty then
|
|
420
|
+
TextNode.Keyword " of"
|
|
421
|
+
TextNode.Space
|
|
422
|
+
yield! caseFieldNodes case.Fields
|
|
423
|
+
]
|
|
424
|
+
)
|
|
425
|
+
|
|
426
|
+
let declaration =
|
|
427
|
+
TextNode.Node
|
|
428
|
+
[
|
|
429
|
+
if isStruct then
|
|
430
|
+
TextNode.OpenTagWithClass("span", "fsharp-doc-attr")
|
|
431
|
+
TextNode.Text "[<Struct>]"
|
|
432
|
+
TextNode.CloseTag "span"
|
|
433
|
+
TextNode.NewLine
|
|
434
|
+
yield! typeHeadNodes entity
|
|
435
|
+
TextNode.Space
|
|
436
|
+
TextNode.Equal
|
|
437
|
+
yield! caseNodes
|
|
438
|
+
yield! (ms |> List.collect memberDeclarationLine)
|
|
439
|
+
]
|
|
440
|
+
|
|
441
|
+
Entity.Union
|
|
442
|
+
{
|
|
443
|
+
Name = name
|
|
444
|
+
FullName = fullName
|
|
445
|
+
XmlDoc = xmlDoc
|
|
446
|
+
Cases = cases
|
|
447
|
+
Members = ms
|
|
448
|
+
Declaration = declaration
|
|
449
|
+
ObsoleteInfo = obsoleteInfo
|
|
450
|
+
IsStruct = isStruct
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
elif entity.IsFSharpRecord then
|
|
454
|
+
let fields = entity.FSharpFields |> Seq.map (extractField toUrl docs) |> Seq.toList
|
|
455
|
+
let ms = members ()
|
|
456
|
+
|
|
457
|
+
let fieldNodes =
|
|
458
|
+
fields
|
|
459
|
+
|> List.collect (fun f ->
|
|
460
|
+
[
|
|
461
|
+
TextNode.NewLine
|
|
462
|
+
TextNode.Spaces 8
|
|
463
|
+
TextNode.AnchoredProperty(f.Name, $"#{f.Name}")
|
|
464
|
+
TextNode.Space
|
|
465
|
+
TextNode.Colon
|
|
466
|
+
TextNode.Space
|
|
467
|
+
f.Type
|
|
468
|
+
]
|
|
469
|
+
)
|
|
470
|
+
|
|
471
|
+
let declaration =
|
|
472
|
+
TextNode.Node
|
|
473
|
+
[
|
|
474
|
+
if isStruct then
|
|
475
|
+
TextNode.OpenTagWithClass("span", "fsharp-doc-attr")
|
|
476
|
+
TextNode.Text "[<Struct>]"
|
|
477
|
+
TextNode.CloseTag "span"
|
|
478
|
+
TextNode.NewLine
|
|
479
|
+
yield! typeHeadNodes entity
|
|
480
|
+
TextNode.Space
|
|
481
|
+
TextNode.Equal
|
|
482
|
+
TextNode.NewLine
|
|
483
|
+
TextNode.Spaces 4
|
|
484
|
+
TextNode.LeftBrace
|
|
485
|
+
yield! fieldNodes
|
|
486
|
+
TextNode.NewLine
|
|
487
|
+
TextNode.Spaces 4
|
|
488
|
+
TextNode.RightBrace
|
|
489
|
+
yield! (ms |> List.collect memberDeclarationLine)
|
|
490
|
+
]
|
|
491
|
+
|
|
492
|
+
Entity.Record
|
|
493
|
+
{
|
|
494
|
+
Name = name
|
|
495
|
+
FullName = fullName
|
|
496
|
+
XmlDoc = xmlDoc
|
|
497
|
+
Fields = fields
|
|
498
|
+
Members = ms
|
|
499
|
+
Declaration = declaration
|
|
500
|
+
ObsoleteInfo = obsoleteInfo
|
|
501
|
+
IsStruct = isStruct
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
elif entity.IsEnum then
|
|
505
|
+
let fields = entity.FSharpFields |> Seq.map (extractField toUrl docs) |> Seq.toList
|
|
506
|
+
|
|
507
|
+
let caseNodes =
|
|
508
|
+
fields
|
|
509
|
+
|> List.collect (fun f ->
|
|
510
|
+
[
|
|
511
|
+
TextNode.NewLine
|
|
512
|
+
TextNode.Spaces 4
|
|
513
|
+
TextNode.Keyword "|"
|
|
514
|
+
TextNode.Space
|
|
515
|
+
TextNode.Text f.Name
|
|
516
|
+
]
|
|
517
|
+
)
|
|
518
|
+
|
|
519
|
+
let declaration =
|
|
520
|
+
TextNode.Node
|
|
521
|
+
[
|
|
522
|
+
yield! typeHeadNodes entity
|
|
523
|
+
TextNode.Space
|
|
524
|
+
TextNode.Equal
|
|
525
|
+
yield! caseNodes
|
|
526
|
+
]
|
|
527
|
+
|
|
528
|
+
Entity.Enum
|
|
529
|
+
{
|
|
530
|
+
Name = name
|
|
531
|
+
FullName = fullName
|
|
532
|
+
XmlDoc = xmlDoc
|
|
533
|
+
Fields = fields
|
|
534
|
+
Declaration = declaration
|
|
535
|
+
ObsoleteInfo = obsoleteInfo
|
|
536
|
+
IsStruct = isStruct
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
elif entity.IsFSharpAbbreviation then
|
|
540
|
+
let signature = renderFSharpType toUrl false entity.AbbreviatedType
|
|
541
|
+
|
|
542
|
+
let declaration =
|
|
543
|
+
TextNode.Node
|
|
544
|
+
[
|
|
545
|
+
yield! typeHeadNodes entity
|
|
546
|
+
TextNode.Space
|
|
547
|
+
TextNode.Equal
|
|
548
|
+
TextNode.Space
|
|
549
|
+
signature
|
|
550
|
+
]
|
|
551
|
+
|
|
552
|
+
Entity.Abbrev
|
|
553
|
+
{
|
|
554
|
+
Name = name
|
|
555
|
+
FullName = fullName
|
|
556
|
+
XmlDoc = xmlDoc
|
|
557
|
+
Signature = signature
|
|
558
|
+
Declaration = declaration
|
|
559
|
+
ObsoleteInfo = obsoleteInfo
|
|
560
|
+
IsStruct = isStruct
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
elif entity.IsInterface then
|
|
564
|
+
let ms = members ()
|
|
565
|
+
|
|
566
|
+
let declaration =
|
|
567
|
+
TextNode.Node
|
|
568
|
+
[
|
|
569
|
+
yield! typeHeadNodes entity
|
|
570
|
+
yield! (ms |> List.collect memberDeclarationLine)
|
|
571
|
+
]
|
|
572
|
+
|
|
573
|
+
Entity.Interface
|
|
574
|
+
{
|
|
575
|
+
Name = name
|
|
576
|
+
FullName = fullName
|
|
577
|
+
XmlDoc = xmlDoc
|
|
578
|
+
Members = ms
|
|
579
|
+
Declaration = declaration
|
|
580
|
+
ObsoleteInfo = obsoleteInfo
|
|
581
|
+
IsStruct = isStruct
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
else
|
|
585
|
+
let ms = members ()
|
|
586
|
+
|
|
587
|
+
let declaration =
|
|
588
|
+
TextNode.Node
|
|
589
|
+
[
|
|
590
|
+
if isStruct then
|
|
591
|
+
TextNode.OpenTagWithClass("span", "fsharp-doc-attr")
|
|
592
|
+
TextNode.Text "[<Struct>]"
|
|
593
|
+
TextNode.CloseTag "span"
|
|
594
|
+
TextNode.NewLine
|
|
595
|
+
yield! typeHeadNodes entity
|
|
596
|
+
yield! (ms |> List.collect memberDeclarationLine)
|
|
597
|
+
]
|
|
598
|
+
|
|
599
|
+
Entity.Class
|
|
600
|
+
{
|
|
601
|
+
Name = name
|
|
602
|
+
FullName = fullName
|
|
603
|
+
XmlDoc = xmlDoc
|
|
604
|
+
Members = ms
|
|
605
|
+
Declaration = declaration
|
|
606
|
+
ObsoleteInfo = obsoleteInfo
|
|
607
|
+
IsStruct = isStruct
|
|
608
|
+
}
|