@@ -7,7 +7,6 @@ open FSharp.Compiler.SyntaxTree
77open FSharp.Compiler .SourceCodeServices
88
99module Ast =
10-
1110 let fromFilename filename =
1211 let allLines = Generation.linesToKeep filename |> String.concat Environment.NewLine
1312 let parsingOpts = { FSharpParsingOptions.Default with
@@ -111,4 +110,67 @@ module Ast =
111110 types
112111 |> List.map ( fun ( ns , types ) -> ns, types |> List.filter isDu )
113112 onlyDus
113+
114+
115+ module ModuleOrNamespace =
116+ let hasAttribute < 'a >
117+ ( SynModuleOrNamespace ( _namespaceId , _isRec , _isModule , _moduleDecls , _preXmlDoc , attributes , _access , _range )) =
118+ attributes
119+ |> List.collect ( fun n -> n.Attributes)
120+ |> List.exists ( typeNameMatches typeof< 'a>)
121+
122+ let modulesWithAttribute < 'a > ( ast : ParsedInput ) =
123+ [ match ast with
124+ | ParsedInput.ImplFile ( ParsedImplFileInput (_ name, _ isScript, _ qualifiedNameOfFile, _ scopedPragmas, _ hashDirectives, modules, _ g)) ->
125+ for SynModuleOrNamespace (_ namespaceId, _ isRec, moduleOrNs, _ moduleDecls, _ preXmlDoc, _ attributes, _ access, _ range) as ns in modules do
126+ if moduleOrNs.IsModule && hasAttribute< 'a> ns then
127+ yield ns
128+ | _ -> () ]
129+
130+ let getTypeDefns ( nsOrModule : SynModuleOrNamespace ) =
131+ let rec extractTypes ( moduleDecls : SynModuleDecl list ) ( ns : LongIdent ) =
132+ [ for moduleDecl in moduleDecls do
133+ match moduleDecl with
134+ | SynModuleDecl.Types ( types, _) -> yield ( ns, types)
135+ | SynModuleDecl.NestedModule ( ComponentInfo (_ attribs, _ typeParams, _ constraints, longId, _ xmlDoc, _ preferPostfix, _ accessibility, _ range), _ isRec, decls, _ local, _ outerRange) ->
136+ let combined = longId |> List.append ns
137+ yield ! ( extractTypes decls combined)
138+ | _ other -> () ]
139+
140+ let ( SynModuleOrNamespace ( namespaceId , _isRec , _isModule , moduleDecls , _preXmlDoc , _attributes , _access , _range )) =
141+ nsOrModule
142+
143+ extractTypes moduleDecls namespaceId
144+
145+ let records ( nsOrModule : SynModuleOrNamespace ) =
146+ let types = getTypeDefns nsOrModule
147+
148+ let onlyRecords =
149+ types
150+ |> List.map ( fun ( ns , types ) -> ns, types |> List.filter isRecord)
151+
152+ onlyRecords
153+
154+ let dus ( nsOrModule : SynModuleOrNamespace ) =
155+ let types = getTypeDefns nsOrModule
156+
157+ let onlyDus =
158+ types
159+ |> List.map ( fun ( ns , types ) -> ns, types |> List.filter isDu)
160+
161+ onlyDus
162+
163+ let recordsOrDus ( nsOrModule : SynModuleOrNamespace ) =
164+ let types = getTypeDefns nsOrModule
165+
166+ let recordsOrDus =
167+ types
168+ |> List.map ( fun ( ns , types ) -> ns, types |> List.filter ( fun t -> t |> isDu || t |> isRecord))
169+
170+ recordsOrDus
171+
172+ open FsAst
173+ module Ident =
174+ let asCamelCase ( ident : Ident ) =
175+ Ident.Create( ident.idText.Substring( 0 , 1 ) .ToLowerInvariant() + ident.idText.Substring( 1 ))
114176
0 commit comments