@@ -45,6 +45,9 @@ type LoadClosure =
4545 /// The resolved pacakge 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 exn ->
258262 errorRecovery exn m
259263 []
@@ -313,16 +317,25 @@ module ScriptPreprocessClosure =
313317 let packageReferences = Dictionary< range, string list>( HashIdentity.Structural)
314318
315319 // Resolve the packages
316- let rec resolveDependencyManagerSources scriptName =
320+ let rec resolveDependencyManagerSources scriptName ( caret : Position option ) =
321+ let caretLine =
322+ match caret with
323+ | None -> Int32.MinValue
324+ | Some pos -> pos.Line
325+
326+ let isEditorCursorInPackageLines ( line : PackageManagerLine ) =
327+ caretLine >= line.Range.StartLine && caretLine <= line.Range.EndLine
328+
317329 [
318330 if not ( loadScripts.Contains scriptName) then
319331 for kv in tcConfig.packageManagerLines do
320332 let packageManagerKey , packageManagerLines = kv.Key, kv.Value
321333
322- match packageManagerLines with
334+ match packageManagerLines |> List.filter ( not << isEditorCursorInPackageLines ) with
323335 | [] -> ()
324336 | packageManagerLine :: _ ->
325337 let m = packageManagerLine.Range
338+ let packageManagerLines = packageManagerLines
326339 yield ! processPackageManagerLines m packageManagerLines scriptName packageManagerKey
327340 ]
328341
@@ -426,7 +439,7 @@ module ScriptPreprocessClosure =
426439 let scriptText = stream.ReadAllText()
427440 loadScripts.Add script |> ignore
428441 let iSourceText = SourceText.ofString scriptText
429- yield ! processClosureSource ( ClosureSource( script, m, iSourceText, true ))
442+ yield ! processClosureSource ( ClosureSource( script, m, iSourceText, None , true ))
430443
431444 else
432445 // Send outputs via diagnostics
@@ -443,7 +456,7 @@ module ScriptPreprocessClosure =
443456 tcConfig <- TcConfig.Create( tcConfigB, validate = false )
444457 ]
445458
446- and processClosureSource ( ClosureSource ( fileName , m , sourceText , parseRequired )) =
459+ and processClosureSource ( ClosureSource ( fileName , m , sourceText , caret , parseRequired )) =
447460 [
448461 if not ( observedSources.HaveSeen( fileName)) then
449462 observedSources.SetSeen( fileName)
@@ -473,7 +486,7 @@ module ScriptPreprocessClosure =
473486
474487 tcConfig <- tcConfigResult // We accumulate the tcConfig in order to collect assembly references
475488
476- yield ! resolveDependencyManagerSources fileName
489+ yield ! resolveDependencyManagerSources fileName caret
477490
478491 let postSources = tcConfig.GetAvailableLoadedSources()
479492
@@ -483,7 +496,7 @@ module ScriptPreprocessClosure =
483496 else
484497 []
485498
486- yield ! resolveDependencyManagerSources fileName
499+ yield ! resolveDependencyManagerSources fileName caret
487500
488501 for m, subFile in sources do
489502 if IsScript subFile then
@@ -540,7 +553,7 @@ module ScriptPreprocessClosure =
540553 | _ -> lastClosureFile
541554
542555 /// Reduce the full directive closure into LoadClosure
543- let GetLoadClosure ( rootFilename , closureFiles , tcConfig : TcConfig , codeContext , packageReferences , earlierDiagnostics ) =
556+ let GetLoadClosure ( rootFilename , closureFiles , tcConfig : TcConfig , codeContext , packageReferences , earlierDiagnostics ) : LoadClosure =
544557
545558 // Mark the last file as isLastCompiland.
546559 let closureFiles =
@@ -612,23 +625,21 @@ module ScriptPreprocessClosure =
612625 // Filter out non-root errors and warnings
613626 let allRootDiagnostics = allRootDiagnostics |> List.filter ( fst >> isRootRange)
614627
615- let result : LoadClosure =
616- {
617- SourceFiles = List.groupBy fst sourceFiles |> List.map ( map2Of2 ( List.map snd))
618- References = List.groupBy fst references |> List.map ( map2Of2 ( List.map snd))
619- PackageReferences = packageReferences
620- UseDesktopFramework = ( tcConfig.primaryAssembly = PrimaryAssembly.Mscorlib)
621- SdkDirOverride = tcConfig.sdkDirOverride
622- UnresolvedReferences = unresolvedReferences
623- Inputs = sourceInputs
624- NoWarns = List.groupBy fst globalNoWarns |> List.map ( map2Of2 ( List.map snd))
625- OriginalLoadReferences = tcConfig.loadedSources
626- ResolutionDiagnostics = resolutionDiagnostics
627- AllRootFileDiagnostics = allRootDiagnostics
628- LoadClosureRootFileDiagnostics = loadClosureRootDiagnostics
629- }
630-
631- result
628+ {
629+ SourceFiles = List.groupBy fst sourceFiles |> List.map ( map2Of2 ( List.map snd))
630+ References = List.groupBy fst references |> List.map ( map2Of2 ( List.map snd))
631+ PackageReferences = packageReferences
632+ PackageManagerLines = tcConfig.packageManagerLines
633+ UseDesktopFramework = ( tcConfig.primaryAssembly = PrimaryAssembly.Mscorlib)
634+ SdkDirOverride = tcConfig.sdkDirOverride
635+ UnresolvedReferences = unresolvedReferences
636+ Inputs = sourceInputs
637+ NoWarns = List.groupBy fst globalNoWarns |> List.map ( map2Of2 ( List.map snd))
638+ OriginalLoadReferences = tcConfig.loadedSources
639+ ResolutionDiagnostics = resolutionDiagnostics
640+ AllRootFileDiagnostics = allRootDiagnostics
641+ LoadClosureRootFileDiagnostics = loadClosureRootDiagnostics
642+ }
632643
633644 /// Given source text, find the full load closure. Used from service.fs, when editing a script file
634645 let GetFullClosureOfScriptText
@@ -637,6 +648,7 @@ module ScriptPreprocessClosure =
637648 defaultFSharpBinariesDir ,
638649 fileName ,
639650 sourceText ,
651+ caret ,
640652 codeContext ,
641653 useSimpleResolution ,
642654 useFsiAuxLib ,
@@ -649,7 +661,6 @@ module ScriptPreprocessClosure =
649661 reduceMemoryUsage ,
650662 dependencyProvider
651663 ) =
652-
653664 // Resolve the basic references such as FSharp.Core.dll first, before processing any #I directives in the script
654665 //
655666 // This is tries to mimic the action of running the script in F# Interactive - the initial context for scripting is created
@@ -700,7 +711,7 @@ module ScriptPreprocessClosure =
700711 reduceMemoryUsage
701712 )
702713
703- let closureSources = [ ClosureSource( fileName, range0, sourceText, true ) ]
714+ let closureSources = [ ClosureSource( fileName, range0, sourceText, caret , true ) ]
704715
705716 let closureFiles , tcConfig , packageReferences =
706717 FindClosureFiles( fileName, closureSources, tcConfig, codeContext, lexResourceManager, dependencyProvider)
@@ -742,6 +753,7 @@ type LoadClosure with
742753 defaultFSharpBinariesDir ,
743754 fileName : string ,
744755 sourceText : ISourceText ,
756+ caret : Position option ,
745757 implicitDefines ,
746758 useSimpleResolution : bool ,
747759 useFsiAuxLib ,
@@ -762,6 +774,7 @@ type LoadClosure with
762774 defaultFSharpBinariesDir,
763775 fileName,
764776 sourceText,
777+ caret,
765778 implicitDefines,
766779 useSimpleResolution,
767780 useFsiAuxLib,
0 commit comments