Skip to content

Commit 53c11b8

Browse files
KevinRansombaronfel
authored andcommitted
Even more refactoring of DependencyManagerIntegration (#8518)
* add references * Add references, also support legacy Package Manager APIs, Change scope of PM APIs * Return values from reflection * return values * Rename FSharp.DependencyManager.Nuget * sigfile
1 parent 7409333 commit 53c11b8

30 files changed

+126
-53
lines changed

fcs/RELEASE_NOTES.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,13 @@
1+
#### 34.0.3-beta
2+
3+
From dotnet/fsharp:3af8959b6..134962b04:
4+
5+
* set default script TFM to netcoreapp3.1 if none found
6+
* improve C#-nullable and optional interop (RFC FS-1075)
7+
* Add type name to `undefined name error` if known
8+
* improve printing via %A/fsi
9+
* misc. improvments to DependencyManager
10+
111
#### 34.0.1
212

313
Contains commits from 32b124966 to d7018737c from dotnet/fsharp. Notable changes include:

src/fsharp/CompileOps.fs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5153,7 +5153,7 @@ module ScriptPreprocessClosure =
51535153
let tcConfigB = tcConfig.CloneOfOriginalBuilder
51545154
TcConfig.Create(tcConfigB, validate=false), nowarns
51555155

5156-
let FindClosureFiles(_mainFile, _m, closureSources, origTcConfig:TcConfig, codeContext, lexResourceManager: Lexhelp.LexResourceManager) =
5156+
let FindClosureFiles(mainFile, _m, closureSources, origTcConfig:TcConfig, codeContext, lexResourceManager: Lexhelp.LexResourceManager) =
51575157
let mutable tcConfig = origTcConfig
51585158

51595159
let observedSources = Observed()
@@ -5177,9 +5177,9 @@ module ScriptPreprocessClosure =
51775177
let inline snd3 (_, b, _) = b
51785178
let packageManagerTextLines = packageManagerLines |> List.map snd3
51795179

5180-
match DependencyManagerIntegration.resolve packageManager ".fsx" m packageManagerTextLines with
5180+
match DependencyManagerIntegration.resolve packageManager tcConfig.implicitIncludeDir mainFile scriptName ".fsx" m packageManagerTextLines with
51815181
| None -> () // error already reported
5182-
| Some (succeeded, generatedScripts, additionalIncludeFolders) -> //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
5182+
| Some (succeeded, generatedScripts, additionalIncludeFolders) ->
51835183
// This may incrementally update tcConfig too with new #r references
51845184
// New package text is ignored on this second phase
51855185
match succeeded with

src/fsharp/DependencyManager.Integration.fs

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ open System.IO
88
open System.Reflection
99
open FSharp.Compiler.DotNetFrameworkDependencies
1010
open FSharp.Compiler.ErrorLogger
11+
open FSharp.Reflection
1112
open Internal.Utilities.FSharpEnvironment
1213

1314
// Contract strings
@@ -62,9 +63,9 @@ module ReflectionHelper =
6263
type internal IDependencyManagerProvider =
6364
abstract Name: string
6465
abstract Key: string
65-
abstract ResolveDependencies: scriptExt: string * packageManagerTextLines: string seq * tfm: string -> bool * string list * string list
66+
abstract ResolveDependencies: scriptDir: string * mainScriptName: string * scriptName: string * scriptExt: string * packageManagerTextLines: string seq * tfm: string -> bool * string list * string list
6667
abstract DependencyAdding: IEvent<string * string>
67-
abstract DependencyAdded: IEvent<string * string * string list * string list>
68+
abstract DependencyAdded: IEvent<string * string * string list * string list * string list>
6869
abstract DependencyFailed: IEvent<string * string>
6970

7071
[<RequireQualifiedAccess>]
@@ -73,7 +74,7 @@ type ReferenceType =
7374
| Library of string
7475
| UnknownType
7576

76-
type ReflectionDependencyManagerProvider(theType: Type, nameProperty: PropertyInfo, keyProperty: PropertyInfo, resolveDeps: MethodInfo, outputDir: string option) =
77+
type ReflectionDependencyManagerProvider(theType: Type, nameProperty: PropertyInfo, keyProperty: PropertyInfo, resolveDeps: MethodInfo option, resolveDepsEx: MethodInfo option,outputDir: string option) =
7778
let instance = Activator.CreateInstance(theType, [|outputDir :> obj|])
7879
let nameProperty = nameProperty.GetValue >> string
7980
let keyProperty = keyProperty.GetValue >> string
@@ -84,35 +85,66 @@ type ReflectionDependencyManagerProvider(theType: Type, nameProperty: PropertyIn
8485

8586
static member InstanceMaker (theType: System.Type, outputDir: string option) =
8687
match ReflectionHelper.getAttributeNamed theType dependencyManagerAttributeName,
87-
ReflectionHelper.getInstanceProperty<string> theType namePropertyName,
88-
ReflectionHelper.getInstanceProperty<string> theType keyPropertyName,
89-
ReflectionHelper.getInstanceMethod<bool * string list * string list> theType [| typeof<string>; typeof<string seq>; typeof<string> |] resolveDependenciesMethodName
90-
with
91-
| None, _, _, _ -> None
92-
| _, None, _, _ -> None
93-
| _, _, None, _ -> None
94-
| _, _, _, None -> None
95-
| Some _, Some nameProperty, Some keyProperty, Some resolveDependenciesMethod ->
96-
Some (fun () -> new ReflectionDependencyManagerProvider(theType, nameProperty, keyProperty, resolveDependenciesMethod, outputDir) :> IDependencyManagerProvider)
88+
ReflectionHelper.getInstanceProperty<string> theType namePropertyName,
89+
ReflectionHelper.getInstanceProperty<string> theType keyPropertyName
90+
with
91+
| None, _, _
92+
| _, None, _
93+
| _, _, None -> None
94+
| Some _, Some nameProperty, Some keyProperty ->
95+
let resolveMethod = ReflectionHelper.getInstanceMethod<bool * string list * string list> theType [| typeof<string>; typeof<string>; typeof<string>; typeof<string seq>; typeof<string> |] resolveDependenciesMethodName
96+
let resolveMethodEx = ReflectionHelper.getInstanceMethod<bool * string list * string list> theType [| typeof<string>; typeof<string seq>; typeof<string> |] resolveDependenciesMethodName
97+
Some (fun () -> new ReflectionDependencyManagerProvider(theType, nameProperty, keyProperty, resolveMethod, resolveMethodEx, outputDir) :> IDependencyManagerProvider)
9798

9899
interface IDependencyManagerProvider with
99100

100101
member __.Name = instance |> nameProperty
101102

102103
member __.Key = instance |> keyProperty
103-
member this.ResolveDependencies(scriptDir, packageManagerTextLines, tfm) =
104+
105+
member this.ResolveDependencies(scriptDir, mainScriptName, scriptName, scriptExt, packageManagerTextLines, tfm) =
104106

105107
let key = (this :> IDependencyManagerProvider).Key
106108
let triggerEvent (evt: Event<string * string>) =
107109
for prLine in packageManagerTextLines do
108110
evt.Trigger(key, prLine)
109111
triggerEvent dependencyAddingEvent
110-
let arguments = [| box scriptDir; box packageManagerTextLines; box tfm |]
111-
let succeeded, generatedScripts, additionalIncludeFolders = resolveDeps.Invoke(instance, arguments) :?> _
112+
113+
114+
// The ResolveDependencies method, has two signatures, the original signaature in the variable resolveDeps and the updated signature resoveDepsEx
115+
// The resolve method can return values in two different tuples:
116+
// (bool * string list * string list * string list)
117+
// (bool * string list * string list)
118+
//
119+
// We use reflection to get the correct method and to determine what we got back.
120+
//
121+
let method, arguments =
122+
if resolveDepsEx.IsSome then
123+
resolveDepsEx, [| box scriptExt; box packageManagerTextLines; box tfm |]
124+
elif resolveDeps.IsSome then
125+
resolveDeps, [| box scriptDir; box mainScriptName; box scriptName; box packageManagerTextLines; box tfm |]
126+
else
127+
None, [||]
128+
129+
let succeeded, references, generatedScripts, additionalIncludeFolders =
130+
let empty = List.empty<string>
131+
let result =
132+
match method with
133+
| Some m -> m.Invoke(instance, arguments) :?> _
134+
| None -> false, empty, empty, empty
135+
136+
// Verify the number of arguments returned in the tuple returned by resolvedependencies, it can be:
137+
// 4 - (bool * string list * string list * string list)
138+
// 3 - (bool * string list * string list)
139+
let tupleFields = result |> FSharpValue.GetTupleFields
140+
match tupleFields |> Array.length with
141+
| 4 -> tupleFields.[0] :?> bool, tupleFields.[1] :?> string list, tupleFields.[2] :?> string list, tupleFields.[3] :?> string list
142+
| 3 -> tupleFields.[0] :?> bool, empty, tupleFields.[1] :?> string list, tupleFields.[2] :?> string list
143+
| _ -> false, empty, empty, empty
112144

113145
for prLine in packageManagerTextLines do
114146
if succeeded then
115-
dependencyAddedEvent.Trigger(key, prLine, generatedScripts, additionalIncludeFolders)
147+
dependencyAddedEvent.Trigger(key, prLine, references, generatedScripts, additionalIncludeFolders)
116148
else
117149
dependencyFailedEvent.Trigger(key, prLine)
118150

@@ -203,9 +235,9 @@ let tryFindDependencyManagerByKey (compilerTools: string list) (outputDir:string
203235
errorR(Error(FSComp.SR.packageManagerError(e.Message), m))
204236
None
205237

206-
let resolve (packageManager:IDependencyManagerProvider) scriptExt m packageManagerTextLines =
238+
let resolve (packageManager:IDependencyManagerProvider) implicitIncludeDir mainScriptName fileName scriptExt m packageManagerTextLines =
207239
try
208-
Some(packageManager.ResolveDependencies(scriptExt, packageManagerTextLines, executionTfm))
240+
Some(packageManager.ResolveDependencies(implicitIncludeDir, mainScriptName, fileName, scriptExt, packageManagerTextLines, executionTfm))
209241
with e ->
210242
let e = ReflectionHelper.stripTieWrapper e
211243
errorR(Error(FSComp.SR.packageManagerError(e.Message), m))

src/fsharp/DependencyManager.Integration.fsi

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@ open FSharp.Compiler.Range
88
type IDependencyManagerProvider =
99
abstract Name: string
1010
abstract Key: string
11-
abstract ResolveDependencies: scriptExt: string * packageManagerTextLines: string seq * tfm: string -> bool * string list * string list
11+
abstract ResolveDependencies: scriptDir: string * mainScriptName: string * scriptName: string * scriptExt: string * packageManagerTextLines: string seq * tfm: string -> bool * string list * string list
1212
abstract DependencyAdding: IEvent<string * string>
13-
abstract DependencyAdded: IEvent<string * string * string list * string list>
13+
abstract DependencyAdded: IEvent<string * string * string list * string list * string list>
1414
abstract DependencyFailed: IEvent<string * string>
1515

1616
[<RequireQualifiedAccess>]
@@ -23,4 +23,5 @@ val tryFindDependencyManagerInPath: string list -> string option -> range -> str
2323
val tryFindDependencyManagerByKey: string list -> string option -> range -> string -> IDependencyManagerProvider option
2424
val removeDependencyManagerKey: string -> string -> string
2525
val createPackageManagerUnknownError: string list -> string option -> string -> range -> exn
26-
val resolve: IDependencyManagerProvider -> string -> range -> string seq -> (bool * string list * string list) option
26+
val resolve: IDependencyManagerProvider -> string -> string -> string -> string -> range -> string seq -> (bool * string list * string list) option
27+

src/fsharp/FSharp.Compiler.Private.Scripting/FSharp.Compiler.Private.Scripting.fsproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<ItemGroup>
2121
<ProjectReference Include="$(MSBuildThisFileDirectory)..\FSharp.Core\FSharp.Core.fsproj" />
2222
<ProjectReference Include="$(MSBuildThisFileDirectory)..\FSharp.Compiler.Private\FSharp.Compiler.Private.fsproj" />
23-
<ProjectReference Include="$(MSBuildThisFileDirectory)..\FSharp.DependencyManager\FSharp.DependencyManager.fsproj" />
23+
<ProjectReference Include="$(MSBuildThisFileDirectory)..\FSharp.DependencyManager.Nuget\FSharp.DependencyManager.Nuget.fsproj" />
2424
<ProjectReference Include="$(MSBuildThisFileDirectory)..\FSharp.Compiler.Interactive.Settings\FSharp.Compiler.Interactive.Settings.fsproj" />
2525
</ItemGroup>
2626

src/fsharp/FSharp.Compiler.Private.Scripting/FSharp.Compiler.Private.Scripting.nuspec

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.Compiler.Private.Scripting.xml" target="lib\netstandard2.0" />
1717
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.Compiler.Private.dll" target="lib\netstandard2.0" />
1818
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.Compiler.Private.xml" target="lib\netstandard2.0" />
19-
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.DependencyManager.dll" target="lib\netstandard2.0" />
20-
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.DependencyManager.xml" target="lib\netstandard2.0" />
19+
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.DependencyManager.Nuget.dll" target="lib\netstandard2.0" />
20+
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.DependencyManager.Nuget.xml" target="lib\netstandard2.0" />
2121
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.Compiler.Interactive.Settings.dll" target="lib\netstandard2.0" />
2222
<file src="FSharp.Compiler.Private.Scripting\$Configuration$\$TargetFramework$\FSharp.Compiler.Interactive.Settings.xml" target="lib\netstandard2.0" />
2323
</files>
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
FSharp.DependencyManager.Nuget.nuget.props

src/fsharp/FSharp.DependencyManager/FSDependencyManager.txt renamed to src/fsharp/FSharp.DependencyManager.Nuget/FSDependencyManager.txt

File renamed without changes.

src/fsharp/FSharp.DependencyManager/FSharp.DependencyManager.fsproj renamed to src/fsharp/FSharp.DependencyManager.Nuget/FSharp.DependencyManager.Nuget.fsproj

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<PropertyGroup>
66
<OutputType>Library</OutputType>
77
<TargetFrameworks>netstandard2.0</TargetFrameworks>
8-
<AssemblyName>FSharp.DependencyManager</AssemblyName>
8+
<AssemblyName>FSharp.DependencyManager.Nuget</AssemblyName>
99
<NoWarn>$(NoWarn);45;55;62;75;1204</NoWarn>
1010
<AllowCrossTargeting>true</AllowCrossTargeting>
1111
<DefineConstants>$(DefineConstants);COMPILER</DefineConstants>
@@ -23,11 +23,15 @@
2323
<ItemGroup>
2424
<EmbeddedText Include="FSDependencyManager.txt" />
2525
<Compile Include="$(FSharpSourcesRoot)\utils\CompilerLocationUtils.fs" />
26-
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager\FSharp.DependencyManager.ProjectFile.fs" />
27-
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager\FSharp.DependencyManager.Utilities.fs" />
28-
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager\FSharp.DependencyManager.fs" />
26+
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager.Nuget\FSharp.DependencyManager.ProjectFile.fs" />
27+
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager.Nuget\FSharp.DependencyManager.Utilities.fs" />
28+
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager.Nuget\FSharp.DependencyManager.fsi" />
29+
<Compile Include="$(FSharpSourcesRoot)\fsharp\FSharp.DependencyManager.Nuget\FSharp.DependencyManager.fs" />
2930
</ItemGroup>
3031

32+
<ItemGroup>
33+
<InternalsVisibleTo Include="FSharp.Compiler.Private.Scripting.UnitTests" />
34+
</ItemGroup>
3135

3236
<ItemGroup>
3337
<ProjectReference Include="$(MSBuildThisFileDirectory)..\FSharp.Core\FSharp.Core.fsproj" />

src/fsharp/FSharp.DependencyManager/FSharp.DependencyManager.ProjectFile.fs renamed to src/fsharp/FSharp.DependencyManager.Nuget/FSharp.DependencyManager.ProjectFile.fs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
// Copyright (c) Microsoft Corporation. All Rights Reserved. See License.txt in the project root for license information.
2-
namespace FSharp.DependencyManager
2+
namespace FSharp.DependencyManager.Nuget
33

44
open System
55
open System.Collections
@@ -21,7 +21,7 @@ type PackageReference = {
2121

2222

2323
// Resolved assembly information
24-
type Resolution = {
24+
type internal Resolution = {
2525
NugetPackageId : string
2626
NugetPackageVersion : string
2727
PackageRoot : string
@@ -31,30 +31,38 @@ type Resolution = {
3131
InitializeSourcePath : string }
3232

3333

34-
module ProjectFile =
34+
module internal ProjectFile =
3535

3636
let findLoadsFromResolutions (resolutions:Resolution array) =
3737
resolutions
3838
|> Array.filter(fun r -> not(String.IsNullOrEmpty(r.NugetPackageId) ||
3939
String.IsNullOrEmpty(r.InitializeSourcePath)) &&
40-
File.Exists(r.InitializeSourcePath))
40+
File.Exists(r.InitializeSourcePath))
4141
|> Array.map(fun r -> r.InitializeSourcePath)
4242
|> Array.distinct
4343

44+
let findReferencesFromResolutions (resolutions:Resolution array) =
45+
resolutions
46+
|> Array.filter(fun r -> not(String.IsNullOrEmpty(r.NugetPackageId)) &&
47+
File.Exists(r.FullPath))
48+
|> Array.map(fun r -> r.FullPath)
49+
|> Array.distinct
50+
51+
4452
let findIncludesFromResolutions (resolutions:Resolution array) =
4553
let managedRoots =
4654
resolutions
4755
|> Array.filter(fun r -> not(String.IsNullOrEmpty(r.NugetPackageId) ||
4856
String.IsNullOrEmpty(r.PackageRoot)) &&
49-
Directory.Exists(r.PackageRoot))
57+
Directory.Exists(r.PackageRoot))
5058
|> Array.map(fun r -> r.PackageRoot)
5159
|> Array.distinct
5260

5361
let nativeRoots =
5462
resolutions
5563
|> Array.filter(fun r -> not(String.IsNullOrEmpty(r.NugetPackageId) ||
5664
String.IsNullOrEmpty(r.NativePath)) &&
57-
Directory.Exists(r.NativePath))
65+
Directory.Exists(r.NativePath))
5866
|> Array.map(fun r -> r.NativePath)
5967
|> Array.distinct
6068

0 commit comments

Comments
 (0)