@@ -2199,7 +2199,7 @@ type TcConfigBuilder =
21992199 mutable productNameForBannerText: string
22002200 /// show the MS (c) notice, e.g. with help or fsi?
22012201 mutable showBanner: bool
2202-
2202+
22032203 /// show times between passes?
22042204 mutable showTimes: bool
22052205 mutable showLoadedAssemblies: bool
@@ -2229,7 +2229,7 @@ type TcConfigBuilder =
22292229 mutable emitDebugInfoInQuotations: bool
22302230
22312231 mutable exename: string option
2232-
2232+
22332233 // If true - the compiler will copy FSharp.Core.dll along the produced binaries
22342234 mutable copyFSharpCore: CopyFSharpCoreFlag
22352235
@@ -2390,9 +2390,24 @@ type TcConfigBuilder =
23902390 noConditionalErasure = false
23912391 pathMap = PathMap.empty
23922392 langVersion = LanguageVersion( " default" )
2393- dependencyProvider = new DependencyProvider()
2393+ dependencyProvider = Unchecked.defaultof < DependencyProvider>
23942394 }
23952395
2396+ // Directories to start probing in
2397+ // Algorithm:
2398+ // Search for native libraries using:
2399+ // 1. Include directories
2400+ // 2. compilerToolPath directories
2401+ // 3. reference dll's
2402+ // 4. The implicit include directory
2403+ member private tcConfigB.nativeProbingRoots () =
2404+ seq {
2405+ yield ! tcConfigB.includes
2406+ yield ! tcConfigB.compilerToolPaths
2407+ yield ! ( tcConfigB.referencedDLLs |> Seq.map( fun ref -> Path.GetDirectoryName( ref.Text)))
2408+ yield tcConfigB.implicitIncludeDir
2409+ } |> Seq.distinct
2410+
23962411 static member CreateNew ( legacyReferenceResolver , defaultFSharpBinariesDir , reduceMemoryUsage , implicitIncludeDir ,
23972412 isInteractive , isInvalidationSupported , defaultCopyFSharpCore , tryGetMetadataSnapshot ) =
23982413
@@ -2401,17 +2416,20 @@ type TcConfigBuilder =
24012416 if ( String.IsNullOrEmpty defaultFSharpBinariesDir) then
24022417 failwith " Expected a valid defaultFSharpBinariesDir"
24032418
2404- { TcConfigBuilder.Initial with
2405- implicitIncludeDir = implicitIncludeDir
2406- defaultFSharpBinariesDir = defaultFSharpBinariesDir
2407- reduceMemoryUsage = reduceMemoryUsage
2408- legacyReferenceResolver = legacyReferenceResolver
2409- isInteractive = isInteractive
2410- isInvalidationSupported = isInvalidationSupported
2411- copyFSharpCore = defaultCopyFSharpCore
2412- tryGetMetadataSnapshot = tryGetMetadataSnapshot
2413- useFsiAuxLib = isInteractive
2414- }
2419+ let tcConfigBuilder =
2420+ { TcConfigBuilder.Initial with
2421+ implicitIncludeDir = implicitIncludeDir
2422+ defaultFSharpBinariesDir = defaultFSharpBinariesDir
2423+ reduceMemoryUsage = reduceMemoryUsage
2424+ legacyReferenceResolver = legacyReferenceResolver
2425+ isInteractive = isInteractive
2426+ isInvalidationSupported = isInvalidationSupported
2427+ copyFSharpCore = defaultCopyFSharpCore
2428+ tryGetMetadataSnapshot = tryGetMetadataSnapshot
2429+ useFsiAuxLib = isInteractive
2430+ }
2431+ tcConfigBuilder.dependencyProvider <- new DependencyProvider( NativeResolutionProbe( tcConfigBuilder.nativeProbingRoots))
2432+ tcConfigBuilder
24152433
24162434 member tcConfigB.ResolveSourceFile ( m , nm , pathLoadedFrom ) =
24172435 use unwindBuildPhase = PushThreadBuildPhaseUntilUnwind BuildPhase.Parameter
@@ -4964,10 +4982,13 @@ let ProcessMetaCommandsFromInput
49644982 if not canHaveScriptMetaCommands then
49654983 errorR( HashReferenceNotAllowedInNonScript m)
49664984
4967- let reportError errorType error =
4968- match errorType with
4969- | ErrorReportType.Warning -> warning( Error( error, m))
4970- | ErrorReportType.Error -> errorR( Error( error, m))
4985+ let reportError =
4986+ let report errorType err msg =
4987+ let error = err, msg
4988+ match errorType with
4989+ | ErrorReportType.Warning -> warning( Error( error, m))
4990+ | ErrorReportType.Error -> errorR( Error( error, m))
4991+ ResolvingErrorReport ( report)
49714992
49724993 match args with
49734994 | [ path] ->
@@ -5257,10 +5278,13 @@ module ScriptPreprocessClosure =
52575278 match packageManagerLines with
52585279 | [] -> ()
52595280 | (_, _, m)::_ ->
5260- let reportError errorType error =
5261- match errorType with
5262- | ErrorReportType.Warning -> warning( Error( error, m))
5263- | ErrorReportType.Error -> errorR( Error( error, m))
5281+ let reportError =
5282+ let report errorType err msg =
5283+ let error = err, msg
5284+ match errorType with
5285+ | ErrorReportType.Warning -> warning( Error( error, m))
5286+ | ErrorReportType.Error -> errorR( Error( error, m))
5287+ ResolvingErrorReport ( report)
52645288
52655289 match origTcConfig.packageManagerLines |> Map.tryFind packageManagerKey with
52665290 | Some oldDependencyManagerLines when oldDependencyManagerLines = packageManagerLines -> ()
@@ -5273,22 +5297,23 @@ module ScriptPreprocessClosure =
52735297 | dependencyManager ->
52745298 let inline snd3 ( _ , b , _ ) = b
52755299 let packageManagerTextLines = packageManagerLines |> List.map snd3
5276- match tcConfig.dependencyProvider.Resolve( dependencyManager, tcConfig.implicitIncludeDir, mainFile, scriptName, " .fsx" , packageManagerTextLines, reportError, executionTfm) with
5277- | true , _ references, generatedScripts, additionalIncludeFolders ->
5300+ let result = tcConfig.dependencyProvider.Resolve( dependencyManager, " .fsx" , packageManagerTextLines, reportError, executionTfm, tcConfig.implicitIncludeDir, mainFile, scriptName)
5301+ match result.Success with
5302+ | true ->
52785303 // Resolution produced no errors
5279- if not ( Seq.isEmpty additionalIncludeFolders ) then
5304+ if not ( Seq.isEmpty result.Roots ) then
52805305 let tcConfigB = tcConfig.CloneOfOriginalBuilder
5281- for folder in additionalIncludeFolders do
5306+ for folder in result.Roots do
52825307 tcConfigB.AddIncludePath( m, folder, " " )
52835308 tcConfigB.packageManagerLines <- tcConfigB.packageManagerLines |> Map.map( fun _ l -> l |> List.map( fun ( _ , p , m ) -> true , p, m))
52845309 tcConfig <- TcConfig.Create( tcConfigB, validate= false )
5285- for script in generatedScripts do
5310+ for script in result.SourceFiles do
52865311 let scriptText = File.ReadAllText script
52875312 loadScripts.Add script |> ignore
52885313 let iSourceText = SourceText.ofString scriptText
52895314 yield ! loop ( ClosureSource( script, m, iSourceText, true ))
52905315
5291- | false , _, _, _ ->
5316+ | false ->
52925317 // Resolution produced errors update packagerManagerLines entries to note these failure
52935318 // failed resolutions will no longer be considered
52945319 let tcConfigB = tcConfig.CloneOfOriginalBuilder
0 commit comments