Skip to content

Commit 3843b4a

Browse files
tausbnCopilot
andcommitted
Unified: Fix locations of synthesized array types
Anchor synthesized generic type expressions for Swift array syntax to the original array node. This keeps the closing bracket in the type range without leaking it into surrounding calls or member accesses. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c953ebd commit 3843b4a

3 files changed

Lines changed: 43 additions & 21 deletions

File tree

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

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -648,27 +648,41 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
648648
// `Array<T>` generic type constructor instead.
649649
rule!(
650650
(functionCallExpr
651-
calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element))
651+
calledExpression: (arrayExpr
652+
elements: (arrayElement expression: (genericSpecializationExpr) @element)) @@array
652653
arguments: _* @args
653654
trailingClosure: @tc)
654655
=>
655-
(call_expr
656-
callee: (generic_type_expr
656+
call_expr {
657+
let callee = tree_at!(
658+
ctx,
659+
array,
660+
(generic_type_expr
657661
base: (identifier "Array")
658662
type_argument: {element})
659-
argument: {args}
660-
argument: (argument value: {tc}))
663+
);
664+
tree!((call_expr
665+
callee: {callee}
666+
argument: {args}
667+
argument: (argument value: {tc})))
668+
}
661669
),
662670
rule!(
663671
(functionCallExpr
664-
calledExpression: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element))
672+
calledExpression: (arrayExpr
673+
elements: (arrayElement expression: (genericSpecializationExpr) @element)) @@array
665674
arguments: _* @args)
666675
=>
667-
(call_expr
668-
callee: (generic_type_expr
676+
call_expr {
677+
let callee = tree_at!(
678+
ctx,
679+
array,
680+
(generic_type_expr
669681
base: (identifier "Array")
670682
type_argument: {element})
671-
argument: {args})
683+
);
684+
tree!((call_expr callee: {callee} argument: {args}))
685+
}
672686
),
673687
// A function/method call (`foo(1, 2)`). `calledExpression` is the callee
674688
// and `arguments` is an (elided) list of `labeledExpr`, each translated
@@ -739,14 +753,22 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
739753
// meaning as `Array<T>` rather than an array literal.
740754
rule!(
741755
(memberAccessExpr
742-
base: (arrayExpr elements: (arrayElement expression: (genericSpecializationExpr) @element))
756+
base: (arrayExpr
757+
elements: (arrayElement expression: (genericSpecializationExpr) @element)) @@array
743758
declName: (declReferenceExpr baseName: @member))
744759
=>
745-
(member_access_expr
746-
base: (generic_type_expr
747-
base: (identifier "Array")
748-
type_argument: {element})
749-
member_name_node: (identifier #{member}))
760+
member_access_expr {
761+
let base = tree_at!(
762+
ctx,
763+
array,
764+
(generic_type_expr
765+
base: (identifier "Array")
766+
type_argument: {element})
767+
);
768+
tree!((member_access_expr
769+
base: {base}
770+
member_name_node: (identifier #{member})))
771+
}
750772
),
751773
rule!(
752774
(memberAccessExpr base: @base declName: (declReferenceExpr baseName: @member))

‎unified/extractor/tests/corpus/swift/expressions/array-type-constructor.output‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,9 @@ top_level source="⟨body⟩"
132132
modifier: modifier "let" source="let"
133133
pattern: identifier "values" source="values"
134134
value:
135-
call_expr source="⟨callee⟩]()"
135+
call_expr source="⟨callee⟩()"
136136
callee:
137-
generic_type_expr source="[⟨type_argument⟩"
137+
generic_type_expr source="[⟨type_argument⟩]"
138138
base: identifier "Array" source=""
139139
type_argument:
140140
generic_type_expr source="⟨base⟩<⟨type_argument⟩>"
@@ -144,9 +144,9 @@ top_level source="⟨body⟩"
144144
modifier: modifier "let" source="let"
145145
pattern: identifier "initialized" source="initialized"
146146
value:
147-
call_expr source="⟨callee⟩](⟨argument⟩) ⟨argument⟩"
147+
call_expr source="⟨callee⟩(⟨argument⟩) ⟨argument⟩"
148148
callee:
149-
generic_type_expr source="[⟨type_argument⟩"
149+
generic_type_expr source="[⟨type_argument⟩]"
150150
base: identifier "Array" source=""
151151
type_argument:
152152
generic_type_expr source="⟨base⟩<⟨type_argument⟩>"

‎unified/extractor/tests/corpus/swift/expressions/array-type-metatype.output‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,9 @@ top_level source="⟨body⟩"
5656
modifier: modifier "let" source="let"
5757
pattern: identifier "type" source="type"
5858
value:
59-
member_access_expr source="⟨base⟩].⟨member_name_node⟩"
59+
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
6060
base:
61-
generic_type_expr source="[⟨type_argument⟩"
61+
generic_type_expr source="[⟨type_argument⟩]"
6262
base: identifier "Array" source=""
6363
type_argument:
6464
generic_type_expr source="⟨base⟩<⟨type_argument⟩>"

0 commit comments

Comments
 (0)