@@ -3520,34 +3520,37 @@ let PostParseModuleSpecs (defaultNamespace, filename, isLastCompiland, ParsedSig
35203520
35213521 ParsedInput.SigFile( ParsedSigFileInput( filename, qualName, scopedPragmas, hashDirectives, specs))
35223522
3523+ type ModuleNamesDict = Map< string, Map< string, QualifiedNameOfFile>>
3524+
35233525/// Checks if a module name is already given and deduplicates the name if needed.
3524- let DeduplicateModuleName ( moduleNamesDict : IDictionary < string , Set < string >>) ( paths : Set < string >) path ( qualifiedNameOfFile : QualifiedNameOfFile ) =
3525- let count = if paths.Contains paththen paths.Countelse paths.Count+ 1
3526- moduleNamesDict.[ qualifiedNameOfFile.Text] <- Set.add path paths
3527- let id = qualifiedNameOfFile.Id
3528- if count= 1 then qualifiedNameOfFileelse QualifiedNameOfFile( Ident( id.idText+ " ___" + count.ToString(), id.idRange))
3526+ let DeduplicateModuleName ( moduleNamesDict : ModuleNamesDict ) fileName ( qualNameOfFile : QualifiedNameOfFile ) =
3527+ let path = Path.GetDirectoryName fileName
3528+ let path = if FileSystem.IsPathRootedShim paththen try FileSystem.GetFullPathShim pathwith _ -> pathelse path
3529+ match moduleNamesDict.TryGetValue qualNameOfFile.Textwith
3530+ | true , paths->
3531+ if paths.ContainsKey paththen
3532+ paths.[ path], moduleNamesDict
3533+ else
3534+ let count = paths.Count+ 1
3535+ let id = qualNameOfFile.Id
3536+ let qualNameOfFileT = if count= 1 then qualNameOfFileelse QualifiedNameOfFile( Ident( id.idText+ " ___" + count.ToString(), id.idRange))
3537+ let moduleNamesDictT = moduleNamesDict.Add( qualNameOfFile.Text, paths.Add( path, qualNameOfFileT))
3538+ qualNameOfFileT, moduleNamesDictT
3539+ | _ ->
3540+ let moduleNamesDictT = moduleNamesDict.Add( qualNameOfFile.Text, Map.empty.Add( path, qualNameOfFile))
3541+ qualNameOfFile, moduleNamesDictT
35293542
35303543/// Checks if a ParsedInput is using a module name that was already given and deduplicates the name if needed.
3531- let DeduplicateParsedInputModuleName ( moduleNamesDict : IDictionary < string , Set < string >> )input =
3544+ let DeduplicateParsedInputModuleName ( moduleNamesDict : ModuleNamesDict ) input =
35323545match inputwith
3533- | ParsedInput.ImplFile( ParsedImplFileInput.ParsedImplFileInput( fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, ( isLastCompiland, isExe))) ->
3534- let path = Path.GetDirectoryName fileName
3535- match moduleNamesDict.TryGetValue qualifiedNameOfFile.Textwith
3536- | true , paths->
3537- let qualifiedNameOfFile = DeduplicateModuleName moduleNamesDict paths path qualifiedNameOfFile
3538- ParsedInput.ImplFile( ParsedImplFileInput.ParsedImplFileInput( fileName, isScript, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules, ( isLastCompiland, isExe)))
3539- | _ ->
3540- moduleNamesDict.[ qualifiedNameOfFile.Text] <- Set.singleton path
3541- input
3542- | ParsedInput.SigFile( ParsedSigFileInput.ParsedSigFileInput( fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules)) ->
3543- let path = Path.GetDirectoryName fileName
3544- match moduleNamesDict.TryGetValue qualifiedNameOfFile.Textwith
3545- | true , paths->
3546- let qualifiedNameOfFile = DeduplicateModuleName moduleNamesDict paths path qualifiedNameOfFile
3547- ParsedInput.SigFile( ParsedSigFileInput.ParsedSigFileInput( fileName, qualifiedNameOfFile, scopedPragmas, hashDirectives, modules))
3548- | _ ->
3549- moduleNamesDict.[ qualifiedNameOfFile.Text] <- Set.singleton path
3550- input
3546+ | ParsedInput.ImplFile( ParsedImplFileInput.ParsedImplFileInput( fileName, isScript, qualNameOfFile, scopedPragmas, hashDirectives, modules, ( isLastCompiland, isExe))) ->
3547+ let qualNameOfFileT , moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile
3548+ let inputT = ParsedInput.ImplFile( ParsedImplFileInput.ParsedImplFileInput( fileName, isScript, qualNameOfFileT, scopedPragmas, hashDirectives, modules, ( isLastCompiland, isExe)))
3549+ inputT, moduleNamesDictT
3550+ | ParsedInput.SigFile( ParsedSigFileInput.ParsedSigFileInput( fileName, qualNameOfFile, scopedPragmas, hashDirectives, modules)) ->
3551+ let qualNameOfFileT , moduleNamesDictT = DeduplicateModuleName moduleNamesDict fileName qualNameOfFile
3552+ let inputT = ParsedInput.SigFile( ParsedSigFileInput.ParsedSigFileInput( fileName, qualNameOfFileT, scopedPragmas, hashDirectives, modules))
3553+ inputT, moduleNamesDictT
35513554
35523555let ParseInput ( lexer , errorLogger : ErrorLogger , lexbuf : UnicodeLexing.Lexbuf , defaultNamespace , filename , isLastCompiland ) =
35533556// The assert below is almost ok, but it fires in two cases: