diff --git a/src/fsharp/CompileOps.fs b/src/fsharp/CompileOps.fs index 0b0414ac5a1..0cab042759a 100644 --- a/src/fsharp/CompileOps.fs +++ b/src/fsharp/CompileOps.fs @@ -4,11 +4,12 @@ module internal Microsoft.FSharp.Compiler.CompileOps open System +open System.Collections.Concurrent +open System.Collections.Generic open System.Diagnostics -open System.Text open System.IO -open System.Collections.Generic open System.Runtime.CompilerServices +open System.Text open Internal.Utilities open Internal.Utilities.Text @@ -3509,14 +3510,14 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig ParsedInput.SigFile(ParsedSigFileInput(filename, qualName, scopedPragmas, hashDirectives, specs)) /// Checks if a module name is already given and deduplicates the name if needed. -let DeduplicateModuleName (moduleNamesDict:Dictionary>) (paths: Set) path (qualifiedNameOfFile: QualifiedNameOfFile) = +let DeduplicateModuleName (moduleNamesDict:IDictionary>) (paths: Set) path (qualifiedNameOfFile: QualifiedNameOfFile) = let count = if paths.Contains path then paths.Count else paths.Count + 1 moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.add path paths let id = qualifiedNameOfFile.Id if count = 1 then qualifiedNameOfFile else QualifiedNameOfFile(Ident(id.idText + "___" + count.ToString(), id.idRange)) /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -let DeduplicateParsedInputModuleName (moduleNamesDict:Dictionary>) input = +let DeduplicateParsedInputModuleName (moduleNamesDict:IDictionary>) input = match input with | ParsedInput.ImplFile (ParsedImplFileInput.ParsedImplFileInput(fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, (isLastCompiland, isExe))) -> let path = Path.GetDirectoryName fileName @@ -3525,7 +3526,7 @@ let DeduplicateParsedInputModuleName (moduleNamesDict:Dictionary - moduleNamesDict.Add(qualifiedNameOfFile.Text, Set.singleton path) + moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path input | ParsedInput.SigFile (ParsedSigFileInput.ParsedSigFileInput(fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) -> let path = Path.GetDirectoryName fileName @@ -3534,7 +3535,7 @@ let DeduplicateParsedInputModuleName (moduleNamesDict:Dictionary - moduleNamesDict.Add(qualifiedNameOfFile.Text, Set.singleton path) + moduleNamesDict.[qualifiedNameOfFile.Text] <- Set.singleton path input let ParseInput (lexer, errorLogger:ErrorLogger, lexbuf:UnicodeLexing.Lexbuf, defaultNamespace, filename, isLastCompiland) = diff --git a/src/fsharp/CompileOps.fsi b/src/fsharp/CompileOps.fsi index 8f782ccee16..77916b63f49 100755 --- a/src/fsharp/CompileOps.fsi +++ b/src/fsharp/CompileOps.fsi @@ -65,10 +65,10 @@ val ComputeQualifiedNameOfFileFromUniquePath: range * string list -> Ast.Qualifi val PrependPathToInput: Ast.Ident list -> Ast.ParsedInput -> Ast.ParsedInput /// Checks if a module name is already given and deduplicates the name if needed. -val DeduplicateModuleName: Dictionary> -> Set -> string -> Ast.QualifiedNameOfFile -> Ast.QualifiedNameOfFile +val DeduplicateModuleName: IDictionary> -> Set -> string -> Ast.QualifiedNameOfFile -> Ast.QualifiedNameOfFile /// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed. -val DeduplicateParsedInputModuleName: Dictionary> -> Ast.ParsedInput -> Ast.ParsedInput +val DeduplicateParsedInputModuleName: IDictionary> -> Ast.ParsedInput -> Ast.ParsedInput val ParseInput: (UnicodeLexing.Lexbuf -> Parser.token) * ErrorLogger * UnicodeLexing.Lexbuf * string option * string * isLastCompiland:(bool * bool) -> Ast.ParsedInput diff --git a/src/fsharp/fsc.fs b/src/fsharp/fsc.fs index 8aea32c097e..e18f782dc21 100644 --- a/src/fsharp/fsc.fs +++ b/src/fsharp/fsc.fs @@ -13,6 +13,7 @@ module internal Microsoft.FSharp.Compiler.Driver open System +open System.Collections.Concurrent open System.Collections.Generic open System.Diagnostics open System.Globalization @@ -1758,7 +1759,7 @@ let main0(ctok, argv, legacyReferenceResolver, bannerAlreadyPrinted, openBinarie let inputs = // Deduplicate module names - let moduleNamesDict = Dictionary>() + let moduleNamesDict = ConcurrentDictionary>() inputs |> List.map (fun (input,x) -> DeduplicateParsedInputModuleName moduleNamesDict input,x) diff --git a/src/fsharp/vs/IncrementalBuild.fs b/src/fsharp/vs/IncrementalBuild.fs index 5b429b2e708..6145eabe330 100755 --- a/src/fsharp/vs/IncrementalBuild.fs +++ b/src/fsharp/vs/IncrementalBuild.fs @@ -4,8 +4,9 @@ namespace Microsoft.FSharp.Compiler open System -open System.IO +open System.Collections.Concurrent open System.Collections.Generic +open System.IO open System.Threading open Microsoft.FSharp.Compiler open Microsoft.FSharp.Compiler.NameResolution @@ -1239,7 +1240,7 @@ type IncrementalBuilder(tcGlobals, frameworkTcImports, nonFrameworkAssemblyInput cache.GetFileTimeStamp filename // Deduplicate module names - let moduleNamesDict = Dictionary>() + let moduleNamesDict = ConcurrentDictionary>() /// This is a build task function that gets placed into the build rules as the computation for a VectorMap ///