11module FSharp.Compiler.Service.Tests.DepResolving
22
3+ open System
34open System.Collections .Generic
5+ open Buildalyzer
46open FSharp.Compiler .Service .Tests2 .SyntaxTreeTests .TypeTests
57open FSharp.Compiler .Syntax
68open NUnit.Framework
79
10+ let log ( msg : string ) =
11+ let d = DateTime.Now.ToString( " HH:mm:ss.fff" )
12+ printfn $" {d} {msg}"
13+
814/// File * AST
915type FileAST = string * ParsedInput
1016
@@ -122,12 +128,13 @@ let rec searchInTrie (trie : TrieNode) (path : LongIdent) : TrieNode option =
122128 | false , _ ->
123129 None
124130
125- let detectFileDependencies ( nodes : FileAST list ) : Graph =
131+ let detectFileDependencies ( nodes : FileAST [] ) : Graph =
126132 // Create ASTs, extract module refs
127133 let nodes =
128134 nodes
129- |> List.mapi ( fun i ( name , ast ) ->
130- let typeAndModuleRefs = visit ast
135+ |> Array.mapi ( fun i ( name , ast ) ->
136+ printfn $" Visiting {name}"
137+ let typeAndModuleRefs = visit ast
131138 let top = topModuleOrNamespace ast
132139 let moduleRefs = extractModuleSegments typeAndModuleRefs
133140 {
@@ -138,7 +145,6 @@ let detectFileDependencies (nodes : FileAST list) : Graph =
138145 Idx = i
139146 }
140147 )
141- |> List.toArray
142148
143149 let trie = buildTrie nodes
144150
@@ -282,9 +288,47 @@ type B = int
282288 let nodes =
283289 files
284290 |> List.map ( fun ( name , code ) -> name, getParseResults code)
291+ |> List.toArray
285292
286293 let graph = detectFileDependencies nodes
287294
288295 printfn " Detected file dependencies:"
289296 graph
290297 |> Array.iter ( fun ( file , deps ) -> printfn $" {file} -> %+A {deps}" )
298+
299+ [<Test>]
300+ let Test () =
301+ log " start"
302+ let m = AnalyzerManager()
303+ let analyzer = m.GetProject( @" C:\projekty\fsharp\fsharp_main\src\Compiler\FSharp.Compiler.Service.fsproj" )
304+ let results = analyzer.Build()
305+ log " built"
306+
307+ let res = results.Results |> Seq.head
308+ let files = res.SourceFiles
309+ let files =
310+ files
311+ |> Array.take 3
312+ |> Array.Parallel.map ( fun f -> f, System.IO.File.ReadAllText( f))
313+ |> Array.chunkBySize 5
314+ |> Array.map ( fun chunk ->
315+ chunk
316+ |> Array.Parallel.map ( fun ( f , code ) ->
317+ printfn $" Parsing {f}"
318+ let ast = getParseResults code
319+ f, ast
320+ )
321+ )
322+ |> Array.concat
323+ let N = files.Length
324+ log $" {N} files read"
325+
326+ let graph = detectFileDependencies files
327+ log " deps detected"
328+
329+ let totalDeps = graph |> Array.sumBy ( fun ( f , deps ) -> deps.Length)
330+ let maxPossibleDeps = ( N * ( N-1 )) / 2
331+ printfn $" Analysed {N} files, detected {totalDeps}/{maxPossibleDeps} file dependencies:"
332+ graph
333+ |> Array.iter ( fun ( file , deps ) -> printfn $" {file} -> %+A {deps}" )
334+ ()
0 commit comments