Skip to content

Commit 1183fa9

Browse files
committed
Add support for multiline comments
1 parent fc6e6d4 commit 1183fa9

4 files changed

Lines changed: 77 additions & 10 deletions

File tree

src/Compiler/Parse/Context.gren

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,4 @@ type alias Comment =
3333

3434
type CommentValue
3535
= Line String
36-
| MultiLine String
36+
| Block String

src/Compiler/Parse/Declaration.gren

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ docParser toErr =
105105
Space.ExpectedLineComment ->
106106
toErr "expected line comment"
107107

108+
Space.ExpectedMultiLineOpen ->
109+
toErr "expected {-"
110+
111+
Space.ExpectedMultiLineClose ->
112+
toErr "expected -}"
113+
108114
Space.InvalidWhiteSpace ->
109115
toErr "expected white space character"
110116
in

src/Compiler/Parse/Space.gren

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import Dict
1414

1515
type Error
1616
= ExpectedLineComment
17+
| ExpectedMultiLineOpen
18+
| ExpectedMultiLineClose
1719
| InvalidWhiteSpace
1820

1921

@@ -22,6 +24,12 @@ errorToString error =
2224
when error is
2325
ExpectedLineComment ->
2426
"Expected line comment"
27+
28+
ExpectedMultiLineOpen ->
29+
"Expected {-"
30+
31+
ExpectedMultiLineClose ->
32+
"Expected -}"
2533

2634
InvalidWhiteSpace ->
2735
"Invalid whitespace character"
@@ -78,6 +86,49 @@ parseLoop _state =
7886
Parser.getPayload
7987
)
8088
|> Parser.map (\_ -> Parser.Loop {})
89+
, Parser.succeed
90+
(\row col comment ->
91+
{ row = row
92+
, col = col
93+
, value =
94+
comment
95+
|> String.dropLast 2
96+
|> String.trim
97+
|> Context.Block
98+
}
99+
)
100+
|> Parser.keep Parser.getRow
101+
|> Parser.keep Parser.getCol
102+
|> Parser.skip
103+
(Parser.oneOf
104+
[ Parser.token "{-|" ExpectedMultiLineOpen
105+
|> Parser.andThen (\_ -> Parser.problem ExpectedMultiLineOpen)
106+
, Parser.token "{-" ExpectedMultiLineOpen
107+
]
108+
|> Parser.backtrackable
109+
)
110+
|> Parser.keep
111+
(Parser.chompUntil "-}" ExpectedMultiLineClose
112+
|> Parser.skip (Parser.token "-}" ExpectedMultiLineClose)
113+
|> Parser.getChompedString
114+
)
115+
|> Parser.andThen
116+
(\value ->
117+
Parser.updatePayload
118+
(\payload ->
119+
let
120+
commentsOnRow =
121+
Dict.get value.row payload.comments
122+
|> Maybe.withDefault []
123+
|> Array.pushLast value
124+
in
125+
{ payload
126+
| comments = Dict.set value.row commentsOnRow payload.comments
127+
}
128+
)
129+
Parser.getPayload
130+
)
131+
|> Parser.map (\_ -> Parser.Loop {})
81132
, Parser.succeed (Parser.Loop {})
82133
|> Parser.skip (Parser.chompIf validWhiteSpace InvalidWhiteSpace)
83134
|> Parser.skip (Parser.chompWhile validWhiteSpace)

tests/src/Test/Compiler/Parse/Space.gren

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,18 @@ tests =
4141
Parser.run setIndentParser Context.empty " b"
4242
|> Result.map .indent
4343
|> Expect.equal (Ok 5)
44-
, test "parses line comments" <| \_ ->
45-
Parser.run payloadParser Context.empty "-- this is a line comment"
46-
|> expectLineComment 1 1 "this is a line comment"
47-
, test "parses line comments even when prefixed with space" <| \_ ->
48-
Parser.run payloadParser Context.empty " -- this is a line comment"
49-
|> expectLineComment 1 3 "this is a line comment"
5044
]
45+
, describe "comments" <|
46+
[ test "parses line comments" <| \_ ->
47+
Parser.run (parseToEnd payloadParser) Context.empty "-- this is a line comment"
48+
|> expectComment 1 1 (Context.Line "this is a line comment")
49+
, test "parses line comments even when prefixed with space" <| \_ ->
50+
Parser.run (parseToEnd payloadParser) Context.empty " -- this is a line comment"
51+
|> expectComment 1 3 (Context.Line "this is a line comment")
52+
, test "block comments" <| \_ ->
53+
Parser.run (parseToEnd payloadParser) Context.empty "{- this is a block comment -}"
54+
|> expectComment 1 1 (Context.Block "this is a block comment")
55+
]
5156
, describe "checkIndent" <|
5257
let
5358
indentParser =
@@ -97,8 +102,13 @@ payloadParser =
97102
|> Parser.keep Parser.getPayload
98103

99104

100-
expectLineComment : Int -> Int -> String -> Result x Context -> Expectation
101-
expectLineComment row col comment resultContext =
105+
parseToEnd : Parser Context PS.Error a -> Parser Context PS.Error a
106+
parseToEnd p =
107+
Parser.skip (Parser.end PS.InvalidWhiteSpace) p
108+
109+
110+
expectComment : Int -> Int -> Context.CommentValue -> Result x Context -> Expectation
111+
expectComment row col comment resultContext =
102112
when resultContext is
103113
Err err ->
104114
Expect.fail ("Failed to parse with error: " ++ Debug.toString err)
@@ -112,7 +122,7 @@ expectLineComment row col comment resultContext =
112122
Expect.equal
113123
[ { row = row
114124
, col = col
115-
, value = Context.Line comment
125+
, value = comment
116126
}
117127
]
118128
commentsOnRow

0 commit comments

Comments
 (0)