Skip to content

Commit bebf711

Browse files
nojafncave
authored andcommitted
Add GetDependentFiles to slim service. (#14)
1 parent e5db56b commit bebf711

File tree

1 file changed

+48
-0
lines changed

1 file changed

+48
-0
lines changed

fcs/service_slim.fs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ open FSharp.Compiler.TypedTree
4040
open FSharp.Compiler.TypedTreeBasics
4141
open FSharp.Compiler.TypedTreeOps
4242
open FSharp.Compiler.BuildGraph
43+
open FSharp.Compiler.GraphChecking
4344

4445
//-------------------------------------------------------------------------
4546
// InteractiveChecker
@@ -403,3 +404,50 @@ type InteractiveChecker internal (compilerStateCache) =
403404

404405
return (parseFileResults, checkFileResults, projectResults)
405406
}
407+
408+
/// Find the dependent files of the current file based on the untyped syntax tree
409+
member _.GetDependentFiles(currentFileName: string, fileNames: string[], sourceReader: string -> int * Lazy<string>) = async {
410+
// parse files
411+
let! ct = Async.CancellationToken
412+
let! compilerState = compilerStateCache.Get()
413+
// parse files
414+
let parsingOptions = FSharpParsingOptions.FromTcConfig(compilerState.tcConfig, fileNames, false)
415+
let parseFile fileName =
416+
let sourceHash, source = sourceReader fileName
417+
ParseFile (fileName, sourceHash, source, parsingOptions, compilerState, ct)
418+
419+
// TODO: not sure if parse cache issues still applies
420+
let parseResults = fileNames |> Array.Parallel.map parseFile
421+
let sourceFiles: FileInProject array =
422+
parseResults
423+
|> Array.mapi (fun idx (parseResults: FSharpParseFileResults) ->
424+
let input = parseResults.ParseTree
425+
{
426+
Idx = idx
427+
FileName = input.FileName
428+
ParsedInput = input
429+
})
430+
431+
let currentFileIdx = Array.IndexOf(fileNames, currentFileName)
432+
433+
let filePairs = FilePairMap(sourceFiles)
434+
let graph, _trie = DependencyResolution.mkGraph filePairs sourceFiles
435+
436+
let dependentFiles =
437+
graph.Keys
438+
|> Seq.choose (fun fileIndex ->
439+
let isDependency =
440+
// Only files that came after the current file are relevant
441+
fileIndex > currentFileIdx
442+
&&
443+
// The current file is listed as a dependency
444+
Array.contains currentFileIdx graph.[fileIndex]
445+
if not isDependency then
446+
None
447+
else
448+
Some(Array.item fileIndex fileNames)
449+
)
450+
|> Seq.toArray
451+
452+
return dependentFiles
453+
}

0 commit comments

Comments
 (0)