Skip to content

Commit 6e10172

Browse files
Merge pull request #256 from SwiftFiddle/fold
Fold custom operators
2 parents 11fa854 + f64613a commit 6e10172

File tree

10 files changed

+4143
-2
lines changed

10 files changed

+4143
-2
lines changed

Sources/App/Controllers/SyntaxParser.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@ import SwiftParser
66
struct SyntaxParser {
77
static func parse(code: String, options: [String] = []) throws -> SyntaxResponse {
88
let sourceFile = Parser.parse(source: code)
9+
910
let syntax: Syntax
10-
if options.contains("fold"), let folded = try? OperatorTable.standardOperators.foldAll(sourceFile) {
11-
syntax = folded
11+
if options.contains("fold") {
12+
syntax = OperatorTable.standardOperators.foldAll(sourceFile, errorHandler: { _ in })
1213
} else {
1314
syntax = Syntax(sourceFile)
1415
}

Tests/AppTests/AppTests.swift

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,62 @@ final class AppTests: XCTestCase {
227227
)
228228
}
229229

230+
func testParser5() throws {
231+
let response = try SyntaxParser.parse(
232+
code: """
233+
if a + b * c {
234+
return
235+
}
236+
"""
237+
)
238+
239+
let decoder = JSONDecoder()
240+
241+
XCTAssertEqual(
242+
try decoder.decode([TreeNode].self, from: Data(response.syntaxJSON.utf8)),
243+
try decoder.decode(
244+
[TreeNode].self, from: Data(
245+
contentsOf: Bundle.module.url(forResource: "test-1-5.json", withExtension: nil)!
246+
)
247+
)
248+
)
249+
XCTAssertEqual(
250+
response.syntaxHTML,
251+
try String(
252+
contentsOf: Bundle.module.url(forResource: "test-1-5.html", withExtension: nil)!
253+
)
254+
.replacingOccurrences(of: "\n", with: "")
255+
)
256+
}
257+
258+
func testParser6() throws {
259+
let response = try SyntaxParser.parse(
260+
code: """
261+
if a + b × c {
262+
return
263+
}
264+
"""
265+
)
266+
267+
let decoder = JSONDecoder()
268+
269+
XCTAssertEqual(
270+
try decoder.decode([TreeNode].self, from: Data(response.syntaxJSON.utf8)),
271+
try decoder.decode(
272+
[TreeNode].self, from: Data(
273+
contentsOf: Bundle.module.url(forResource: "test-1-6.json", withExtension: nil)!
274+
)
275+
)
276+
)
277+
XCTAssertEqual(
278+
response.syntaxHTML,
279+
try String(
280+
contentsOf: Bundle.module.url(forResource: "test-1-6.html", withExtension: nil)!
281+
)
282+
.replacingOccurrences(of: "\n", with: "")
283+
)
284+
}
285+
230286
func testParserFolding1() throws {
231287
let response = try SyntaxParser.parse(
232288
code: """
@@ -391,4 +447,62 @@ final class AppTests: XCTestCase {
391447
.replacingOccurrences(of: "\n", with: "")
392448
)
393449
}
450+
451+
func testParserFolding5() throws {
452+
let response = try SyntaxParser.parse(
453+
code: """
454+
if a + b * c {
455+
return
456+
}
457+
""",
458+
options: ["fold"]
459+
)
460+
461+
let decoder = JSONDecoder()
462+
463+
XCTAssertEqual(
464+
try decoder.decode([TreeNode].self, from: Data(response.syntaxJSON.utf8)),
465+
try decoder.decode(
466+
[TreeNode].self, from: Data(
467+
contentsOf: Bundle.module.url(forResource: "test-2-5.json", withExtension: nil)!
468+
)
469+
)
470+
)
471+
XCTAssertEqual(
472+
response.syntaxHTML,
473+
try String(
474+
contentsOf: Bundle.module.url(forResource: "test-2-5.html", withExtension: nil)!
475+
)
476+
.replacingOccurrences(of: "\n", with: "")
477+
)
478+
}
479+
480+
func testParserFolding6() throws {
481+
let response = try SyntaxParser.parse(
482+
code: """
483+
if a + b × c {
484+
return
485+
}
486+
""",
487+
options: ["fold"]
488+
)
489+
490+
let decoder = JSONDecoder()
491+
492+
XCTAssertEqual(
493+
try decoder.decode([TreeNode].self, from: Data(response.syntaxJSON.utf8)),
494+
try decoder.decode(
495+
[TreeNode].self, from: Data(
496+
contentsOf: Bundle.module.url(forResource: "test-2-6.json", withExtension: nil)!
497+
)
498+
)
499+
)
500+
XCTAssertEqual(
501+
response.syntaxHTML,
502+
try String(
503+
contentsOf: Bundle.module.url(forResource: "test-2-6.html", withExtension: nil)!
504+
)
505+
.replacingOccurrences(of: "\n", with: "")
506+
)
507+
}
394508
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
<span class='SourceFile' data-title='if a + b * c {↲ return↲}' data-content='SourceFileSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":1,"endRow":3,"endColumn":2}'>
2+
<span class='CodeBlockItemList' data-title='if a + b * c {↲ return↲}' data-content='CodeBlockItemListSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":1,"endRow":3,"endColumn":2}'>
3+
<span class='CodeBlockItem' data-title='if a + b * c {↲ return↲}' data-content='CodeBlockItemSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":1,"endRow":3,"endColumn":2}'>
4+
<span class='IfStmt' data-title='if a + b * c {↲ return↲}' data-content='IfStmtSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":1,"endRow":3,"endColumn":2}'>
5+
<span class='Token' data-title='if' data-content='ifKeyword' data-type='Token' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":3}'>
6+
<span class='token keyword' data-title='if' data-content='ifKeyword' data-type='Token' data-range='{"startRow":1,"startColumn":1,"endRow":1,"endColumn":3}'>if</span>&nbsp;
7+
</span>
8+
<span class='ConditionElementList' data-title='a + b * c' data-content='ConditionElementListSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":13}'>
9+
<span class='ConditionElement' data-title='a + b * c' data-content='ConditionElementSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":13}'>
10+
<span class='SequenceExpr' data-title='a + b * c' data-content='SequenceExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":13}'>
11+
<span class='ExprList' data-title='a + b * c' data-content='ExprListSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":13}'>
12+
<span class='IdentifierExpr' data-title='a' data-content='IdentifierExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":5}'>
13+
<span class='Token' data-title='a' data-content='identifier(&quot;a&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":5}'>
14+
<span class='token identifier' data-title='a' data-content='identifier(&quot;a&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":4,"endRow":1,"endColumn":5}'>a</span>&nbsp;
15+
</span>
16+
</span>
17+
<span class='BinaryOperatorExpr' data-title='+' data-content='BinaryOperatorExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":6,"endRow":1,"endColumn":7}'>
18+
<span class='Token' data-title='+' data-content='spacedBinaryOperator(&quot;+&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":6,"endRow":1,"endColumn":7}'>
19+
<span class='token spacedBinaryOperator' data-title='+' data-content='spacedBinaryOperator(&quot;+&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":6,"endRow":1,"endColumn":7}'>+</span>&nbsp;
20+
</span>
21+
</span>
22+
<span class='IdentifierExpr' data-title='b' data-content='IdentifierExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":8,"endRow":1,"endColumn":9}'>
23+
<span class='Token' data-title='b' data-content='identifier(&quot;b&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":8,"endRow":1,"endColumn":9}'>
24+
<span class='token identifier' data-title='b' data-content='identifier(&quot;b&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":8,"endRow":1,"endColumn":9}'>b</span>&nbsp;
25+
</span>
26+
</span>
27+
<span class='BinaryOperatorExpr' data-title='*' data-content='BinaryOperatorExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":10,"endRow":1,"endColumn":11}'>
28+
<span class='Token' data-title='*' data-content='spacedBinaryOperator(&quot;*&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":10,"endRow":1,"endColumn":11}'>
29+
<span class='token spacedBinaryOperator' data-title='*' data-content='spacedBinaryOperator(&quot;*&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":10,"endRow":1,"endColumn":11}'>*</span>&nbsp;
30+
</span>
31+
</span>
32+
<span class='IdentifierExpr' data-title='c' data-content='IdentifierExprSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":13}'>
33+
<span class='Token' data-title='c' data-content='identifier(&quot;c&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":13}'>
34+
<span class='token identifier' data-title='c' data-content='identifier(&quot;c&quot;)' data-type='Token' data-range='{"startRow":1,"startColumn":12,"endRow":1,"endColumn":13}'>c</span>&nbsp;
35+
</span>
36+
</span>
37+
</span>
38+
</span>
39+
</span>
40+
</span>
41+
<span class='CodeBlock' data-title='{↲ return↲}' data-content='CodeBlockSyntax' data-type='Syntax' data-range='{"startRow":1,"startColumn":14,"endRow":3,"endColumn":2}'>
42+
<span class='Token' data-title='{' data-content='leftBrace' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>
43+
<span class='token leftBrace' data-title='{' data-content='leftBrace' data-type='Token' data-range='{"startRow":1,"startColumn":14,"endRow":1,"endColumn":15}'>{</span>
44+
</span>
45+
<span class='CodeBlockItemList' data-title='return' data-content='CodeBlockItemListSyntax' data-type='Syntax' data-range='{"startRow":2,"startColumn":3,"endRow":2,"endColumn":9}'>
46+
<span class='CodeBlockItem' data-title='return' data-content='CodeBlockItemSyntax' data-type='Syntax' data-range='{"startRow":2,"startColumn":3,"endRow":2,"endColumn":9}'>
47+
<span class='ReturnStmt' data-title='return' data-content='ReturnStmtSyntax' data-type='Syntax' data-range='{"startRow":2,"startColumn":3,"endRow":2,"endColumn":9}'>
48+
<span class='Token' data-title='return' data-content='returnKeyword' data-type='Token' data-range='{"startRow":2,"startColumn":3,"endRow":2,"endColumn":9}'>
49+
<br>&nbsp;&nbsp;
50+
<span class='token keyword' data-title='return' data-content='returnKeyword' data-type='Token' data-range='{"startRow":2,"startColumn":3,"endRow":2,"endColumn":9}'>return</span>
51+
</span>
52+
</span>
53+
</span>
54+
</span>
55+
<span class='Token' data-title='}' data-content='rightBrace' data-type='Token' data-range='{"startRow":3,"startColumn":1,"endRow":3,"endColumn":2}'>
56+
<br>
57+
<span class='token rightBrace' data-title='}' data-content='rightBrace' data-type='Token' data-range='{"startRow":3,"startColumn":1,"endRow":3,"endColumn":2}'>}</span>
58+
</span>
59+
</span>
60+
</span>
61+
</span>
62+
</span>
63+
<span class='Token' data-title='' data-content='eof' data-type='Token' data-range='{"startRow":3,"startColumn":2,"endRow":3,"endColumn":2}'>
64+
<span class='token eof' data-title='' data-content='eof' data-type='Token' data-range='{"startRow":3,"startColumn":2,"endRow":3,"endColumn":2}'></span>
65+
</span>
66+
</span>

0 commit comments

Comments
 (0)