Skip to content

Commit 6d39f76

Browse files
paldepindCopilot
andcommitted
Unified: Preserve generic arguments on qualified Swift types
Wrap generic member types in generic_type_expr so qualified and nested type arguments remain visible to name binding. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: d0033cd3-ca30-4469-969f-36c4cf463e71
1 parent 01d455f commit 6d39f76

2 files changed

Lines changed: 38 additions & 12 deletions

File tree

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1186,7 +1186,17 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11861186
rule!((identifierType name: @@n) => (identifier #{n})),
11871187
// A qualified type (`Outer.Inner`, `NSString.CompareOptions`). swift-syntax
11881188
// nests these as `memberType` nodes; preserve the nesting as ordinary
1189-
// member access.
1189+
// member access, wrapped in a generic type when it has type arguments.
1190+
rule!(
1191+
(memberType
1192+
baseType: @base
1193+
name: @@name
1194+
genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*))
1195+
=>
1196+
(generic_type_expr
1197+
base: (member_access_expr base: {base} member_name_node: (identifier #{name}))
1198+
type_argument: {args})
1199+
),
11901200
rule!(
11911201
(memberType baseType: @base name: @@name)
11921202
=>

‎unified/extractor/tests/corpus/swift/types/qualified-type.output‎

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -377,28 +377,44 @@ top_level source="⟨body⟩"
377377
parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩"
378378
external_name_node: identifier "_" source="_"
379379
type:
380-
member_access_expr source="⟨base⟩.⟨member_name_node⟩<Metadata>"
381-
base: identifier "Outer" source="Outer"
382-
member_name_node: identifier "Generic" source="Generic"
380+
generic_type_expr source="⟨base⟩<⟨type_argument⟩>"
381+
base:
382+
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
383+
base: identifier "Outer" source="Outer"
384+
member_name_node: identifier "Generic" source="Generic"
385+
type_argument: identifier "Metadata" source="Metadata"
383386
pattern: identifier "value" source="value"
384387
parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩"
385388
external_name_node: identifier "_" source="_"
386389
type:
387-
member_access_expr source="⟨base⟩.⟨member_name_node⟩<ErrorComponentType, [Metadata]>"
390+
generic_type_expr source="⟨base⟩<⟨type_argument⟩, ⟨type_argument⟩>"
388391
base:
389-
member_access_expr source="⟨base⟩.⟨member_name_node⟩<Metadata>"
390-
base: identifier "Outer" source="Outer"
391-
member_name_node: identifier "Generic" source="Generic"
392-
member_name_node: identifier "Deep" source="Deep"
392+
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
393+
base:
394+
generic_type_expr source="⟨base⟩<⟨type_argument⟩>"
395+
base:
396+
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
397+
base: identifier "Outer" source="Outer"
398+
member_name_node: identifier "Generic" source="Generic"
399+
type_argument: identifier "Metadata" source="Metadata"
400+
member_name_node: identifier "Deep" source="Deep"
401+
type_argument:
402+
identifier "ErrorComponentType" source="ErrorComponentType"
403+
generic_type_expr source="[⟨type_argument⟩]"
404+
base: identifier "Array" source=""
405+
type_argument: identifier "Metadata" source="Metadata"
393406
pattern: identifier "nested" source="nested"
394407
parameter source="⟨external_name_node⟩ ⟨pattern⟩: ⟨type⟩"
395408
external_name_node: identifier "_" source="_"
396409
type:
397410
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
398411
base:
399-
member_access_expr source="⟨base⟩.⟨member_name_node⟩<Metadata>"
400-
base: identifier "Outer" source="Outer"
401-
member_name_node: identifier "Generic" source="Generic"
412+
generic_type_expr source="⟨base⟩<⟨type_argument⟩>"
413+
base:
414+
member_access_expr source="⟨base⟩.⟨member_name_node⟩"
415+
base: identifier "Outer" source="Outer"
416+
member_name_node: identifier "Generic" source="Generic"
417+
type_argument: identifier "Metadata" source="Metadata"
402418
member_name_node: identifier "Plain" source="Plain"
403419
pattern: identifier "plain" source="plain"
404420
body: block "{}" source="{}"

0 commit comments

Comments
 (0)