Skip to content

Commit f2a85cb

Browse files
author
7sharp9
committed
Add helpful extensions to Ast
1 parent 7767b8c commit f2a85cb

File tree

1 file changed

+63
-1
lines changed

1 file changed

+63
-1
lines changed

src/Myriad.Core/Ast.fs

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ open FSharp.Compiler.SyntaxTree
77
open FSharp.Compiler.SourceCodeServices
88

99
module 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

Comments
 (0)