Skip to content

Commit f362707

Browse files
committed
unified/swift: Imports
1 parent 15208b7 commit f362707

3 files changed

Lines changed: 257 additions & 0 deletions

File tree

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,38 @@ fn translation_rules() -> Vec<yeast::Rule> {
633633
rule!((check_expression op: @op target: @val type: @ty) => (type_test_expr expr: {val} operator: (infix_operator #{op}) type: {ty})),
634634
// Await expression → unary_expr with operator "await"
635635
rule!((await_expression expr: @val) => (unary_expr operator: (prefix_operator "await") operand: {val})),
636+
// A multi-part identifier (for example `Foo.Bar.Baz`) is translated to
637+
// a member_access_expr chain with a name_expr base.
638+
rule!(
639+
(identifier part: _+ @parts)
640+
=>
641+
{parts}.reduce_left(
642+
first -> (name_expr identifier: (identifier #{first})),
643+
acc, elem -> (member_access_expr base: {acc} member: (identifier #{elem})))
644+
),
645+
// Scoped import declaration (for example `import struct Foo.Bar`):
646+
// flatten the identifier parts into a member_access_expr and bind the
647+
// final segment as a name_pattern.
648+
rule!(
649+
(import_declaration scoped_import_kind: @kind name: (identifier part: _+ @parts) @name modifiers: (modifiers)? @mods)
650+
=>
651+
(import_declaration
652+
pattern: (name_pattern identifier: (identifier #{parts.last().unwrap()}))
653+
imported_expr: {name}
654+
modifier: (modifier #{kind})
655+
modifier: {..mods})
656+
),
657+
// Non-scoped import declaration (for example `import Foundation`):
658+
// flatten the identifier parts into a member_access_expr and use a
659+
// bulk_importing_pattern.
660+
rule!(
661+
(import_declaration name: @name modifiers: (modifiers)? @mods)
662+
=>
663+
(import_declaration
664+
pattern: (bulk_importing_pattern)
665+
imported_expr: {name}
666+
modifier: {..mods})
667+
),
636668
// ---- Fallbacks ----
637669
rule!(
638670
(_)

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

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,3 +53,134 @@ top_level
5353
right:
5454
name_expr
5555
identifier: identifier "bar"
56+
57+
===
58+
Simple import with single name
59+
===
60+
61+
import Foundation
62+
63+
---
64+
65+
source_file
66+
statement:
67+
import_declaration
68+
name:
69+
identifier
70+
part: simple_identifier "Foundation"
71+
72+
---
73+
74+
top_level
75+
body:
76+
block
77+
stmt:
78+
import_declaration
79+
pattern: bulk_importing_pattern "import Foundation"
80+
imported_expr:
81+
name_expr
82+
identifier: identifier "Foundation"
83+
84+
===
85+
Import with dotted path (two parts)
86+
===
87+
88+
import Foundation.Networking
89+
90+
---
91+
92+
source_file
93+
statement:
94+
import_declaration
95+
name:
96+
identifier
97+
part:
98+
simple_identifier "Foundation"
99+
simple_identifier "Networking"
100+
101+
---
102+
103+
top_level
104+
body:
105+
block
106+
stmt:
107+
import_declaration
108+
pattern: bulk_importing_pattern "import Foundation.Networking"
109+
imported_expr:
110+
member_access_expr
111+
base:
112+
name_expr
113+
identifier: identifier "Foundation"
114+
member: identifier "Networking"
115+
116+
===
117+
Import with deeply nested path (three parts)
118+
===
119+
120+
import Foundation.Networking.URLSession
121+
122+
---
123+
124+
source_file
125+
statement:
126+
import_declaration
127+
name:
128+
identifier
129+
part:
130+
simple_identifier "Foundation"
131+
simple_identifier "Networking"
132+
simple_identifier "URLSession"
133+
134+
---
135+
136+
top_level
137+
body:
138+
block
139+
stmt:
140+
import_declaration
141+
pattern: bulk_importing_pattern "import Foundation.Networking.URLSession"
142+
imported_expr:
143+
member_access_expr
144+
base:
145+
member_access_expr
146+
base:
147+
name_expr
148+
identifier: identifier "Foundation"
149+
member: identifier "Networking"
150+
member: identifier "URLSession"
151+
152+
===
153+
Scoped import uses name_pattern
154+
===
155+
156+
import struct Foundation.Date
157+
158+
---
159+
160+
source_file
161+
statement:
162+
import_declaration
163+
name:
164+
identifier
165+
part:
166+
simple_identifier "Foundation"
167+
simple_identifier "Date"
168+
scoped_import_kind: struct
169+
170+
---
171+
172+
top_level
173+
body:
174+
block
175+
stmt:
176+
import_declaration
177+
modifier: modifier "struct"
178+
pattern:
179+
name_pattern
180+
identifier: identifier "Date"
181+
imported_expr:
182+
member_access_expr
183+
base:
184+
name_expr
185+
identifier: identifier "Foundation"
186+
member: identifier "Date"

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

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,3 +555,97 @@ top_level
555555
name_pattern
556556
identifier: identifier "x"
557557
return_type: unsupported_node "T"
558+
559+
===
560+
Leading-dot expression value
561+
===
562+
563+
let x = .foo
564+
565+
---
566+
567+
source_file
568+
statement:
569+
property_declaration
570+
binding:
571+
value_binding_pattern
572+
mutability: let
573+
declarator:
574+
property_binding
575+
name:
576+
pattern
577+
bound_identifier: simple_identifier "x"
578+
value:
579+
prefix_expression
580+
operation: .
581+
target: simple_identifier "foo"
582+
583+
---
584+
585+
top_level
586+
body:
587+
block
588+
stmt:
589+
variable_declaration
590+
modifier: modifier "let"
591+
pattern:
592+
name_pattern
593+
identifier: identifier "x"
594+
value:
595+
member_access_expr
596+
base: inferred_type_expr ".foo"
597+
member: identifier "foo"
598+
599+
===
600+
Leading-dot expression call
601+
===
602+
603+
let y = .some(1)
604+
605+
---
606+
607+
source_file
608+
statement:
609+
property_declaration
610+
binding:
611+
value_binding_pattern
612+
mutability: let
613+
declarator:
614+
property_binding
615+
name:
616+
pattern
617+
bound_identifier: simple_identifier "y"
618+
value:
619+
call_expression
620+
function:
621+
prefix_expression
622+
operation: .
623+
target: simple_identifier "some"
624+
suffix:
625+
call_suffix
626+
arguments:
627+
value_arguments
628+
argument:
629+
value_argument
630+
value: integer_literal "1"
631+
632+
---
633+
634+
top_level
635+
body:
636+
block
637+
stmt:
638+
variable_declaration
639+
modifier: modifier "let"
640+
pattern:
641+
name_pattern
642+
identifier: identifier "y"
643+
value:
644+
call_expr
645+
argument:
646+
argument
647+
value: int_literal "1"
648+
callee:
649+
member_access_expr
650+
base: inferred_type_expr ".some"
651+
member: identifier "some"

0 commit comments

Comments
 (0)