Skip to content

Commit 8bff905

Browse files
committed
Update nuget handling in fsi
1 parent ed65dfe commit 8bff905

34 files changed

+366
-57
lines changed

.gitignore

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,3 +127,13 @@ nCrunchTemp_*
127127
tests/FSharp.Compiler.Service.Tests/FSharp.CompilerService.SurfaceArea.netstandard.actual
128128
*.vsp
129129
/tests/AheadOfTime/Trimming/output.txt
130+
*.svclog
131+
micro.exe
132+
positive.exe
133+
/tests/FSharp.Compiler.ComponentTests/FSharpChecker/StandardError.txt
134+
/tests/FSharp.Compiler.ComponentTests/FSharpChecker/StandardOutput.txt
135+
136+
# ilverify baseline result files
137+
*.bsl.actual
138+
/src/FSharp.DependencyManager.Nuget/StandardError.txt
139+
/src/FSharp.DependencyManager.Nuget/StandardOutput.txt

eng/Versions.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<!-- F# Version components -->
1616
<FSMajorVersion>8</FSMajorVersion>
1717
<FSMinorVersion>0</FSMinorVersion>
18-
<FSBuildVersion>102</FSBuildVersion>
18+
<FSBuildVersion>103</FSBuildVersion>
1919
<FSRevisionVersion>0</FSRevisionVersion>
2020
<!-- -->
2121
<!-- F# Language version -->

src/Compiler/Driver/ScriptClosure.fs

Lines changed: 41 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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 =
8285
module 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,

src/Compiler/Driver/ScriptClosure.fsi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ type LoadClosure =
4242
/// The resolved pacakge references along with the ranges of the #r positions in each file.
4343
PackageReferences: (range * string list)[]
4444

45+
/// The raw package manager lines in the script
46+
PackageManagerLines: Map<string, PackageManagerLine list>
47+
4548
/// Whether we're decided to use .NET Framework analysis for this script
4649
UseDesktopFramework: bool
4750

@@ -80,6 +83,7 @@ type LoadClosure =
8083
defaultFSharpBinariesDir: string *
8184
fileName: string *
8285
sourceText: ISourceText *
86+
caret: Position option *
8387
implicitDefines: CodeContext *
8488
useSimpleResolution: bool *
8589
useFsiAuxLib: bool *

src/Compiler/Service/FSharpCheckerResults.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3577,6 +3577,7 @@ type FsiInteractiveChecker(legacyReferenceResolver, tcConfig: TcConfig, tcGlobal
35773577
defaultFSharpBinariesDir,
35783578
fileName,
35793579
sourceText,
3580+
None,
35803581
CodeContext.Editing,
35813582
tcConfig.useSimpleResolution,
35823583
tcConfig.useFsiAuxLib,

src/Compiler/Service/service.fs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1122,6 +1122,7 @@ type BackgroundCompiler
11221122
member _.GetProjectOptionsFromScript
11231123
(
11241124
fileName,
1125+
caret,
11251126
sourceText,
11261127
previewEnabled,
11271128
loadedTimeStamp,
@@ -1171,6 +1172,7 @@ type BackgroundCompiler
11711172
legacyReferenceResolver,
11721173
FSharpCheckerResultsSettings.defaultFSharpBinariesDir,
11731174
fileName,
1175+
caret,
11741176
sourceText,
11751177
CodeContext.Editing,
11761178
useSimpleResolution,
@@ -1646,6 +1648,7 @@ type FSharpChecker
16461648
(
16471649
fileName,
16481650
source,
1651+
?caret,
16491652
?previewEnabled,
16501653
?loadedTimeStamp,
16511654
?otherFlags,
@@ -1661,6 +1664,7 @@ type FSharpChecker
16611664
backgroundCompiler.GetProjectOptionsFromScript(
16621665
fileName,
16631666
source,
1667+
caret,
16641668
previewEnabled,
16651669
loadedTimeStamp,
16661670
otherFlags,

src/Compiler/Service/service.fsi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ type public FSharpChecker =
208208
///
209209
/// <param name="fileName">Used to differentiate between scripts, to consider each script a separate project. Also used in formatted error messages.</param>
210210
/// <param name="source">The source for the file.</param>
211+
/// <param name="caret">The editor location for the cursor if available.</param>
211212
/// <param name="previewEnabled">Is the preview compiler enabled.</param>
212213
/// <param name="loadedTimeStamp">Indicates when the script was loaded into the editing environment,
213214
/// so that an 'unload' and 'reload' action will cause the script to be considered as a new project,
@@ -222,6 +223,7 @@ type public FSharpChecker =
222223
member GetProjectOptionsFromScript:
223224
fileName: string *
224225
source: ISourceText *
226+
?caret: Position *
225227
?previewEnabled: bool *
226228
?loadedTimeStamp: DateTime *
227229
?otherFlags: string[] *

src/FSharp.DependencyManager.Nuget/FSDependencyManager.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ highestVersion,"with the highest version"
99
sourceDirectoryDoesntExist,"The source directory '%s' not found"
1010
timedoutResolvingPackages,"Timed out resolving packages, process: '%s' '%s'"
1111
invalidTimeoutValue,"Invalid value for timeout '%s', valid values: none, -1 and integer milliseconds to wait"
12-
missingTimeoutValue,"Missing value for timeout"
12+
missingTimeoutValue,"Missing value for timeout"
13+
invalidBooleanValue,"Invalid value for boolean '%s', valid values: true or false"

src/FSharp.DependencyManager.Nuget/FSharp.DependencyManager.ProjectFile.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type PackageReference =
1111
Version: string
1212
RestoreSources: string
1313
Script: string
14+
UsePackageTargets: bool
1415
}
1516

1617
module internal ProjectFile =

src/FSharp.DependencyManager.Nuget/FSharp.DependencyManager.fs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,16 +55,30 @@ module FSharpDependencyManager =
5555
Version = ver
5656
RestoreSources = src
5757
Script = script
58+
UsePackageTargets = usePackageTargets
5859
} =
5960
p
6061

62+
let usePackageTargets =
63+
match usePackageTargets with
64+
| false -> "ExcludeAssets='build;buildTransitive;buildMultitargeting'"
65+
| true -> ""
66+
6167
seq {
6268
match not (String.IsNullOrEmpty(inc)), not (String.IsNullOrEmpty(ver)), not (String.IsNullOrEmpty(script)) with
63-
| true, true, false -> yield sprintf @" <ItemGroup><PackageReference Include='%s' Version='%s' /></ItemGroup>" inc ver
69+
| true, true, false ->
70+
yield sprintf @" <ItemGroup><PackageReference Include='%s' Version='%s' %s /></ItemGroup>" inc ver usePackageTargets
6471
| true, true, true ->
65-
yield sprintf @" <ItemGroup><PackageReference Include='%s' Version='%s' Script='%s' /></ItemGroup>" inc ver script
66-
| true, false, false -> yield sprintf @" <ItemGroup><PackageReference Include='%s' /></ItemGroup>" inc
67-
| true, false, true -> yield sprintf @" <ItemGroup><PackageReference Include='%s' Script='%s' /></ItemGroup>" inc script
72+
yield
73+
sprintf
74+
@" <ItemGroup><PackageReference Include='%s' Version='%s' Script='%s' %s /></ItemGroup>"
75+
inc
76+
ver
77+
script
78+
usePackageTargets
79+
| true, false, false -> yield sprintf @" <ItemGroup><PackageReference Include='%s' %s /></ItemGroup>" inc usePackageTargets
80+
| true, false, true ->
81+
yield sprintf @" <ItemGroup><PackageReference Include='%s' Script='%s' %s /></ItemGroup>" inc script usePackageTargets
6882
| _ -> ()
6983

7084
match not (String.IsNullOrEmpty(src)) with
@@ -96,6 +110,7 @@ module FSharpDependencyManager =
96110
Version = "*"
97111
RestoreSources = ""
98112
Script = ""
113+
UsePackageTargets = false
99114
}
100115

101116
match options with
@@ -114,11 +129,20 @@ module FSharpDependencyManager =
114129

115130
let setVersion v = Some { current with Version = v }
116131

132+
let setUsePackageTargets v =
133+
Some { current with UsePackageTargets = v }
134+
117135
match opt with
118136
| Some "include", Some v -> addInclude v |> parsePackageReferenceOption' rest implicitArgumentCount
119137
| Some "include", None -> raise (ArgumentException(SR.requiresAValue ("Include")))
120138
| Some "version", Some v -> setVersion v |> parsePackageReferenceOption' rest implicitArgumentCount
121139
| Some "version", None -> setVersion "*" |> parsePackageReferenceOption' rest implicitArgumentCount
140+
| Some "usepackagetargets", v ->
141+
match v with
142+
| Some v when v.ToLowerInvariant() = "true" -> setUsePackageTargets true
143+
| Some v when v.ToLowerInvariant() = "false" -> setUsePackageTargets false
144+
| _ -> raise (ArgumentException(SR.invalidBooleanValue ("usepackagetargets")))
145+
|> parsePackageReferenceOption' rest implicitArgumentCount
122146
| Some "restoresources", Some v ->
123147
Some
124148
{ current with
@@ -212,12 +236,12 @@ module FSharpDependencyManager =
212236
let referencesHaveWildCardVersion =
213237
// Verify to see if the developer specified a wildcard version. If they did then caching is not possible
214238
let hasWildCardVersion p =
215-
// Todo: named record please
216239
let {
217240
Include = package
218241
Version = ver
219242
RestoreSources = _
220243
Script = _
244+
UsePackageTargets = _
221245
} =
222246
p
223247

0 commit comments

Comments
 (0)