Skip to content

Commit 4e9c3fb

Browse files
committed
unified/swift: add literals, names, and operator expression mappings
1 parent 0e9d17b commit 4e9c3fb

4 files changed

Lines changed: 198 additions & 22 deletions

File tree

unified/extractor/src/languages/swift/swift.rs

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,74 @@ fn translation_rules() -> Vec<yeast::Rule> {
1515
// Declarations may be wrapped in local/global wrapper nodes.
1616
rule!((global_declaration _ @inner) => {inner}),
1717
rule!((local_declaration _ @inner) => {inner}),
18+
// ---- Literals ----
19+
rule!((integer_literal) => (int_literal)),
20+
rule!((hex_literal) => (int_literal)),
21+
rule!((bin_literal) => (int_literal)),
22+
rule!((oct_literal) => (int_literal)),
23+
rule!((real_literal) => (float_literal)),
24+
rule!((boolean_literal) => (boolean_literal)),
25+
rule!("nil" => (builtin_expr)),
26+
rule!((special_literal) => (builtin_expr)),
27+
rule!((line_string_literal) => (string_literal)),
28+
rule!((multi_line_string_literal) => (string_literal)),
29+
rule!((raw_string_literal) => (string_literal)),
30+
rule!((regex_literal) => (regex_literal)),
31+
// ---- Names ----
32+
rule!((simple_identifier) @id => (name_expr identifier: (identifier #{id}))),
33+
// A referenceable_operator (e.g. `+` used as a value, as in `reduce(0, +)`)
34+
// is treated as a name reference to the operator symbol.
35+
rule!((referenceable_operator) @op => (name_expr identifier: (identifier #{op}))),
36+
// ---- Operators ----
37+
// All binary operators share the lhs/op/rhs shape.
38+
rule!((additive_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
39+
rule!((multiplicative_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
40+
rule!((comparison_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
41+
rule!((equality_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
42+
rule!((conjunction_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
43+
rule!((disjunction_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
44+
rule!((infix_expression lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
45+
// Range expression `a..<b` / `a...b`
46+
rule!((range_expression start: @l op: @op end: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
47+
// Open-ended ranges `a...` / `...b`
48+
rule!((open_end_range_expression start: @l) => (unary_expr operator: (postfix_operator "...") operand: {l})),
49+
rule!((open_start_range_expression end: @r) => (unary_expr operator: (prefix_operator "...") operand: {r})),
50+
// Custom operator declaration: `[prefix|infix|postfix] operator OP [: PrecedenceGroup]`.
51+
// The fixity keyword is an anonymous child of `operator_declaration`, so we
52+
// dispatch on it with one rule per keyword.
53+
rule!(
54+
(operator_declaration "prefix" (referenceable_operator _ @op) (simple_identifier)? @prec)
55+
=>
56+
(operator_syntax_declaration name: (identifier #{op}) fixity: (fixity "prefix") precedence: {..prec})
57+
),
58+
rule!(
59+
(operator_declaration "postfix" (referenceable_operator _ @op) (simple_identifier)? @prec)
60+
=>
61+
(operator_syntax_declaration name: (identifier #{op}) fixity: (fixity "postfix") precedence: {..prec})
62+
),
63+
rule!(
64+
(operator_declaration "infix" (referenceable_operator _ @op) (simple_identifier)? @prec)
65+
=>
66+
(operator_syntax_declaration
67+
name: (identifier #{op})
68+
fixity: (fixity "infix")
69+
precedence: {..prec})
70+
),
71+
rule!((bitwise_operation lhs: @l op: @op rhs: @r) => (binary_expr left: {l} operator: (infix_operator #{op}) right: {r})),
72+
rule!((nil_coalescing_expression value: @l if_nil: @r) => (binary_expr left: {l} operator: (infix_operator "??") right: {r})),
73+
// Leading-dot member shorthand (e.g. `.some`, `.foo`) means member access
74+
// on a contextually inferred type.
75+
rule!((prefix_expression operation: "." target: @member) => (member_access_expr base: (inferred_type_expr) member: (identifier #{member}))),
76+
// Prefix unary operators
77+
rule!((prefix_expression operation: @op target: @operand) => (unary_expr operator: (prefix_operator #{op}) operand: {operand})),
78+
// Postfix unary operators
79+
rule!((postfix_expression operation: @op target: @operand) => (unary_expr operator: (postfix_operator #{op}) operand: {operand})),
80+
// Parenthesised single-value tuple is a grouping expression; pass through.
81+
// Multi-value tuples become tuple_expr.
82+
rule!((tuple_expression value: _* @v) => (tuple_expr element: {..v})),
83+
// Blocks contain statement* directly.
84+
rule!((block statement: _+ @stmts) => (block stmt: {..stmts})),
85+
rule!((block) => (block)),
1886
// ---- Fallbacks ----
1987
rule!(
2088
(_)

unified/extractor/tests/corpus/swift/desugar.txt

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ source_file
1818
top_level
1919
body:
2020
block
21-
stmt: unsupported_node "1 + 2"
21+
stmt:
22+
binary_expr
23+
operator: infix_operator "+"
24+
left: int_literal "1"
25+
right: int_literal "2"
2226

2327
===
2428
Another additive expression is desugared
@@ -40,4 +44,12 @@ source_file
4044
top_level
4145
body:
4246
block
43-
stmt: unsupported_node "foo + bar"
47+
stmt:
48+
binary_expr
49+
operator: infix_operator "+"
50+
left:
51+
name_expr
52+
identifier: identifier "foo"
53+
right:
54+
name_expr
55+
identifier: identifier "bar"

unified/extractor/tests/corpus/swift/literals.txt

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ source_file
1414
top_level
1515
body:
1616
block
17-
stmt: unsupported_node "42"
17+
stmt: int_literal "42"
1818

1919
===
2020
Negative integer literal
@@ -35,7 +35,10 @@ source_file
3535
top_level
3636
body:
3737
block
38-
stmt: unsupported_node "-7"
38+
stmt:
39+
unary_expr
40+
operand: int_literal "7"
41+
operator: prefix_operator "-"
3942

4043
===
4144
Floating-point literal
@@ -53,7 +56,7 @@ source_file
5356
top_level
5457
body:
5558
block
56-
stmt: unsupported_node "3.14"
59+
stmt: float_literal "3.14"
5760

5861
===
5962
Boolean literals
@@ -75,8 +78,8 @@ top_level
7578
body:
7679
block
7780
stmt:
78-
unsupported_node "true"
79-
unsupported_node "false"
81+
boolean_literal "true"
82+
boolean_literal "false"
8083

8184
===
8285
Nil literal
@@ -94,7 +97,7 @@ source_file
9497
top_level
9598
body:
9699
block
97-
stmt: unsupported_node "nil"
100+
stmt: builtin_expr "nil"
98101

99102
===
100103
String literal
@@ -114,7 +117,7 @@ source_file
114117
top_level
115118
body:
116119
block
117-
stmt: unsupported_node "\"hello\""
120+
stmt: string_literal "\"hello\""
118121

119122
===
120123
String with interpolation
@@ -137,4 +140,4 @@ source_file
137140
top_level
138141
body:
139142
block
140-
stmt: unsupported_node "\"hello \\(name)\""
143+
stmt: string_literal "\"hello \\(name)\""

unified/extractor/tests/corpus/swift/operators.txt

Lines changed: 105 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,15 @@ source_file
1818
top_level
1919
body:
2020
block
21-
stmt: unsupported_node "a + b"
21+
stmt:
22+
binary_expr
23+
operator: infix_operator "+"
24+
left:
25+
name_expr
26+
identifier: identifier "a"
27+
right:
28+
name_expr
29+
identifier: identifier "b"
2230

2331
===
2432
Subtraction
@@ -40,7 +48,15 @@ source_file
4048
top_level
4149
body:
4250
block
43-
stmt: unsupported_node "a - b"
51+
stmt:
52+
binary_expr
53+
operator: infix_operator "-"
54+
left:
55+
name_expr
56+
identifier: identifier "a"
57+
right:
58+
name_expr
59+
identifier: identifier "b"
4460

4561
===
4662
Multiplication
@@ -62,7 +78,15 @@ source_file
6278
top_level
6379
body:
6480
block
65-
stmt: unsupported_node "a * b"
81+
stmt:
82+
binary_expr
83+
operator: infix_operator "*"
84+
left:
85+
name_expr
86+
identifier: identifier "a"
87+
right:
88+
name_expr
89+
identifier: identifier "b"
6690

6791
===
6892
Division
@@ -84,7 +108,15 @@ source_file
84108
top_level
85109
body:
86110
block
87-
stmt: unsupported_node "a / b"
111+
stmt:
112+
binary_expr
113+
operator: infix_operator "/"
114+
left:
115+
name_expr
116+
identifier: identifier "a"
117+
right:
118+
name_expr
119+
identifier: identifier "b"
88120

89121
===
90122
Operator precedence: addition and multiplication
@@ -110,7 +142,21 @@ source_file
110142
top_level
111143
body:
112144
block
113-
stmt: unsupported_node "a + b * c"
145+
stmt:
146+
binary_expr
147+
operator: infix_operator "+"
148+
left:
149+
name_expr
150+
identifier: identifier "a"
151+
right:
152+
binary_expr
153+
operator: infix_operator "*"
154+
left:
155+
name_expr
156+
identifier: identifier "b"
157+
right:
158+
name_expr
159+
identifier: identifier "c"
114160

115161
===
116162
Parenthesised expression
@@ -140,7 +186,13 @@ source_file
140186
top_level
141187
body:
142188
block
143-
stmt: unsupported_node "(a + b) * c"
189+
stmt:
190+
binary_expr
191+
operator: infix_operator "*"
192+
left: tuple_expr "(a + b)"
193+
right:
194+
name_expr
195+
identifier: identifier "c"
144196

145197
===
146198
Comparison
@@ -162,7 +214,15 @@ source_file
162214
top_level
163215
body:
164216
block
165-
stmt: unsupported_node "a < b"
217+
stmt:
218+
binary_expr
219+
operator: infix_operator "<"
220+
left:
221+
name_expr
222+
identifier: identifier "a"
223+
right:
224+
name_expr
225+
identifier: identifier "b"
166226

167227
===
168228
Equality
@@ -184,7 +244,15 @@ source_file
184244
top_level
185245
body:
186246
block
187-
stmt: unsupported_node "a == b"
247+
stmt:
248+
binary_expr
249+
operator: infix_operator "=="
250+
left:
251+
name_expr
252+
identifier: identifier "a"
253+
right:
254+
name_expr
255+
identifier: identifier "b"
188256

189257
===
190258
Logical and
@@ -206,7 +274,15 @@ source_file
206274
top_level
207275
body:
208276
block
209-
stmt: unsupported_node "a && b"
277+
stmt:
278+
binary_expr
279+
operator: infix_operator "&&"
280+
left:
281+
name_expr
282+
identifier: identifier "a"
283+
right:
284+
name_expr
285+
identifier: identifier "b"
210286

211287
===
212288
Logical or
@@ -228,7 +304,15 @@ source_file
228304
top_level
229305
body:
230306
block
231-
stmt: unsupported_node "a || b"
307+
stmt:
308+
binary_expr
309+
operator: infix_operator "||"
310+
left:
311+
name_expr
312+
identifier: identifier "a"
313+
right:
314+
name_expr
315+
identifier: identifier "b"
232316

233317
===
234318
Logical not
@@ -249,7 +333,12 @@ source_file
249333
top_level
250334
body:
251335
block
252-
stmt: unsupported_node "!a"
336+
stmt:
337+
unary_expr
338+
operand:
339+
name_expr
340+
identifier: identifier "a"
341+
operator: prefix_operator "!"
253342

254343
===
255344
Range operator
@@ -271,4 +360,8 @@ source_file
271360
top_level
272361
body:
273362
block
274-
stmt: unsupported_node "1...10"
363+
stmt:
364+
binary_expr
365+
operator: infix_operator "..."
366+
left: int_literal "1"
367+
right: int_literal "10"

0 commit comments

Comments
 (0)