Skip to content

Commit 4164797

Browse files
committed
Check if the module appears to be incorrectly nested based on indentation
1 parent 0f7c23c commit 4164797

11 files changed

+358
-0
lines changed

src/Compiler/pars.fsy

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1271,6 +1271,14 @@ moduleDefnsOrExpr:
12711271

12721272
/* A sequence of definitions in a namespace or module */
12731273
moduleDefns:
1274+
| moduleDefnOrDirective moduleDefnOrDirective
1275+
{ match $1, $2 with
1276+
| [SynModuleDecl.Types _], [SynModuleDecl.NestedModule(_, _, _, _, _, { ModuleKeyword = Some m })] ->
1277+
// Check if the module appears to be incorrectly nested based on indentation
1278+
errorR(Error(FSComp.SR.parsInvalidDeclarationSyntax(), m))
1279+
$1 @ $2
1280+
| _ -> $1 @ $2 }
1281+
12741282
| moduleDefnOrDirective moduleDefns
12751283
{ $1 @ $2 }
12761284

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Module
2+
3+
type IFace =
4+
abstract F : int -> int
5+
module M =
6+
let f () = ()
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Type/Module Inside Type Defn 01.fs", false,
4+
QualifiedNameOfFile Module, [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [IFace],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,10)),
13+
ObjectModel
14+
(Unspecified,
15+
[AbstractSlot
16+
(SynValSig
17+
([], SynIdent (F, None),
18+
SynValTyparDecls (None, true),
19+
Fun
20+
(LongIdent (SynLongIdent ([int], [], [None])),
21+
LongIdent (SynLongIdent ([int], [], [None])),
22+
(4,17--4,27), { ArrowRange = (4,21--4,23) }),
23+
SynValInfo
24+
([[SynArgInfo ([], false, None)]],
25+
SynArgInfo ([], false, None)), false, false,
26+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
27+
Single None, None, (4,4--4,27),
28+
{ LeadingKeyword = Abstract (4,4--4,12)
29+
InlineKeyword = None
30+
WithKeyword = None
31+
EqualsRange = None }),
32+
{ IsInstance = true
33+
IsDispatchSlot = true
34+
IsOverrideOrExplicitImpl = false
35+
IsFinal = false
36+
GetterOrSetterIsCompilerGenerated = false
37+
MemberKind = Member }, (4,4--4,27),
38+
{ GetSetKeywords = None })], (4,4--4,27)), [], None,
39+
(3,5--4,27), { LeadingKeyword = Type (3,0--3,4)
40+
EqualsRange = Some (3,11--3,12)
41+
WithKeyword = None })], (3,0--4,27));
42+
NestedModule
43+
(SynComponentInfo
44+
([], None, [], [M],
45+
PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), false,
46+
None, (5,4--5,12)), false,
47+
[Let
48+
(false,
49+
[SynBinding
50+
(None, Normal, false, false, [],
51+
PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector),
52+
SynValData
53+
(None, SynValInfo ([[]], SynArgInfo ([], false, None)),
54+
None),
55+
LongIdent
56+
(SynLongIdent ([f], [], [None]), None, None,
57+
Pats [Paren (Const (Unit, (6,14--6,16)), (6,14--6,16))],
58+
None, (6,12--6,16)), None, Const (Unit, (6,19--6,21)),
59+
(6,12--6,16), NoneAtLet,
60+
{ LeadingKeyword = Let (6,8--6,11)
61+
InlineKeyword = None
62+
EqualsRange = Some (6,17--6,18) })], (6,8--6,21))],
63+
false, (5,4--6,21), { ModuleKeyword = Some (5,4--5,10)
64+
EqualsRange = Some (5,13--5,14) })],
65+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
66+
(1,0--6,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
67+
{ ConditionalDirectives = []
68+
WarnDirectives = []
69+
CodeComments = [] }, set []))
70+
71+
(5,4)-(5,10) parse error Invalid declaration syntax
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Module
2+
3+
type C () =
4+
member _.F () = 3
5+
module M2 =
6+
let f () = ()
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Type/Module Inside Type Defn 02.fs", false,
4+
QualifiedNameOfFile Module, [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [C],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
ObjectModel
14+
(Unspecified,
15+
[ImplicitCtor
16+
(None, [], Const (Unit, (3,7--3,9)), None,
17+
PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
18+
(3,5--3,6), { AsKeyword = None });
19+
Member
20+
(SynBinding
21+
(None, Normal, false, false, [],
22+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
23+
SynValData
24+
(Some { IsInstance = true
25+
IsDispatchSlot = false
26+
IsOverrideOrExplicitImpl = false
27+
IsFinal = false
28+
GetterOrSetterIsCompilerGenerated = false
29+
MemberKind = Member },
30+
SynValInfo
31+
([[SynArgInfo ([], false, None)]; []],
32+
SynArgInfo ([], false, None)), None),
33+
LongIdent
34+
(SynLongIdent
35+
([_; F], [(4,12--4,13)], [None; None]), None,
36+
None,
37+
Pats
38+
[Paren
39+
(Const (Unit, (4,15--4,17)), (4,15--4,17))],
40+
None, (4,11--4,17)), None,
41+
Const (Int32 3, (4,20--4,21)), (4,11--4,17),
42+
NoneAtInvisible,
43+
{ LeadingKeyword = Member (4,4--4,10)
44+
InlineKeyword = None
45+
EqualsRange = Some (4,18--4,19) }), (4,4--4,21))],
46+
(4,4--4,21)), [],
47+
Some
48+
(ImplicitCtor
49+
(None, [], Const (Unit, (3,7--3,9)), None,
50+
PreXmlDoc ((3,7), FSharp.Compiler.Xml.XmlDocCollector),
51+
(3,5--3,6), { AsKeyword = None })), (3,5--4,21),
52+
{ LeadingKeyword = Type (3,0--3,4)
53+
EqualsRange = Some (3,10--3,11)
54+
WithKeyword = None })], (3,0--4,21));
55+
NestedModule
56+
(SynComponentInfo
57+
([], None, [], [M2],
58+
PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), false,
59+
None, (5,4--5,13)), false,
60+
[Let
61+
(false,
62+
[SynBinding
63+
(None, Normal, false, false, [],
64+
PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector),
65+
SynValData
66+
(None, SynValInfo ([[]], SynArgInfo ([], false, None)),
67+
None),
68+
LongIdent
69+
(SynLongIdent ([f], [], [None]), None, None,
70+
Pats [Paren (Const (Unit, (6,14--6,16)), (6,14--6,16))],
71+
None, (6,12--6,16)), None, Const (Unit, (6,19--6,21)),
72+
(6,12--6,16), NoneAtLet,
73+
{ LeadingKeyword = Let (6,8--6,11)
74+
InlineKeyword = None
75+
EqualsRange = Some (6,17--6,18) })], (6,8--6,21))],
76+
false, (5,4--6,21), { ModuleKeyword = Some (5,4--5,10)
77+
EqualsRange = Some (5,14--5,15) })],
78+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
79+
(1,0--6,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
80+
{ ConditionalDirectives = []
81+
WarnDirectives = []
82+
CodeComments = [] }, set []))
83+
84+
(5,4)-(5,10) parse error Invalid declaration syntax
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
module Module
2+
3+
type U =
4+
| A
5+
| B
6+
module M3 =
7+
let f () = ()
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Type/Module Inside Type Defn 03.fs", false,
4+
QualifiedNameOfFile Module, [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [U],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
Simple
14+
(Union
15+
(None,
16+
[SynUnionCase
17+
([], SynIdent (A, None), Fields [],
18+
PreXmlDoc ((4,4), FSharp.Compiler.Xml.XmlDocCollector),
19+
None, (4,6--4,7), { BarRange = Some (4,4--4,5) });
20+
SynUnionCase
21+
([], SynIdent (B, None), Fields [],
22+
PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector),
23+
None, (5,6--5,7), { BarRange = Some (5,4--5,5) })],
24+
(4,4--5,7)), (4,4--5,7)), [], None, (3,5--5,7),
25+
{ LeadingKeyword = Type (3,0--3,4)
26+
EqualsRange = Some (3,7--3,8)
27+
WithKeyword = None })], (3,0--5,7));
28+
NestedModule
29+
(SynComponentInfo
30+
([], None, [], [M3],
31+
PreXmlDoc ((6,4), FSharp.Compiler.Xml.XmlDocCollector), false,
32+
None, (6,4--6,13)), false,
33+
[Let
34+
(false,
35+
[SynBinding
36+
(None, Normal, false, false, [],
37+
PreXmlDoc ((7,8), FSharp.Compiler.Xml.XmlDocCollector),
38+
SynValData
39+
(None, SynValInfo ([[]], SynArgInfo ([], false, None)),
40+
None),
41+
LongIdent
42+
(SynLongIdent ([f], [], [None]), None, None,
43+
Pats [Paren (Const (Unit, (7,14--7,16)), (7,14--7,16))],
44+
None, (7,12--7,16)), None, Const (Unit, (7,19--7,21)),
45+
(7,12--7,16), NoneAtLet,
46+
{ LeadingKeyword = Let (7,8--7,11)
47+
InlineKeyword = None
48+
EqualsRange = Some (7,17--7,18) })], (7,8--7,21))],
49+
false, (6,4--7,21), { ModuleKeyword = Some (6,4--6,10)
50+
EqualsRange = Some (6,14--6,15) })],
51+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
52+
(1,0--7,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
53+
{ ConditionalDirectives = []
54+
WarnDirectives = []
55+
CodeComments = [] }, set []))
56+
57+
(6,4)-(6,10) parse error Invalid declaration syntax
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
module Module
2+
3+
type R =
4+
{ A : int }
5+
module M4 =
6+
let f () = ()
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
ImplFile
2+
(ParsedImplFileInput
3+
("/root/Type/Module Inside Type Defn 04.fs", false,
4+
QualifiedNameOfFile Module, [],
5+
[SynModuleOrNamespace
6+
([Module], false, NamedModule,
7+
[Types
8+
([SynTypeDefn
9+
(SynComponentInfo
10+
([], None, [], [R],
11+
PreXmlDoc ((3,0), FSharp.Compiler.Xml.XmlDocCollector),
12+
false, None, (3,5--3,6)),
13+
Simple
14+
(Record
15+
(None,
16+
[SynField
17+
([], false, Some A,
18+
LongIdent (SynLongIdent ([int], [], [None])), false,
19+
PreXmlDoc ((4,6), FSharp.Compiler.Xml.XmlDocCollector),
20+
None, (4,6--4,13), { LeadingKeyword = None
21+
MutableKeyword = None })],
22+
(4,4--4,15)), (4,4--4,15)), [], None, (3,5--4,15),
23+
{ LeadingKeyword = Type (3,0--3,4)
24+
EqualsRange = Some (3,7--3,8)
25+
WithKeyword = None })], (3,0--4,15));
26+
NestedModule
27+
(SynComponentInfo
28+
([], None, [], [M4],
29+
PreXmlDoc ((5,4), FSharp.Compiler.Xml.XmlDocCollector), false,
30+
None, (5,4--5,13)), false,
31+
[Let
32+
(false,
33+
[SynBinding
34+
(None, Normal, false, false, [],
35+
PreXmlDoc ((6,8), FSharp.Compiler.Xml.XmlDocCollector),
36+
SynValData
37+
(None, SynValInfo ([[]], SynArgInfo ([], false, None)),
38+
None),
39+
LongIdent
40+
(SynLongIdent ([f], [], [None]), None, None,
41+
Pats [Paren (Const (Unit, (6,14--6,16)), (6,14--6,16))],
42+
None, (6,12--6,16)), None, Const (Unit, (6,19--6,21)),
43+
(6,12--6,16), NoneAtLet,
44+
{ LeadingKeyword = Let (6,8--6,11)
45+
InlineKeyword = None
46+
EqualsRange = Some (6,17--6,18) })], (6,8--6,21))],
47+
false, (5,4--6,21), { ModuleKeyword = Some (5,4--5,10)
48+
EqualsRange = Some (5,14--5,15) })],
49+
PreXmlDoc ((1,0), FSharp.Compiler.Xml.XmlDocCollector), [], None,
50+
(1,0--6,21), { LeadingKeyword = Module (1,0--1,6) })], (true, true),
51+
{ ConditionalDirectives = []
52+
WarnDirectives = []
53+
CodeComments = [] }, set []))
54+
55+
(5,4)-(5,10) parse error Invalid declaration syntax
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module Module
2+
3+
type IFace =
4+
interface
5+
abstract F : int -> int
6+
module M =
7+
let f () = f ()
8+
end

0 commit comments

Comments
 (0)