@@ -40,6 +40,7 @@ open FSharp.Compiler.TypedTree
4040open FSharp.Compiler .TypedTreeBasics
4141open FSharp.Compiler .TypedTreeOps
4242open 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