Skip to content

Commit 7d777a3

Browse files
committed
Fix parsing of nested when expressions
1 parent 134bfe3 commit 7d777a3

7 files changed

Lines changed: 458 additions & 22 deletions

File tree

src/Compiler/Parse/Context.gren

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ type alias Context =
1717

1818
empty : Context
1919
empty =
20-
{ indent = 0
20+
{ indent = 1
2121
, comments = Dict.empty
2222
}
2323

src/Compiler/Parse/Expression.gren

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -301,10 +301,6 @@ letDefNamedParser =
301301
|> Parser.skip spaceParser
302302
|> Parser.keep
303303
(Type.expression
304-
|> Parser.scopedUpdatePayload
305-
var.start.col
306-
.indent
307-
(\nextValue payload -> { payload | indent = nextValue })
308304
|> Parser.mapError TypeError
309305
)
310306
|> Parser.skip
@@ -321,12 +317,17 @@ letDefNamedParser =
321317
else
322318
Parser.succeed {}
323319
)
324-
320+
325321
)
326322
|> Parser.skip spaceParser
327323
, Parser.succeed Nothing
328324
]
329325
)
326+
-- TODO: How to reverse this?
327+
|> Parser.scopedUpdatePayload
328+
var.start.col
329+
.indent
330+
(\nextValue payload -> { payload | indent = nextValue })
330331
|> Parser.keep (Parser.loop [] (functionArgsParser "="))
331332
|> Parser.skip spaceParser
332333
|> Parser.keep (Parser.lazy (\_ -> parser))
@@ -446,6 +447,10 @@ whenParser =
446447
endLocation
447448
(AST.When { expression = expr, branches = branches })
448449
)
450+
|> Parser.scopedUpdatePayload
451+
start.col
452+
.indent
453+
(\value payload -> { payload | indent = value })
449454
)
450455

451456
whenBranchParser : Parser Context Error AST.WhenBranch
@@ -456,7 +461,6 @@ whenBranchParser =
456461
|> Parser.skip (Parser.keyword "->" (ExpectedKeyword "->"))
457462
|> Parser.skip spaceParser
458463
|> Parser.keep (Parser.lazy (\_ -> parser))
459-
|> Parser.skip spaceParser
460464

461465

462466
whenBranchLoopParser : Array AST.WhenBranch -> Parser Context Error (Parser.Step (Array AST.WhenBranch) (Array AST.WhenBranch))

src/Compiler/Parse/Pattern.gren

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,7 @@ term =
179179
|> Parser.keep
180180
(Parser.oneOf
181181
[ Parser.lazy (\_ -> parser)
182+
-- TODO: why backtrackable?
182183
|> Parser.backtrackable
183184
|> Parser.map Just
184185
, Parser.succeed Nothing
@@ -193,7 +194,7 @@ term =
193194
, arg = arg
194195
}
195196

196-
Variable.Qualified { module_, name } ->
197+
Variable.Qualified { module_, name } ->
197198
AST.PCtorQual
198199
{ varRegion = { start = start, end = end }
199200
, module_ = module_
@@ -225,6 +226,29 @@ term =
225226
)
226227
|> Parser.keep Parser.getPosition
227228
|> Parser.skip spaceParser
229+
-- Correct positions of Constructors
230+
|> Parser.map
231+
(\t ->
232+
when t is
233+
{ value = AST.PCtor { name, arg } } ->
234+
{ start = t.start
235+
, value = t.value
236+
, end =
237+
Maybe.map .end arg
238+
|> Maybe.withDefault name.end
239+
}
240+
241+
{ value = AST.PCtorQual { varRegion, arg } } ->
242+
{ start = t.start
243+
, value = t.value
244+
, end =
245+
Maybe.map .end arg
246+
|> Maybe.withDefault varRegion.end
247+
}
248+
249+
_ ->
250+
t
251+
)
228252

229253

230254
lowerCaseVariable : Parser Context Error String

src/Compiler/Parse/Space.gren

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ checkIndent =
8484
|> Parser.keep Parser.getCol
8585
|> Parser.andThen
8686
(\{ indent, col } ->
87-
if col > indent && col > 1 then
87+
if col > indent then
8888
Parser.succeed {}
8989

9090
else

src/Compiler/Parse/Type.gren

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,15 +61,21 @@ expression =
6161
next.end
6262
(AST.TLambda { from = tipe, to = next })
6363
)
64-
|> Parser.skip (Parser.mapError (\_ -> ExpectedIndent) Space.checkIndent)
64+
|> Parser.skip checkIndent
6565
|> Parser.skip (Parser.token "->" (ExpectedString "->"))
6666
|> Parser.skip spaceParser
67+
|> Parser.skip checkIndent
6768
|> Parser.keep (Parser.lazy (\_ -> expression))
6869
, Parser.succeed tipe
6970
]
7071
)
7172

7273

74+
checkIndent : Parser Context Error {}
75+
checkIndent =
76+
Parser.mapError (\_ -> ExpectedIndent) Space.checkIndent
77+
78+
7379
app : Parser Context Error AST.Type
7480
app =
7581
Parser.succeed

0 commit comments

Comments
 (0)