From 5b0ba265b5fc1b53ca94520ba3e9f8c7dd42b4cd Mon Sep 17 00:00:00 2001 From: Petr Pokorny Date: Tue, 16 Aug 2022 20:15:58 +0200 Subject: [PATCH] Custom equality on ModuleOrNamespaceKind (#13693) --- src/Compiler/TypedTree/TypedTree.fs | 17 ++++++++++ src/Compiler/TypedTree/TypedTree.fsi | 1 + .../ModuleDefinitions/ModuleDefinitions.fs | 33 +++++++++++++++++++ 3 files changed, 51 insertions(+) diff --git a/src/Compiler/TypedTree/TypedTree.fs b/src/Compiler/TypedTree/TypedTree.fs index 39d090939..b3fcdd6c7 100644 --- a/src/Compiler/TypedTree/TypedTree.fs +++ b/src/Compiler/TypedTree/TypedTree.fs @@ -475,6 +475,7 @@ exception UndefinedName of exception InternalUndefinedItemRef of (string * string * string -> int * string) * string * string * string +[] type ModuleOrNamespaceKind = /// Indicates that a module is compiled to a class with the "Module" suffix added. @@ -488,6 +489,22 @@ type ModuleOrNamespaceKind = /// Indicates that the sourcecode had a namespace. /// If false, this namespace was implicitly constructed during type checking. isExplicit: bool + + override this.Equals other = + match other with + | :? ModuleOrNamespaceKind as kind -> + match this, kind with + | FSharpModuleWithSuffix, FSharpModuleWithSuffix + | ModuleOrType, ModuleOrType + | Namespace _, Namespace _ -> true + | _ -> false + | _ -> false + + override this.GetHashCode () = + match this with + | FSharpModuleWithSuffix -> 0 + | ModuleOrType -> 1 + | Namespace _ -> 2 /// A public path records where a construct lives within the global namespace /// of a CCU. diff --git a/src/Compiler/TypedTree/TypedTree.fsi b/src/Compiler/TypedTree/TypedTree.fsi index 2487daf35..d55e5e407 100644 --- a/src/Compiler/TypedTree/TypedTree.fsi +++ b/src/Compiler/TypedTree/TypedTree.fsi @@ -294,6 +294,7 @@ exception UndefinedName of depth: int * error: (string -> string) * id: Ident * exception InternalUndefinedItemRef of (string * string * string -> int * string) * string * string * string +[] type ModuleOrNamespaceKind = /// Indicates that a module is compiled to a class with the "Module" suffix added. diff --git a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicTypeAndModuleDefinitions/ModuleDefinitions/ModuleDefinitions.fs b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicTypeAndModuleDefinitions/ModuleDefinitions/ModuleDefinitions.fs index af33f5c0f..65d694c96 100644 --- a/tests/FSharp.Compiler.ComponentTests/Conformance/BasicTypeAndModuleDefinitions/ModuleDefinitions/ModuleDefinitions.fs +++ b/tests/FSharp.Compiler.ComponentTests/Conformance/BasicTypeAndModuleDefinitions/ModuleDefinitions/ModuleDefinitions.fs @@ -318,3 +318,36 @@ module ModuleDefinitions = |> withReferences [libFoo2; libFoo1] |> verifyCompileAndRun |> shouldSucceed + + [] + let ``Regression: compilation error with private types in namespace used in a different file`` () = + let types = + """ + namespace FsErrorRepro + + type private Blah = { Number: int } + """ + let example = + """ + [] + module FsErrorRepro.Example + + let dummy (blahNum: int) = + let blah : Blah = { Number = blahNum } + printf $"%i{blah.Number}" + """ + let program = + """ + module FsErrorRepro.Main + + [] + let main _ = + Example.dummy 15 + 0 + """ + + FSharp types + |> withAdditionalSourceFiles [SourceCodeFileKind.Create("example.fs", example) + SourceCodeFileKind.Create("program.fs", program)] + |> compile + |> shouldSucceed -- GitLab