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.
Files changed (89) hide show
  1. package/Directory.Build.props +25 -0
  2. package/Directory.Packages.props +18 -0
  3. package/README.md +80 -0
  4. package/dist/Extensions/StringBuilder.js +28 -0
  5. package/dist/Extensions/TextNode.js +115 -0
  6. package/dist/FSharp.Oracle.Schema/Schema.js +674 -0
  7. package/dist/Generate.js +254 -0
  8. package/dist/Helpers.js +69 -0
  9. package/dist/Plugin.js +139 -0
  10. package/dist/Render/Documentation.js +87 -0
  11. package/dist/Render/Entries.js +148 -0
  12. package/dist/Render/Pages.js +292 -0
  13. package/dist/Render/Primitives.js +114 -0
  14. package/dist/Render/Types.js +30 -0
  15. package/dist/Render.js +12 -0
  16. package/dist/Themes.js +78 -0
  17. package/oracle-bin/FSharp.Compiler.Service.dll +0 -0
  18. package/oracle-bin/FSharp.Core.dll +0 -0
  19. package/oracle-bin/FSharp.DependencyManager.Nuget.dll +0 -0
  20. package/oracle-bin/FSharp.Oracle.Schema.dll +0 -0
  21. package/oracle-bin/FSharp.Oracle.Schema.pdb +0 -0
  22. package/oracle-bin/FSharp.Oracle.Schema.xml +219 -0
  23. package/oracle-bin/Fable.Core.dll +0 -0
  24. package/oracle-bin/Oracle +0 -0
  25. package/oracle-bin/Oracle.deps.json +280 -0
  26. package/oracle-bin/Oracle.dll +0 -0
  27. package/oracle-bin/Oracle.pdb +0 -0
  28. package/oracle-bin/Oracle.runtimeconfig.json +13 -0
  29. package/oracle-bin/Oracle.xml +111 -0
  30. package/oracle-bin/Thoth.Json.Core.Auto.dll +0 -0
  31. package/oracle-bin/Thoth.Json.Core.dll +0 -0
  32. package/oracle-bin/Thoth.Json.System.Text.Json.dll +0 -0
  33. package/oracle-bin/cs/FSharp.Compiler.Service.resources.dll +0 -0
  34. package/oracle-bin/cs/FSharp.Core.resources.dll +0 -0
  35. package/oracle-bin/cs/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  36. package/oracle-bin/de/FSharp.Compiler.Service.resources.dll +0 -0
  37. package/oracle-bin/de/FSharp.Core.resources.dll +0 -0
  38. package/oracle-bin/de/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  39. package/oracle-bin/es/FSharp.Compiler.Service.resources.dll +0 -0
  40. package/oracle-bin/es/FSharp.Core.resources.dll +0 -0
  41. package/oracle-bin/es/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  42. package/oracle-bin/fr/FSharp.Compiler.Service.resources.dll +0 -0
  43. package/oracle-bin/fr/FSharp.Core.resources.dll +0 -0
  44. package/oracle-bin/fr/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  45. package/oracle-bin/it/FSharp.Compiler.Service.resources.dll +0 -0
  46. package/oracle-bin/it/FSharp.Core.resources.dll +0 -0
  47. package/oracle-bin/it/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  48. package/oracle-bin/ja/FSharp.Compiler.Service.resources.dll +0 -0
  49. package/oracle-bin/ja/FSharp.Core.resources.dll +0 -0
  50. package/oracle-bin/ja/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  51. package/oracle-bin/ko/FSharp.Compiler.Service.resources.dll +0 -0
  52. package/oracle-bin/ko/FSharp.Core.resources.dll +0 -0
  53. package/oracle-bin/ko/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  54. package/oracle-bin/pl/FSharp.Compiler.Service.resources.dll +0 -0
  55. package/oracle-bin/pl/FSharp.Core.resources.dll +0 -0
  56. package/oracle-bin/pl/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  57. package/oracle-bin/pt-BR/FSharp.Compiler.Service.resources.dll +0 -0
  58. package/oracle-bin/pt-BR/FSharp.Core.resources.dll +0 -0
  59. package/oracle-bin/pt-BR/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  60. package/oracle-bin/ru/FSharp.Compiler.Service.resources.dll +0 -0
  61. package/oracle-bin/ru/FSharp.Core.resources.dll +0 -0
  62. package/oracle-bin/ru/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  63. package/oracle-bin/tr/FSharp.Compiler.Service.resources.dll +0 -0
  64. package/oracle-bin/tr/FSharp.Core.resources.dll +0 -0
  65. package/oracle-bin/tr/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  66. package/oracle-bin/zh-Hans/FSharp.Compiler.Service.resources.dll +0 -0
  67. package/oracle-bin/zh-Hans/FSharp.Core.resources.dll +0 -0
  68. package/oracle-bin/zh-Hans/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  69. package/oracle-bin/zh-Hant/FSharp.Compiler.Service.resources.dll +0 -0
  70. package/oracle-bin/zh-Hant/FSharp.Core.resources.dll +0 -0
  71. package/oracle-bin/zh-Hant/FSharp.DependencyManager.Nuget.resources.dll +0 -0
  72. package/package.json +38 -0
  73. package/packages/FSharp.Oracle/Extractor/Assembly.fs +160 -0
  74. package/packages/FSharp.Oracle/Extractor/EntityExtractor.fs +608 -0
  75. package/packages/FSharp.Oracle/Extractor/Helpers.fs +150 -0
  76. package/packages/FSharp.Oracle/Extractor/MemberExtractor.fs +172 -0
  77. package/packages/FSharp.Oracle/Extractor/ModuleExtractor.fs +45 -0
  78. package/packages/FSharp.Oracle/Extractor/ParameterExtractor.fs +47 -0
  79. package/packages/FSharp.Oracle/Extractor/SignatureRendering.fs +464 -0
  80. package/packages/FSharp.Oracle/Extractor/ValueExtractor.fs +171 -0
  81. package/packages/FSharp.Oracle/FSharp.Oracle.fsproj +36 -0
  82. package/packages/FSharp.Oracle/Program.fs +66 -0
  83. package/packages/FSharp.Oracle/XmlDoc.fs +463 -0
  84. package/packages/FSharp.Oracle.Schema/FSharp.Oracle.Schema.fsproj +16 -0
  85. package/packages/FSharp.Oracle.Schema/Schema.fs +454 -0
  86. package/packages/Starlight.FSharp.Oracle/components/DocEntry.astro +256 -0
  87. package/packages/Starlight.FSharp.Oracle/components/FSharpDocPage.astro +121 -0
  88. package/packages/Starlight.FSharp.Oracle/components/fsharp-doc.css +58 -0
  89. 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
+ }