@@ -45,6 +45,9 @@ type LoadClosure =
4545 /// The resolved package references along with the ranges of the #r positions in each file.
4646 PackageReferences: ( range * string list )[]
4747
48+ /// The raw package manager lines in the script
49+ PackageManagerLines: Map < string , PackageManagerLine list >
50+
4851 /// Whether we're decided to use .NET Framework analysis for this script
4952 UseDesktopFramework: bool
5053
@@ -82,7 +85,8 @@ type CodeContext =
8285module ScriptPreprocessClosure =
8386
8487 /// Represents an input to the closure finding process
85- type ClosureSource = ClosureSource of fileName : string * referenceRange : range * sourceText : ISourceText * parseRequired : bool
88+ type ClosureSource =
89+ | ClosureSource of fileName : string * referenceRange : range * sourceText : ISourceText * Position option * parseRequired : bool
8690
8791 /// Represents an output of the closure finding process
8892 type ClosureFile =
@@ -253,7 +257,7 @@ module ScriptPreprocessClosure =
253257 | Some( n: int) -> new StreamReader( stream, Encoding.GetEncoding n)
254258
255259 let source = reader.ReadToEnd()
256- [ ClosureSource( fileName, m, SourceText.ofString source, parseRequired) ]
260+ [ ClosureSource( fileName, m, SourceText.ofString source, None , parseRequired) ]
257261 with RecoverableException exn ->
258262 errorRecovery exn m
259263 []
@@ -309,16 +313,25 @@ module ScriptPreprocessClosure =
309313 let packageReferences = Dictionary< range, string list>( HashIdentity.Structural)
310314
311315 // Resolve the packages
312- let rec resolveDependencyManagerSources scriptName =
316+ let rec resolveDependencyManagerSources scriptName ( caret : Position option ) =
317+ let caretLine =
318+ match caret with
319+ | None -> Int32.MinValue
320+ | Some pos -> pos.Line
321+
322+ let isEditorCursorInPackageLines ( line : PackageManagerLine ) =
323+ caretLine >= line.Range.StartLine && caretLine <= line.Range.EndLine
324+
313325 [
314326 if not ( loadScripts.Contains scriptName) then
315327 for kv in tcConfig.packageManagerLines do
316328 let packageManagerKey , packageManagerLines = kv.Key, kv.Value
317329
318- match packageManagerLines with
330+ match packageManagerLines |> List.filter ( not << isEditorCursorInPackageLines ) with
319331 | [] -> ()
320332 | packageManagerLine :: _ ->
321333 let m = packageManagerLine.Range
334+ let packageManagerLines = packageManagerLines
322335 yield ! processPackageManagerLines m packageManagerLines scriptName packageManagerKey
323336 ]
324337
@@ -422,7 +435,7 @@ module ScriptPreprocessClosure =
422435 let scriptText = stream.ReadAllText()
423436 loadScripts.Add script |> ignore
424437 let iSourceText = SourceText.ofString scriptText
425- yield ! processClosureSource ( ClosureSource( script, m, iSourceText, true ))
438+ yield ! processClosureSource ( ClosureSource( script, m, iSourceText, None , true ))
426439
427440 else
428441 // Send outputs via diagnostics
@@ -439,7 +452,7 @@ module ScriptPreprocessClosure =
439452 tcConfig <- TcConfig.Create( tcConfigB, validate = false )
440453 ]
441454
442- and processClosureSource ( ClosureSource ( fileName , m , sourceText , parseRequired )) =
455+ and processClosureSource ( ClosureSource ( fileName , m , sourceText , caret , parseRequired )) =
443456 [
444457 if not ( observedSources.HaveSeen( fileName)) then
445458 observedSources.SetSeen( fileName)
@@ -469,7 +482,7 @@ module ScriptPreprocessClosure =
469482
470483 tcConfig <- tcConfigResult // We accumulate the tcConfig in order to collect assembly references
471484
472- yield ! resolveDependencyManagerSources fileName
485+ yield ! resolveDependencyManagerSources fileName caret
473486
474487 let postSources = tcConfig.GetAvailableLoadedSources()
475488
@@ -479,7 +492,7 @@ module ScriptPreprocessClosure =
479492 else
480493 []
481494
482- yield ! resolveDependencyManagerSources fileName
495+ yield ! resolveDependencyManagerSources fileName caret
483496
484497 for m, subFile in sources do
485498 if IsScript subFile then
@@ -536,7 +549,7 @@ module ScriptPreprocessClosure =
536549 | _ -> lastClosureFile
537550
538551 /// Reduce the full directive closure into LoadClosure
539- let GetLoadClosure ( rootFilename , closureFiles , tcConfig : TcConfig , codeContext , packageReferences , earlierDiagnostics ) =
552+ let GetLoadClosure ( rootFilename , closureFiles , tcConfig : TcConfig , codeContext , packageReferences , earlierDiagnostics ) : LoadClosure =
540553
541554 // Mark the last file as isLastCompiland.
542555 let closureFiles =
@@ -608,23 +621,21 @@ module ScriptPreprocessClosure =
608621 // Filter out non-root errors and warnings
609622 let allRootDiagnostics = allRootDiagnostics |> List.filter ( fst >> isRootRange)
610623
611- let result : LoadClosure =
612- {
613- SourceFiles = List.groupBy fst sourceFiles |> List.map ( map2Of2 ( List.map snd))
614- References = List.groupBy fst references |> List.map ( map2Of2 ( List.map snd))
615- PackageReferences = packageReferences
616- UseDesktopFramework = ( tcConfig.primaryAssembly = PrimaryAssembly.Mscorlib)
617- SdkDirOverride = tcConfig.sdkDirOverride
618- UnresolvedReferences = unresolvedReferences
619- Inputs = sourceInputs
620- NoWarns = List.groupBy fst globalNoWarns |> List.map ( map2Of2 ( List.map snd))
621- OriginalLoadReferences = tcConfig.loadedSources
622- ResolutionDiagnostics = resolutionDiagnostics
623- AllRootFileDiagnostics = allRootDiagnostics
624- LoadClosureRootFileDiagnostics = loadClosureRootDiagnostics
625- }
626-
627- result
624+ {
625+ SourceFiles = List.groupBy fst sourceFiles |> List.map ( map2Of2 ( List.map snd))
626+ References = List.groupBy fst references |> List.map ( map2Of2 ( List.map snd))
627+ PackageReferences = packageReferences
628+ PackageManagerLines = tcConfig.packageManagerLines
629+ UseDesktopFramework = ( tcConfig.primaryAssembly = PrimaryAssembly.Mscorlib)
630+ SdkDirOverride = tcConfig.sdkDirOverride
631+ UnresolvedReferences = unresolvedReferences
632+ Inputs = sourceInputs
633+ NoWarns = List.groupBy fst globalNoWarns |> List.map ( map2Of2 ( List.map snd))
634+ OriginalLoadReferences = tcConfig.loadedSources
635+ ResolutionDiagnostics = resolutionDiagnostics
636+ AllRootFileDiagnostics = allRootDiagnostics
637+ LoadClosureRootFileDiagnostics = loadClosureRootDiagnostics
638+ }
628639
629640 /// Given source text, find the full load closure. Used from service.fs, when editing a script file
630641 let GetFullClosureOfScriptText
@@ -633,6 +644,7 @@ module ScriptPreprocessClosure =
633644 defaultFSharpBinariesDir ,
634645 fileName ,
635646 sourceText ,
647+ caret ,
636648 codeContext ,
637649 useSimpleResolution ,
638650 useFsiAuxLib ,
@@ -645,7 +657,6 @@ module ScriptPreprocessClosure =
645657 reduceMemoryUsage ,
646658 dependencyProvider
647659 ) =
648-
649660 // Resolve the basic references such as FSharp.Core.dll first, before processing any #I directives in the script
650661 //
651662 // This is tries to mimic the action of running the script in F# Interactive - the initial context for scripting is created
@@ -696,7 +707,7 @@ module ScriptPreprocessClosure =
696707 reduceMemoryUsage
697708 )
698709
699- let closureSources = [ ClosureSource( fileName, range0, sourceText, true ) ]
710+ let closureSources = [ ClosureSource( fileName, range0, sourceText, caret , true ) ]
700711
701712 let closureFiles , tcConfig , packageReferences =
702713 FindClosureFiles( fileName, closureSources, tcConfig, codeContext, lexResourceManager, dependencyProvider)
@@ -733,6 +744,7 @@ type LoadClosure with
733744 defaultFSharpBinariesDir ,
734745 fileName : string ,
735746 sourceText : ISourceText ,
747+ caret : Position option ,
736748 implicitDefines ,
737749 useSimpleResolution : bool ,
738750 useFsiAuxLib ,
@@ -753,6 +765,7 @@ type LoadClosure with
753765 defaultFSharpBinariesDir,
754766 fileName,
755767 sourceText,
768+ caret,
756769 implicitDefines,
757770 useSimpleResolution,
758771 useFsiAuxLib,
0 commit comments