@@ -8,6 +8,7 @@ open System.IO
88open System.Reflection
99open FSharp.Compiler .DotNetFrameworkDependencies
1010open FSharp.Compiler .ErrorLogger
11+ open FSharp.Reflection
1112open Internal.Utilities .FSharpEnvironment
1213
1314// Contract strings
@@ -62,9 +63,9 @@ module ReflectionHelper =
6263type 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))
0 commit comments