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,111 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<doc>
|
|
3
|
+
<assembly><name>Oracle</name></assembly>
|
|
4
|
+
<members>
|
|
5
|
+
<member name="M:Oracle.XmlDoc.moduleDocOf(Microsoft.FSharp.Collections.FSharpMap{System.String,System.String},System.String)">
|
|
6
|
+
<summary>
|
|
7
|
+
Look up just the summary for a module-level signature.
|
|
8
|
+
Used for Module.XmlDoc which is stored as a plain string in the IR.
|
|
9
|
+
</summary>
|
|
10
|
+
</member>
|
|
11
|
+
<member name="M:Oracle.XmlDoc.xmlDocOf(Microsoft.FSharp.Collections.FSharpMap{System.String,System.String},System.String)">
|
|
12
|
+
<summary>
|
|
13
|
+
Look up and parse the XML doc for a given member signature.
|
|
14
|
+
Returns an empty XmlDoc when the signature is not found in the map.
|
|
15
|
+
</summary>
|
|
16
|
+
</member>
|
|
17
|
+
<member name="M:Oracle.XmlDoc.loadXmlDocFile(System.String)">
|
|
18
|
+
<summary>
|
|
19
|
+
Load the XML documentation file that lives next to a compiled DLL and
|
|
20
|
+
return a lookup map from the standard XML-doc member ID (e.g.
|
|
21
|
+
"M:My.Namespace.func(System.Int32)") to the inner XML content of that
|
|
22
|
+
<member> element.
|
|
23
|
+
</summary>
|
|
24
|
+
</member>
|
|
25
|
+
<member name="M:Oracle.XmlDoc.fixXmlAttributeChars(System.String)">
|
|
26
|
+
<summary>
|
|
27
|
+
Escape `<` and `>` characters that appear inside XML attribute values.
|
|
28
|
+
The F# compiler sometimes generates invalid XML for anonymous record
|
|
29
|
+
type signatures (e.g. `name="M:Foo(<>f__AnonymousType...)`).
|
|
30
|
+
</summary>
|
|
31
|
+
</member>
|
|
32
|
+
<member name="M:Oracle.XmlDoc.parseXmlContent(System.String)">
|
|
33
|
+
<summary>
|
|
34
|
+
Parse the inner XML content of a <member> element into the structured
|
|
35
|
+
XmlDoc IR type, with all inline tags converted to Markdown.
|
|
36
|
+
</summary>
|
|
37
|
+
</member>
|
|
38
|
+
<member name="M:FSharp.Oracle.Helpers.resolveCref(Microsoft.FSharp.Core.FSharpFunc{System.String,System.String},System.String)">
|
|
39
|
+
<summary>
|
|
40
|
+
Resolves XML-doc <see cref="..."/> strings to page URLs.
|
|
41
|
+
cref format: T:Namespace.Type or M:Namespace.Type.Member(...)
|
|
42
|
+
</summary>
|
|
43
|
+
</member>
|
|
44
|
+
<member name="P:FSharp.Oracle.Helpers.postfixTypeNames">
|
|
45
|
+
<summary>
|
|
46
|
+
Full names for types that conventionally use postfix syntax in F#.
|
|
47
|
+
</summary>
|
|
48
|
+
</member>
|
|
49
|
+
<member name="P:FSharp.Oracle.Helpers.postfixTypeDisplayNames">
|
|
50
|
+
<summary>
|
|
51
|
+
Display names for types that conventionally use postfix syntax in F#.
|
|
52
|
+
</summary>
|
|
53
|
+
</member>
|
|
54
|
+
<member name="M:FSharp.Oracle.Helpers.isSrtp(FSharp.Compiler.Symbols.FSharpGenericParameter)">
|
|
55
|
+
<summary>
|
|
56
|
+
True for SRTP parameters (have member/static-member constraints).
|
|
57
|
+
</summary>
|
|
58
|
+
</member>
|
|
59
|
+
<member name="M:FSharp.Oracle.Helpers.safeFullName(FSharp.Compiler.Symbols.FSharpEntity)">
|
|
60
|
+
<summary>
|
|
61
|
+
Compute a safe FullName for any entity.
|
|
62
|
+
Type abbreviations for primitives (e.g. `type Meters = float`) throw on FullName;
|
|
63
|
+
fall back to constructing it from Namespace + DisplayName.
|
|
64
|
+
</summary>
|
|
65
|
+
</member>
|
|
66
|
+
<member name="M:FSharp.Oracle.Helpers.tryGetFullName(FSharp.Compiler.Symbols.FSharpEntity)">
|
|
67
|
+
<summary>
|
|
68
|
+
Try to get FullName from a FSharpEntity; returns None for primitives
|
|
69
|
+
like 'string', 'int' that are F# type abbreviations with no qualified name.
|
|
70
|
+
</summary>
|
|
71
|
+
</member>
|
|
72
|
+
<member name="M:FSharp.Oracle.Helpers.namespaceOf(System.String)">
|
|
73
|
+
<summary>
|
|
74
|
+
Returns everything before the last dot, e.g. "A.B.C" → "A.B".
|
|
75
|
+
Returns "" for unqualified names.
|
|
76
|
+
</summary>
|
|
77
|
+
</member>
|
|
78
|
+
<member name="M:FSharp.Oracle.SignatureRendering.stripGenericParamBrackets(Microsoft.FSharp.Core.FSharpOption{FSharp.Oracle.Schema.TextNode})">
|
|
79
|
+
<summary>
|
|
80
|
+
Strip `<`, `>` and the leading type variable from a generic-parameter list,
|
|
81
|
+
returning only the constraint clause (e.g. ` when 'T : comparison`).
|
|
82
|
+
Used to append constraints after a value/member signature.
|
|
83
|
+
</summary>
|
|
84
|
+
</member>
|
|
85
|
+
<member name="M:FSharp.Oracle.SignatureRendering.renderGenericParams(Microsoft.FSharp.Core.FSharpFunc{System.String,System.String},System.Collections.Generic.IEnumerable{FSharp.Compiler.Symbols.FSharpGenericParameter})">
|
|
86
|
+
<summary>
|
|
87
|
+
Render the generic-parameter list for a function or member, e.g.
|
|
88
|
+
`<'T when 'T : comparison>` or `<^T when ^T : (static member (+) : ^T * ^T -> ^T)>`.
|
|
89
|
+
Returns `None` when there are no parameters.
|
|
90
|
+
</summary>
|
|
91
|
+
</member>
|
|
92
|
+
<member name="M:FSharp.Oracle.SignatureRendering.renderConstraint(Microsoft.FSharp.Core.FSharpFunc{System.String,System.String},FSharp.Compiler.Symbols.FSharpGenericParameter,FSharp.Compiler.Symbols.FSharpGenericParameterConstraint)">
|
|
93
|
+
<summary>
|
|
94
|
+
Render a single generic parameter constraint as a TextNode list.
|
|
95
|
+
</summary>
|
|
96
|
+
</member>
|
|
97
|
+
<member name="M:FSharp.Oracle.MemberExtractor.buildMemberDeclaration(FSharp.Oracle.Schema.MemberKind,System.String,System.Boolean,System.Boolean,Microsoft.FSharp.Collections.FSharpList{Microsoft.FSharp.Collections.FSharpList{FSharp.Oracle.Schema.Parameter}},FSharp.Oracle.Schema.TextNode,FSharp.Oracle.Schema.TextNode)">
|
|
98
|
+
<summary>
|
|
99
|
+
Builds the signature TextNode for the per-member DocEntry slot (no anchors, no indentation).
|
|
100
|
+
This is the pre-computed Declaration stored on Member.
|
|
101
|
+
</summary>
|
|
102
|
+
</member>
|
|
103
|
+
<member name="M:FSharp.Oracle.Extractor.extractAssembly(FSharp.Compiler.CodeAnalysis.FSharpChecker,System.String[],System.String,System.String)">
|
|
104
|
+
<summary>
|
|
105
|
+
Extract the JSON IR for a single compiled .dll + optional .xml doc file.
|
|
106
|
+
The checker must have already been created with [allDllPaths] as references
|
|
107
|
+
so cross-assembly resolution works.
|
|
108
|
+
</summary>
|
|
109
|
+
</member>
|
|
110
|
+
</members>
|
|
111
|
+
</doc>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "starlight-fsharp-oracle",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./dist/Plugin.js",
|
|
7
|
+
"./components/DocEntry.astro": "./packages/Starlight.FSharp.Oracle/components/DocEntry.astro",
|
|
8
|
+
"./components/FSharpDocPage.astro": "./packages/Starlight.FSharp.Oracle/components/FSharpDocPage.astro",
|
|
9
|
+
"./layouts/FSharpDocLayout.astro": "./packages/Starlight.FSharp.Oracle/layouts/FSharpDocLayout.astro"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/**/*",
|
|
13
|
+
"oracle-bin/",
|
|
14
|
+
"packages/FSharp.Oracle/**/*.fs",
|
|
15
|
+
"!packages/FSharp.Oracle/obj",
|
|
16
|
+
"packages/FSharp.Oracle/*.fsproj",
|
|
17
|
+
"packages/FSharp.Oracle.Schema/**/*.fs",
|
|
18
|
+
"!packages/FSharp.Oracle.Schema/obj",
|
|
19
|
+
"packages/FSharp.Oracle.Schema/*.fsproj",
|
|
20
|
+
"packages/Starlight.FSharp.Oracle/components/",
|
|
21
|
+
"packages/Starlight.FSharp.Oracle/layouts/",
|
|
22
|
+
"Directory.Build.props",
|
|
23
|
+
"Directory.Packages.props"
|
|
24
|
+
],
|
|
25
|
+
"scripts": {
|
|
26
|
+
"postinstall": "dotnet publish packages/FSharp.Oracle/FSharp.Oracle.fsproj -c Release --nologo -o oracle-bin"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@astrojs/starlight": ">= 0.38.0",
|
|
30
|
+
"astro-expressive-code": ">= 0.38.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@hideoo/tsconfig": "^2.0.3",
|
|
34
|
+
"@types/node": "^25.6.0",
|
|
35
|
+
"astro-expressive-code": "^0.41.7",
|
|
36
|
+
"typescript": "^5.8.0"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
module FSharp.Oracle.Extractor
|
|
2
|
+
|
|
3
|
+
open FSharp.Compiler.CodeAnalysis
|
|
4
|
+
open FSharp.Compiler.Symbols
|
|
5
|
+
open FSharp.Oracle.Schema
|
|
6
|
+
open Oracle.XmlDoc
|
|
7
|
+
open FSharp.Oracle.Helpers
|
|
8
|
+
open FSharp.Oracle.EntityExtractor
|
|
9
|
+
open FSharp.Oracle.ModuleExtractor
|
|
10
|
+
|
|
11
|
+
// ---------------------------------------------------------------------------
|
|
12
|
+
// Public entry point
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
|
|
15
|
+
/// Extract the JSON IR for a single compiled .dll + optional .xml doc file.
|
|
16
|
+
/// The checker must have already been created with [allDllPaths] as references
|
|
17
|
+
/// so cross-assembly resolution works.
|
|
18
|
+
let extractAssembly
|
|
19
|
+
(checker: FSharpChecker)
|
|
20
|
+
(allDllPaths: string array)
|
|
21
|
+
(outputBase: string)
|
|
22
|
+
(dllPath: string)
|
|
23
|
+
: Assembly
|
|
24
|
+
=
|
|
25
|
+
let toSlug (name: string) =
|
|
26
|
+
let sanitized = name.ToLowerInvariant().Replace(".", "-")
|
|
27
|
+
// Strip F# generic arity suffix (e.g. Tree`1 -> tree)
|
|
28
|
+
System.Text.RegularExpressions.Regex.Replace(sanitized, @"`\d+$", "")
|
|
29
|
+
|
|
30
|
+
let toUrl (fullName: string) = $"/{outputBase}/{toSlug fullName}"
|
|
31
|
+
|
|
32
|
+
let baseOptions, _ =
|
|
33
|
+
checker.GetProjectOptionsFromScript(
|
|
34
|
+
"dummy.fsx",
|
|
35
|
+
FSharp.Compiler.Text.SourceText.ofString ""
|
|
36
|
+
)
|
|
37
|
+
|> Async.RunSynchronously
|
|
38
|
+
|
|
39
|
+
// Reference every DLL so FCS can resolve cross-assembly dependencies.
|
|
40
|
+
let projectOptions =
|
|
41
|
+
{ baseOptions with
|
|
42
|
+
OtherOptions =
|
|
43
|
+
[|
|
|
44
|
+
yield! baseOptions.OtherOptions
|
|
45
|
+
for path in allDllPaths do
|
|
46
|
+
$"-r:{path}"
|
|
47
|
+
|]
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Load the assembly via FCS reflection
|
|
51
|
+
let fsharpAssembly =
|
|
52
|
+
checker.ParseAndCheckProject(projectOptions)
|
|
53
|
+
|> Async.RunSynchronously
|
|
54
|
+
// Walk the resolved assemblies to find the target dll
|
|
55
|
+
|> fun results ->
|
|
56
|
+
let targetName = System.IO.Path.GetFileNameWithoutExtension(dllPath)
|
|
57
|
+
|
|
58
|
+
results.ProjectContext.GetReferencedAssemblies()
|
|
59
|
+
|> List.tryFind (fun a -> a.SimpleName = targetName)
|
|
60
|
+
|
|
61
|
+
match fsharpAssembly with
|
|
62
|
+
| None -> failwithf "Could not load assembly: %s" dllPath
|
|
63
|
+
| Some asm ->
|
|
64
|
+
let docs = loadXmlDocFile dllPath
|
|
65
|
+
|
|
66
|
+
// Recursively collect a module and all its nested sub-modules as
|
|
67
|
+
// separate pages (each sub-module becomes its own page).
|
|
68
|
+
let rec collectModulePages (entity: FSharpEntity) : Module list =
|
|
69
|
+
let thisPage = extractModule toUrl docs entity
|
|
70
|
+
|
|
71
|
+
let subPages =
|
|
72
|
+
entity.NestedEntities
|
|
73
|
+
|> Seq.filter (fun e -> e.IsFSharpModule)
|
|
74
|
+
|> Seq.collect collectModulePages
|
|
75
|
+
|> Seq.toList
|
|
76
|
+
|
|
77
|
+
thisPage :: subPages
|
|
78
|
+
|
|
79
|
+
// All pages that come from module entities (including sub-modules).
|
|
80
|
+
let modulePages =
|
|
81
|
+
asm.Contents.Entities
|
|
82
|
+
|> Seq.filter (fun e -> e.IsFSharpModule)
|
|
83
|
+
|> Seq.collect collectModulePages
|
|
84
|
+
|> Seq.toList
|
|
85
|
+
|
|
86
|
+
// Bare types at the assembly root that live in a namespace but are not
|
|
87
|
+
// inside any module (e.g. record/union types declared directly in a
|
|
88
|
+
// namespace declaration). Group them by their namespace and emit one
|
|
89
|
+
// synthetic module page per namespace.
|
|
90
|
+
let syntheticPages =
|
|
91
|
+
asm.Contents.Entities
|
|
92
|
+
|> Seq.filter (fun e ->
|
|
93
|
+
not e.IsFSharpModule && not e.IsNamespace && not e.IsArrayType && not e.IsByRef
|
|
94
|
+
)
|
|
95
|
+
|> Seq.groupBy (fun e -> namespaceOf (safeFullName e))
|
|
96
|
+
|> Seq.map (fun (ns, entities) ->
|
|
97
|
+
{
|
|
98
|
+
Name = "global"
|
|
99
|
+
FullName = ns + ".global"
|
|
100
|
+
Namespace = ns
|
|
101
|
+
XmlDoc = None
|
|
102
|
+
Entities = entities |> Seq.map (extractEntity toUrl docs) |> Seq.toList
|
|
103
|
+
Functions = []
|
|
104
|
+
Values = []
|
|
105
|
+
IsSynthetic = true
|
|
106
|
+
ObsoleteInfo = ObsoleteInfo.Active
|
|
107
|
+
}
|
|
108
|
+
)
|
|
109
|
+
|> Seq.toList
|
|
110
|
+
|
|
111
|
+
let rec collectFcsNamespaces (entity: FSharpEntity) : string list =
|
|
112
|
+
if entity.IsNamespace then
|
|
113
|
+
let nested = entity.NestedEntities |> Seq.collect collectFcsNamespaces |> Seq.toList
|
|
114
|
+
entity.FullName :: nested
|
|
115
|
+
else
|
|
116
|
+
[]
|
|
117
|
+
|
|
118
|
+
let allModules = modulePages @ syntheticPages
|
|
119
|
+
|
|
120
|
+
let namespaceNames =
|
|
121
|
+
[
|
|
122
|
+
yield! asm.Contents.Entities |> Seq.collect collectFcsNamespaces
|
|
123
|
+
|
|
124
|
+
yield!
|
|
125
|
+
allModules
|
|
126
|
+
|> List.map (fun m -> m.Namespace)
|
|
127
|
+
|> List.filter (fun ns -> ns <> "")
|
|
128
|
+
]
|
|
129
|
+
|> List.distinct
|
|
130
|
+
|> List.sort
|
|
131
|
+
|
|
132
|
+
let namespaces =
|
|
133
|
+
[
|
|
134
|
+
// "global" if any module has no namespace
|
|
135
|
+
if allModules |> List.exists (fun m -> m.Namespace = "") then
|
|
136
|
+
{
|
|
137
|
+
Name = "global"
|
|
138
|
+
FullName = ""
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
for ns in namespaceNames do
|
|
142
|
+
let name =
|
|
143
|
+
let lastDot = ns.LastIndexOf('.')
|
|
144
|
+
|
|
145
|
+
if lastDot < 0 then
|
|
146
|
+
ns
|
|
147
|
+
else
|
|
148
|
+
ns.[lastDot + 1 ..]
|
|
149
|
+
|
|
150
|
+
{
|
|
151
|
+
Name = name
|
|
152
|
+
FullName = ns
|
|
153
|
+
}
|
|
154
|
+
]
|
|
155
|
+
|
|
156
|
+
{
|
|
157
|
+
Name = asm.SimpleName
|
|
158
|
+
Namespaces = namespaces
|
|
159
|
+
Modules = allModules
|
|
160
|
+
}
|