Skip to content

Commit b5fc8c6

Browse files
KevinRansomcartermp
authored andcommitted
Refactor integration (#8574)
* Remove events from fsi * Change data types * temp * Refactor dm integration into new dll * More refactor and tests * sigs * Fix interactivetext link * fix tests on non-windows * Update src/fsharp/Interactive.DependencyManager/DependencyManager.fs Co-Authored-By: Phillip Carter <[email protected]> * Update src/fsharp/Interactive.DependencyManager/DependencyManager.fs Co-Authored-By: Phillip Carter <[email protected]> * feedback Co-authored-by: Phillip Carter <[email protected]>
1 parent 1cf4afa commit b5fc8c6

17 files changed

+546
-415
lines changed

clean.sh

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#! /usr/bin/env bash
2+
3+
DEAD_DIRS=(
4+
"azure-pipelines.yml"
5+
"DEVGUIDE.md"
6+
"eng/common/templates"
7+
"FSharp.sln"
8+
"src/fsharp/fsc/fsc.fsproj"
9+
"src/fsharp/FSharp.Compiler.nuget/Microsoft.FSharp.Compiler.nuspec"
10+
"src/fsharp/FSharp.Compiler.Private/FSharp.Compiler.Private.fsproj"
11+
"src/fsharp/fsi/fsi.fsproj"
12+
"src/fsharp/fsiAnyCpu/fsiAnyCpu.fsproj"
13+
"src/fsharp/Interactive.DependencyManager/xlf"
14+
"src/fsharp/xlf"
15+
"TESTGUIDE.md"
16+
"tests/EndToEndBuildTests"
17+
"tests/FSharp.Compiler.Private.Scripting.UnitTests"
18+
"tests/FSharp.Compiler.UnitTests"
19+
"tests/FSharp.Core.UnitTests"
20+
"tests/fsharp/Compiler"
21+
"tests/fsharp/conformance"
22+
"tests/fsharp/core"
23+
"tests/fsharp/test-framework.fs"
24+
"tests/fsharp/tests.fs"
25+
"tests/fsharp/typecheck"
26+
"tests/fsharpqa"
27+
"VisualFSharp.sln"
28+
"vsintegration"
29+
)
30+
31+
git rm -rf --ignore-unmatch ${DEAD_DIRS[*]}

fcs/FSharp.Compiler.Service/FSharp.Compiler.Service.fsproj

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,9 @@
4949
<EmbeddedText Include="$(FSharpSourcesRoot)\fsharp\FSComp.txt">
5050
<Link>FSComp.txt</Link>
5151
</EmbeddedText>
52+
<EmbeddedText Include="$(FSharpSourcesRoot)\fsharp\Interactive.DependencyManager\InteractiveDependencyManager.txt">
53+
<Link>InteractiveDependencyManager.txt</Link>
54+
</EmbeddedText>
5255
<EmbeddedText Include="$(FSharpSourcesRoot)\fsharp\fsi\FSIstrings.txt">
5356
<Link>FSIstrings.txt</Link>
5457
</EmbeddedText>
@@ -522,11 +525,11 @@
522525
<Compile Include="$(FSharpSourcesRoot)/fsharp/DotNetFrameworkDependencies.fs">
523526
<Link>Driver\DotNetFrameworkDependencies.fs</Link>
524527
</Compile>
525-
<Compile Include="$(FSharpSourcesRoot)/fsharp/DependencyManager.Integration.fsi">
526-
<Link>Driver/DependencyManager.Integration.fsi</Link>
528+
<Compile Include="$(FSharpSourcesRoot)/fsharp/Interactive.DependencyManager/DependencyManager.fsi">
529+
<Link>Driver/DependencyManager.fsi</Link>
527530
</Compile>
528-
<Compile Include="$(FSharpSourcesRoot)/fsharp/DependencyManager.Integration.fs">
529-
<Link>Driver/DependencyManager.Integration.fs</Link>
531+
<Compile Include="$(FSharpSourcesRoot)/fsharp/Interactive.DependencyManager/DependencyManager.fs">
532+
<Link>Driver/DependencyManager.fs</Link>
530533
</Compile>
531534
<Compile Include="$(FSharpSourcesRoot)/fsharp/CompileOps.fsi">
532535
<Link>Driver/CompileOps.fsi</Link>

src/fsharp/CompileOps.fs

Lines changed: 76 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ open FSharp.Compiler.Text
5151

5252
open FSharp.Compiler.DotNetFrameworkDependencies
5353

54+
open Interactive.DependencyManager
55+
5456
#if !NO_EXTENSIONTYPING
5557
open FSharp.Compiler.ExtensionTyping
5658
open Microsoft.FSharp.Core.CompilerServices
@@ -2235,8 +2237,8 @@ type TcConfigBuilder =
22352237
mutable shadowCopyReferences: bool
22362238
mutable useSdkRefs: bool
22372239

2238-
/// A function to call to try to get an object that acts as a snapshot of the metadata section of a .NET binary,
2239-
/// and from which we can read the metadata. Only used when metadataOnly=true.
2240+
/// A function to call to try to get an object that acts as a snapshot of the metadata section of a .NET binary,
2241+
/// and from which we can read the metadata. Only used when metadataOnly=true.
22402242
mutable tryGetMetadataSnapshot: ILReaderTryGetMetadataSnapshot
22412243

22422244
mutable internalTestSpanStackReferring: bool
@@ -2246,6 +2248,8 @@ type TcConfigBuilder =
22462248
mutable pathMap: PathMap
22472249

22482250
mutable langVersion: LanguageVersion
2251+
2252+
mutable dependencyProvider: DependencyProvider
22492253
}
22502254

22512255
static member Initial =
@@ -2386,6 +2390,7 @@ type TcConfigBuilder =
23862390
noConditionalErasure = false
23872391
pathMap = PathMap.empty
23882392
langVersion = LanguageVersion("default")
2393+
dependencyProvider = new DependencyProvider()
23892394
}
23902395

23912396
static member CreateNew(legacyReferenceResolver, defaultFSharpBinariesDir, reduceMemoryUsage, implicitIncludeDir,
@@ -2495,7 +2500,6 @@ type TcConfigBuilder =
24952500
if not (List.contains path (List.map (fun (_, _, path) -> path) tcConfigB.loadedSources)) then
24962501
tcConfigB.loadedSources <- tcConfigB.loadedSources ++ (m, originalPath, path)
24972502

2498-
24992503
member tcConfigB.AddEmbeddedSourceFile (file) =
25002504
tcConfigB.embedSourceList <- tcConfigB.embedSourceList ++ file
25012505

@@ -2515,8 +2519,8 @@ type TcConfigBuilder =
25152519
let projectReference = tcConfigB.projectReferences |> List.tryPick (fun pr -> if pr.FileName = path then Some pr else None)
25162520
tcConfigB.referencedDLLs <- tcConfigB.referencedDLLs ++ AssemblyReference(m, path, projectReference)
25172521

2518-
member tcConfigB.AddDependencyManagerText (packageManager:DependencyManagerIntegration.IDependencyManagerProvider, m, path:string) =
2519-
let path = DependencyManagerIntegration.removeDependencyManagerKey packageManager.Key path
2522+
member tcConfigB.AddDependencyManagerText (packageManager:IDependencyManagerProvider, m, path:string) =
2523+
let path = tcConfigB.dependencyProvider.RemoveDependencyManagerKey(packageManager.Key, path)
25202524

25212525
match tcConfigB.packageManagerLines |> Map.tryFind packageManager.Key with
25222526
| Some lines -> tcConfigB.packageManagerLines <- Map.add packageManager.Key (lines ++ (false, path, m)) tcConfigB.packageManagerLines
@@ -2842,6 +2846,9 @@ type TcConfig private (data: TcConfigBuilder, validate: bool) =
28422846
TcConfig(builder, validate)
28432847

28442848
member x.legacyReferenceResolver = data.legacyReferenceResolver
2849+
2850+
member x.dependencyProvider = data.dependencyProvider
2851+
28452852
member tcConfig.CloneOfOriginalBuilder =
28462853
{ data with conditionalCompilationDefines=data.conditionalCompilationDefines }
28472854

@@ -4924,7 +4931,7 @@ let RequireDLL (ctok, tcImports: TcImports, tcEnv, thisAssemblyName, m, file) =
49244931
let ProcessMetaCommandsFromInput
49254932
(nowarnF: 'state -> range * string -> 'state,
49264933
dllRequireF: 'state -> range * string -> 'state,
4927-
packageRequireF: 'state -> DependencyManagerIntegration.IDependencyManagerProvider * range * string -> 'state,
4934+
packageRequireF: 'state -> IDependencyManagerProvider * range * string -> 'state,
49284935
loadSourceF: 'state -> range * string -> unit)
49294936
(tcConfig:TcConfigBuilder, inp, pathOfMetaCommandSource, state0) =
49304937

@@ -4944,7 +4951,7 @@ let ProcessMetaCommandsFromInput
49444951
errorR(HashIncludeNotAllowedInNonScript m)
49454952
match args with
49464953
| [path] ->
4947-
matchedm<-m
4954+
matchedm <- m
49484955
tcConfig.AddIncludePath(m, path, pathOfMetaCommandSource)
49494956
state
49504957
| _ ->
@@ -4954,27 +4961,35 @@ let ProcessMetaCommandsFromInput
49544961
List.fold (fun state d -> nowarnF state (m,d)) state numbers
49554962

49564963
| ParsedHashDirective(("reference" | "r"),args,m) ->
4957-
if not canHaveScriptMetaCommands then
4958-
errorR(HashReferenceNotAllowedInNonScript m)
4964+
if not canHaveScriptMetaCommands then
4965+
errorR(HashReferenceNotAllowedInNonScript m)
4966+
4967+
let reportError errorType error =
4968+
match errorType with
4969+
| ErrorReportType.Warning -> warning(Error(error,m))
4970+
| ErrorReportType.Error -> errorR(Error(error, m))
4971+
4972+
match args with
4973+
| [path] ->
4974+
matchedm <- m
4975+
let output = tcConfig.outputDir |> Option.defaultValue ""
4976+
let dm = tcConfig.dependencyProvider.TryFindDependencyManagerInPath(tcConfig.compilerToolPaths, output , reportError, path)
4977+
match dm with
4978+
| dllpath, null when String.IsNullOrWhiteSpace(dllpath) ->
4979+
state // error already reported
4980+
4981+
| _, dependencyManager when not(isNull dependencyManager) ->
4982+
if tcConfig.langVersion.SupportsFeature(LanguageFeature.PackageManagement) then
4983+
packageRequireF state (dependencyManager, m, path)
4984+
else
4985+
errorR(Error(FSComp.SR.packageManagementRequiresVFive(), m))
4986+
state
49594987

4960-
match args with
4961-
| [path] ->
4962-
matchedm <- m
4963-
match DependencyManagerIntegration.tryFindDependencyManagerInPath tcConfig.compilerToolPaths tcConfig.outputDir m (path:string) with
4964-
| DependencyManagerIntegration.ReferenceType.RegisteredDependencyManager packageManager ->
4965-
if tcConfig.langVersion.SupportsFeature(LanguageFeature.PackageManagement) then
4966-
packageRequireF state (packageManager,m,path)
4967-
else
4968-
errorR(Error(FSComp.SR.packageManagementRequiresVFive(), m))
4969-
state
4970-
4971-
// #r "Assembly"
4972-
| DependencyManagerIntegration.ReferenceType.Library path ->
4973-
dllRequireF state (m,path)
4974-
4975-
| DependencyManagerIntegration.ReferenceType.UnknownType ->
4976-
state // error already reported
4977-
| _ ->
4988+
// #r "Assembly"
4989+
| path, _ ->
4990+
dllRequireF state (m, path)
4991+
4992+
| _ ->
49784993
errorR(Error(FSComp.SR.buildInvalidHashrDirective(), m))
49794994
state
49804995

@@ -5227,10 +5242,10 @@ module ScriptPreprocessClosure =
52275242
// Recover by using a default TcConfig.
52285243
let tcConfigB = tcConfig.CloneOfOriginalBuilder
52295244
TcConfig.Create(tcConfigB, validate=false), nowarns
5230-
5245+
52315246
let FindClosureFiles(mainFile, _m, closureSources, origTcConfig:TcConfig, codeContext, lexResourceManager: Lexhelp.LexResourceManager) =
52325247
let mutable tcConfig = origTcConfig
5233-
5248+
52345249
let observedSources = Observed()
52355250
let loadScripts = HashSet<_>()
52365251

@@ -5242,41 +5257,43 @@ module ScriptPreprocessClosure =
52425257
match packageManagerLines with
52435258
| [] -> ()
52445259
| (_, _, m)::_ ->
5245-
match tcConfig.packageManagerLines |> Map.tryFind packageManagerKey with
5260+
let reportError errorType error =
5261+
match errorType with
5262+
| ErrorReportType.Warning -> warning(Error(error,m))
5263+
| ErrorReportType.Error -> errorR(Error(error, m))
5264+
5265+
match origTcConfig.packageManagerLines |> Map.tryFind packageManagerKey with
52465266
| Some oldDependencyManagerLines when oldDependencyManagerLines = packageManagerLines -> ()
52475267
| _ ->
5248-
match DependencyManagerIntegration.tryFindDependencyManagerByKey tcConfig.compilerToolPaths tcConfig.outputDir m packageManagerKey with
5249-
| None ->
5250-
errorR(DependencyManagerIntegration.createPackageManagerUnknownError tcConfig.compilerToolPaths tcConfig.outputDir packageManagerKey m)
5251-
| Some packageManager ->
5268+
let outputDir = tcConfig.outputDir |> Option.defaultValue ""
5269+
match tcConfig.dependencyProvider.TryFindDependencyManagerByKey(tcConfig.compilerToolPaths, outputDir, reportError, packageManagerKey) with
5270+
| null ->
5271+
errorR(Error(tcConfig.dependencyProvider.CreatePackageManagerUnknownError(tcConfig.compilerToolPaths, outputDir, packageManagerKey, reportError), m))
5272+
5273+
| dependencyManager ->
52525274
let inline snd3 (_, b, _) = b
52535275
let packageManagerTextLines = packageManagerLines |> List.map snd3
5254-
5255-
match DependencyManagerIntegration.resolve packageManager tcConfig.implicitIncludeDir mainFile scriptName ".fsx" m packageManagerTextLines with
5256-
| None -> () // error already reported
5257-
| Some (succeeded, generatedScripts, additionalIncludeFolders) ->
5258-
// This may incrementally update tcConfig too with new #r references
5259-
// New package text is ignored on this second phase
5260-
match succeeded with
5261-
| true ->
5262-
// Resolution produced no errors
5263-
if not (isNil additionalIncludeFolders) then
5264-
let tcConfigB = tcConfig.CloneOfOriginalBuilder
5265-
for folder in additionalIncludeFolders do
5266-
tcConfigB.AddIncludePath(m, folder, "")
5267-
tcConfigB.packageManagerLines <- tcConfigB.packageManagerLines |> Map.map(fun _ l -> l |> List.map(fun (_, p, m) -> true, p, m))
5268-
tcConfig <- TcConfig.Create(tcConfigB, validate=false)
5269-
for script in generatedScripts do
5270-
let scriptText = File.ReadAllText script
5271-
loadScripts.Add script |> ignore
5272-
let iSourceText = SourceText.ofString scriptText
5273-
yield! loop (ClosureSource(script, m, iSourceText, true))
5274-
| false ->
5275-
// Resolution produced errors update packagerManagerLines entries to note these failure
5276-
// failed resolutions will no longer be considered
5276+
match tcConfig.dependencyProvider.Resolve(dependencyManager, tcConfig.implicitIncludeDir, mainFile, scriptName, ".fsx", packageManagerTextLines, reportError, executionTfm) with
5277+
| true, _references, generatedScripts, additionalIncludeFolders ->
5278+
// Resolution produced no errors
5279+
if not (Seq.isEmpty additionalIncludeFolders) then
52775280
let tcConfigB = tcConfig.CloneOfOriginalBuilder
5278-
tcConfigB.packageManagerLines <- tcConfigB.packageManagerLines |> Map.map(fun _ l -> l |> List.filter(fun (tried, _, _) -> tried))
5279-
tcConfig <- TcConfig.Create(tcConfigB, validate=false)]
5281+
for folder in additionalIncludeFolders do
5282+
tcConfigB.AddIncludePath(m, folder, "")
5283+
tcConfigB.packageManagerLines <- tcConfigB.packageManagerLines |> Map.map(fun _ l -> l |> List.map(fun (_, p, m) -> true, p, m))
5284+
tcConfig <- TcConfig.Create(tcConfigB, validate=false)
5285+
for script in generatedScripts do
5286+
let scriptText = File.ReadAllText script
5287+
loadScripts.Add script |> ignore
5288+
let iSourceText = SourceText.ofString scriptText
5289+
yield! loop (ClosureSource(script, m, iSourceText, true))
5290+
5291+
| false, _, _, _ ->
5292+
// Resolution produced errors update packagerManagerLines entries to note these failure
5293+
// failed resolutions will no longer be considered
5294+
let tcConfigB = tcConfig.CloneOfOriginalBuilder
5295+
tcConfigB.packageManagerLines <- tcConfigB.packageManagerLines |> Map.map(fun _ l -> l |> List.filter(fun (tried, _, _) -> tried))
5296+
tcConfig <- TcConfig.Create(tcConfigB, validate=false)]
52805297
else []
52815298

52825299
and loop (ClosureSource(filename, m, sourceText, parseRequired)) =

src/fsharp/CompileOps.fsi

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ open Microsoft.FSharp.Core.CompilerServices
2727
open FSharp.Compiler.ExtensionTyping
2828
#endif
2929

30+
open Interactive.DependencyManager
3031

3132
#if DEBUG
3233

@@ -389,6 +390,9 @@ type TcConfigBuilder =
389390
mutable pathMap : PathMap
390391

391392
mutable langVersion : LanguageVersion
393+
394+
mutable dependencyProvider : DependencyProvider
395+
392396
}
393397

394398
static member Initial: TcConfigBuilder
@@ -685,7 +689,7 @@ val RequireDLL: CompilationThreadToken * TcImports * TcEnv * thisAssemblyName: s
685689

686690
/// Processing # commands
687691
val ProcessMetaCommandsFromInput :
688-
(('T -> range * string -> 'T) * ('T -> range * string -> 'T) * ('T -> DependencyManagerIntegration.IDependencyManagerProvider * range * string -> 'T) * ('T -> range * string -> unit))
692+
(('T -> range * string -> 'T) * ('T -> range * string -> 'T) * ('T -> IDependencyManagerProvider * range * string -> 'T) * ('T -> range * string -> unit))
689693
-> TcConfigBuilder * Ast.ParsedInput * string * 'T
690694
-> 'T
691695

0 commit comments

Comments
 (0)