@@ -45,6 +45,9 @@ type LoadClosure =
4545        /// The resolved package references along with the ranges of the #r positions in each file. 
4646:  ( range  *  string list )[] 
4747
48+         /// The raw package manager lines in the script 
49+ :  Map < string ,  PackageManagerLine list > 
50+ 
4851        /// Whether we're decided to use .NET Framework analysis for this script 
4952:  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 
8892type  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 
630641let  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