From 0753aa53868b7f0639e87b5462126925af9ad539 Mon Sep 17 00:00:00 2001 From: Petr Pokorny Date: Mon, 15 Aug 2022 18:37:24 +0200 Subject: [PATCH 1/2] Custom equality on ModuleOrNamespaceKind --- 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 39d09093916..b3fcdd6c7d5 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 2487daf3517..9cf8eca5195 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 af33f5c0f1e..65d694c9647 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 From 0e177871ccaf959bc067db5eb2cc28a1119154d6 Mon Sep 17 00:00:00 2001 From: Petr Pokorny Date: Mon, 15 Aug 2022 18:51:53 +0200 Subject: [PATCH 2/2] Fantomas --- src/Compiler/TypedTree/TypedTree.fsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Compiler/TypedTree/TypedTree.fsi b/src/Compiler/TypedTree/TypedTree.fsi index 9cf8eca5195..d55e5e40706 100644 --- a/src/Compiler/TypedTree/TypedTree.fsi +++ b/src/Compiler/TypedTree/TypedTree.fsi @@ -294,7 +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.