Skip to content

Commit 6a482d6

Browse files
committed
Add tests for top-level modules and fix top-level item resolution in signature files - FCS now failing for a different reason.
1 parent 9048a96 commit 6a482d6

File tree

4 files changed

+90
-5
lines changed

4 files changed

+90
-5
lines changed

tests/ParallelTypeCheckingTests/Code/ASTVisit.fs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1327,10 +1327,17 @@ module TopModulesExtraction =
13271327
range,
13281328
synModuleOrNamespaceTrivia) ->
13291329
if mightHaveAutoOpen synAttributeLists then
1330-
// Contents of a module that's potentially AutoOpen are available everywhere, so treat it as if it had no name ('root' module).
1330+
// Contents of a module that's potentially AutoOpen are available from its parent without a prefix.
1331+
// Stay safe and as soon as the parent module is reachable, consider this module reachable as well
13311332
[| LongIdent.Empty |]
13321333
else
1333-
synModuleDecls |> moduleSigDecls |> combine longId
1334+
// 'module A.B' is equivalent to 'namespace A; module B', meaning that 'A' is opened implicitly
1335+
if
1336+
synModuleOrNamespaceKind.IsModule && longId.Length > 1
1337+
then
1338+
[| longId.GetSlice(None, Some <| longId.Length - 2); longId |]
1339+
else
1340+
[| longId |]
13341341

13351342
and moduleSigDecls (x: SynModuleSigDecl list) : Eit =
13361343
let emptyState = Eit.Nested [||]

tests/ParallelTypeCheckingTests/Code/ParallelTypeChecking.fs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#nowarn "1182"
44

5+
open System
56
open System.Collections.Concurrent
67
open System.Collections.Generic
78
open System.IO

tests/ParallelTypeCheckingTests/Tests/TestCompilationFromCmdlineArgs.fs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,14 +89,14 @@ let internal codebaseToConfig code method =
8989
WorkingDir = Some code.WorkDir
9090
}
9191

92+
/// Before running these tests, you must prepare the codebase by running the script 'FCS.prepare.ps1'
9293
[<TestCaseSource(nameof (codebases))>]
93-
[<Explicit("Before running these tests, you must prepare the codebase by running FCS.prepare.ps1")>]
9494
let ``Test graph-based type-checking`` (code: Codebase) =
9595
let config = codebaseToConfig code Method.Graph
9696
TestCompilerFromArgs config
9797

9898
[<TestCaseSource(nameof (codebases))>]
99-
[<Explicit("Before running these tests, you must prepare the codebase by running FCS.prepare.ps1")>]
99+
[<Explicit("Slow, only useful as a sanity check that the test codebase is sound and type-checks using the old method")>]
100100
let ``Test sequential type-checking`` (code: Codebase) =
101101
let config = codebaseToConfig code Method.Sequential
102102
TestCompilerFromArgs config

tests/ParallelTypeCheckingTests/Tests/TestDependencyResolution.fs

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ open ParallelTypeCheckingTests.Types
1010
open ParallelTypeCheckingTests.Utils
1111
open ParallelTypeCheckingTests.DepResolving
1212
open NUnit.Framework
13-
open Newtonsoft.Json
1413

1514
let buildFiles (files: (string * string) seq) =
1615
files
@@ -50,6 +49,84 @@ open A
5049
let expectedEdges = [ "B.fs", [ "A.fs" ] ]
5150
assertGraphEqual deps expectedEdges
5251

52+
[<Test>]
53+
let ``When defining a top-level module, the implicit parent namespace is taken into account when considering references to the file - .fsi pair`` () =
54+
let files =
55+
[|
56+
"A.fsi", """
57+
module A.B.C1
58+
type X = X of int
59+
"""
60+
"B.fsi", """
61+
module A.B.C2
62+
val x : C1.X -> unit
63+
"""
64+
|] |> buildFiles
65+
66+
let deps = DependencyResolution.detectFileDependencies files
67+
68+
let expectedEdges = ["B.fsi", ["A.fsi"]]
69+
assertGraphEqual deps expectedEdges
70+
71+
72+
[<Test>]
73+
let ``When defining a top-level module, the implicit parent namespace is taken into account when considering references to the file - .fs, .fsi pair`` () =
74+
let files =
75+
[|
76+
"A.fs", """
77+
module A.B.C1
78+
type X = X of int
79+
"""
80+
"B.fsi", """
81+
module A.B.C2
82+
val x : C1.X -> unit
83+
"""
84+
|] |> buildFiles
85+
86+
let deps = DependencyResolution.detectFileDependencies files
87+
88+
let expectedEdges = ["B.fsi", ["A.fs"]]
89+
assertGraphEqual deps expectedEdges
90+
91+
92+
[<Test>]
93+
let ``When defining a top-level module, the implicit parent namespace is taken into account when considering references to the file - .fsi, .fs pair`` () =
94+
let files =
95+
[|
96+
"A.fsi", """
97+
module A.B.C1
98+
type X = X of int
99+
"""
100+
"B.fs", """
101+
module A.B.C2
102+
let x : C1.X -> unit = failwith ""
103+
"""
104+
|] |> buildFiles
105+
106+
let deps = DependencyResolution.detectFileDependencies files
107+
108+
let expectedEdges = ["B.fs", ["A.fsi"]]
109+
assertGraphEqual deps expectedEdges
110+
111+
[<Test>]
112+
let ``When defining a top-level module, the implicit parent namespace is taken into account when considering references to the file - .fs, .fs pair`` () =
113+
let files =
114+
[|
115+
"A.fs", """
116+
module A.B.C1
117+
type X = X of int
118+
"""
119+
"B.fs", """
120+
module A.B.C2
121+
let x : C1.X -> unit = failwith ""
122+
"""
123+
|] |> buildFiles
124+
125+
let deps = DependencyResolution.detectFileDependencies files
126+
127+
let expectedEdges = ["B.fs", ["A.fs"]]
128+
assertGraphEqual deps expectedEdges
129+
53130
[<Test>]
54131
let ``With no references there is no dependency`` () =
55132
let files =

0 commit comments

Comments
 (0)