Skip to content

Commit a165a40

Browse files
authored
Merge pull request #22284 from asgerf/unified/local-type-names
Unified: Track all local name kinds in one pass
2 parents bfc7a8b + 08359ec commit a165a40

18 files changed

Lines changed: 604 additions & 54 deletions

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

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
185185
// the target AST has no expression-level discard (only `ignore_pattern`,
186186
// which is a pattern), so it becomes a `name_expr` over the `_` token.
187187
rule!((discardAssignmentExpr wildcard: @@w) => (name_expr identifier: (identifier #{w}))),
188+
// A generic specialization in expression position (`C<Foo>`,
189+
// `Array<Int>`) is represented by swift-syntax as a
190+
// `genericSpecializationExpr`. When used as a call target
191+
// (`C<Foo>()`), this should become a `call_expr` whose callee is a
192+
// `generic_type_expr`, so we map it directly to that shape.
193+
rule!(
194+
(genericSpecializationExpr
195+
expression: (declReferenceExpr baseName: @name)
196+
genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*))
197+
=>
198+
(generic_type_expr
199+
base: (named_type_expr name: (identifier #{name}))
200+
type_argument: {args})
201+
),
188202
// ---- Operators ----
189203
// The parser front-end folds operator chains into nested
190204
// `infixOperatorExpr`s by precedence (see swift-syntax-rs), so
@@ -568,26 +582,30 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
568582
rule!(
569583
(functionDecl
570584
name: @name
585+
genericParameterClause: (genericParameterClause parameters: _* @type_params)?
571586
signature: (functionSignature
572587
parameterClause: (functionParameterClause parameters: _* @params)
573588
returnClause: (returnClause type: @ret)?)
574589
body: (codeBlock statements: _* @body))
575590
=>
576591
(function_declaration
577592
name: (identifier #{name})
593+
type_parameter: {type_params}
578594
parameter: {params}
579595
return_type: {ret}
580596
body: (block stmt: {body}))
581597
),
582598
rule!(
583599
(functionDecl
584600
name: @name
601+
genericParameterClause: (genericParameterClause parameters: _* @type_params)?
585602
signature: (functionSignature
586603
parameterClause: (functionParameterClause parameters: _* @params)
587604
returnClause: (returnClause type: @ret)?))
588605
=>
589606
(function_declaration
590607
name: (identifier #{name})
608+
type_parameter: {type_params}
591609
parameter: {params}
592610
return_type: {ret}
593611
body: (block))
@@ -1065,19 +1083,51 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10651083
// A nominal type's `inheritanceClause` (`: Base, Proto`) becomes a list
10661084
// of `base_type`s, one per inherited type. Each declaration keyword
10671085
// gets its own rule; the bodies are identical but for the keyword.
1086+
rule!(
1087+
(genericParameter
1088+
attributes: _* @attrs
1089+
specifier: _? @@spec
1090+
name: @@name
1091+
inheritedType: _? @bound)
1092+
=>
1093+
(type_parameter
1094+
modifier: {attrs}
1095+
modifier: (modifier #{spec})?
1096+
name: (identifier #{name})
1097+
bound: {bound})
1098+
),
1099+
rule!(
1100+
(genericRequirement
1101+
requirement: (conformanceRequirement leftType: @ty rightType: @bound))
1102+
=>
1103+
(bound_type_constraint type: {ty} bound: {bound})
1104+
),
1105+
rule!(
1106+
(genericRequirement
1107+
requirement: (sameTypeRequirement leftType: @left rightType: @right))
1108+
=>
1109+
(equality_type_constraint left: {left} right: {right})
1110+
),
10681111
// Class declaration with body containing members
10691112
rule!(
10701113
(classDecl
10711114
classKeyword: @kind
10721115
modifiers: _* @mods
10731116
name: @name
1117+
genericParameterClause: (genericParameterClause
1118+
parameters: _* @params
1119+
genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)?
10741120
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
1121+
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
10751122
memberBlock: (memberBlock members: _* @members))
10761123
=>
10771124
(class_like_declaration
10781125
modifier: (modifier #{kind})
10791126
modifier: {mods}
10801127
name: (identifier #{name})
1128+
type_parameter: {params}
1129+
type_constraint: {parameter_constraints}
1130+
type_constraint: {declaration_constraints}
10811131
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
10821132
member: {members})
10831133
),
@@ -1087,13 +1137,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10871137
enumKeyword: @kind
10881138
modifiers: _* @mods
10891139
name: @name
1140+
genericParameterClause: (genericParameterClause
1141+
parameters: _* @params
1142+
genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)?
10901143
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
1144+
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
10911145
memberBlock: (memberBlock members: _* @members))
10921146
=>
10931147
(class_like_declaration
10941148
modifier: (modifier #{kind})
10951149
modifier: {mods}
10961150
name: (identifier #{name})
1151+
type_parameter: {params}
1152+
type_constraint: {parameter_constraints}
1153+
type_constraint: {declaration_constraints}
10971154
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
10981155
member: {members})
10991156
),
@@ -1103,13 +1160,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11031160
structKeyword: @kind
11041161
modifiers: _* @mods
11051162
name: @name
1163+
genericParameterClause: (genericParameterClause
1164+
parameters: _* @params
1165+
genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)?
11061166
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
1167+
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
11071168
memberBlock: (memberBlock members: _* @members))
11081169
=>
11091170
(class_like_declaration
11101171
modifier: (modifier #{kind})
11111172
modifier: {mods}
11121173
name: (identifier #{name})
1174+
type_parameter: {params}
1175+
type_constraint: {parameter_constraints}
1176+
type_constraint: {declaration_constraints}
11131177
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
11141178
member: {members})
11151179
),
@@ -1119,13 +1183,17 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11191183
protocolKeyword: @kind
11201184
modifiers: _* @mods
11211185
name: @name
1186+
genericParameterClause: (genericParameterClause parameters: _* @params)?
11221187
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
1188+
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
11231189
memberBlock: (memberBlock members: _* @members))
11241190
=>
11251191
(class_like_declaration
11261192
modifier: (modifier #{kind})
11271193
modifier: {mods}
11281194
name: (identifier #{name})
1195+
type_parameter: {params}
1196+
type_constraint: {declaration_constraints}
11291197
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
11301198
member: {members})
11311199
),
@@ -1180,11 +1248,13 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
11801248
(typeAliasDecl
11811249
modifiers: _* @mods
11821250
name: @@name
1251+
genericParameterClause: (genericParameterClause parameters: _* @type_params)?
11831252
initializer: (typeInitializerClause value: @val))
11841253
=>
11851254
(type_alias_declaration
11861255
modifier: {mods}
11871256
name: (identifier #{name})
1257+
type_parameter: {type_params}
11881258
r#type: {val})
11891259
),
11901260
// Associated type declaration (with optional bound)

unified/extractor/tests/corpus/swift/expressions/generic-specialization-expression.output

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,11 @@ top_level
5353
identifier: identifier "numbers"
5454
value:
5555
call_expr
56-
callee: unsupported_node "Array<Int>"
56+
callee:
57+
generic_type_expr
58+
base:
59+
named_type_expr
60+
name: identifier "Array"
61+
type_argument:
62+
named_type_expr
63+
name: identifier "Int"
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
class Foo {}
2+
class C<T> {}
3+
let x = C<Foo>()
4+
5+
---
6+
7+
sourceFile
8+
endOfFileToken: endOfFile
9+
statements:
10+
codeBlockItem
11+
item:
12+
classDecl
13+
attributes:
14+
name: identifier "Foo"
15+
memberBlock:
16+
memberBlock
17+
leftBrace: {
18+
rightBrace: }
19+
members:
20+
modifiers:
21+
classKeyword: class
22+
codeBlockItem
23+
item:
24+
classDecl
25+
attributes:
26+
name: identifier "C"
27+
genericParameterClause:
28+
genericParameterClause
29+
parameters:
30+
genericParameter
31+
attributes:
32+
name: identifier "T"
33+
leftAngle: <
34+
rightAngle: >
35+
memberBlock:
36+
memberBlock
37+
leftBrace: {
38+
rightBrace: }
39+
members:
40+
modifiers:
41+
classKeyword: class
42+
codeBlockItem
43+
item:
44+
variableDecl
45+
attributes:
46+
modifiers:
47+
bindingSpecifier: let
48+
bindings:
49+
patternBinding
50+
initializer:
51+
initializerClause
52+
equal: =
53+
value:
54+
functionCallExpr
55+
leftParen: (
56+
rightParen: )
57+
arguments:
58+
additionalTrailingClosures:
59+
calledExpression:
60+
genericSpecializationExpr
61+
expression:
62+
declReferenceExpr
63+
baseName: identifier "C"
64+
genericArgumentClause:
65+
genericArgumentClause
66+
arguments:
67+
genericArgument
68+
argument:
69+
identifierType
70+
name: identifier "Foo"
71+
leftAngle: <
72+
rightAngle: >
73+
pattern:
74+
identifierPattern
75+
identifier: identifier "x"
76+
77+
---
78+
79+
top_level
80+
body:
81+
block
82+
stmt:
83+
class_like_declaration
84+
modifier: modifier "class"
85+
name: identifier "Foo"
86+
class_like_declaration
87+
modifier: modifier "class"
88+
name: identifier "C"
89+
type_parameter:
90+
type_parameter
91+
name: identifier "T"
92+
variable_declaration
93+
modifier: modifier "let"
94+
pattern:
95+
name_pattern
96+
identifier: identifier "x"
97+
value:
98+
call_expr
99+
callee:
100+
generic_type_expr
101+
base:
102+
named_type_expr
103+
name: identifier "C"
104+
type_argument:
105+
named_type_expr
106+
name: identifier "Foo"
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
class Foo {}
2+
class C<T> {}
3+
let x = C<Foo>()

unified/extractor/tests/corpus/swift/functions/generic-function.output

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ top_level
6565
stmt:
6666
function_declaration
6767
name: identifier "identity"
68+
type_parameter:
69+
type_parameter
70+
name: identifier "T"
6871
parameter:
6972
parameter
7073
external_name: identifier "_"
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
typealias Box<T: Equatable, U> = Dictionary<T, U>
2+
3+
---
4+
5+
sourceFile
6+
endOfFileToken: endOfFile
7+
statements:
8+
codeBlockItem
9+
item:
10+
typeAliasDecl
11+
attributes:
12+
name: identifier "Box"
13+
genericParameterClause:
14+
genericParameterClause
15+
parameters:
16+
genericParameter
17+
colon: :
18+
attributes:
19+
name: identifier "T"
20+
trailingComma: ,
21+
inheritedType:
22+
identifierType
23+
name: identifier "Equatable"
24+
genericParameter
25+
attributes:
26+
name: identifier "U"
27+
leftAngle: <
28+
rightAngle: >
29+
modifiers:
30+
initializer:
31+
typeInitializerClause
32+
equal: =
33+
value:
34+
identifierType
35+
name: identifier "Dictionary"
36+
genericArgumentClause:
37+
genericArgumentClause
38+
arguments:
39+
genericArgument
40+
trailingComma: ,
41+
argument:
42+
identifierType
43+
name: identifier "T"
44+
genericArgument
45+
argument:
46+
identifierType
47+
name: identifier "U"
48+
leftAngle: <
49+
rightAngle: >
50+
typealiasKeyword: typealias
51+
52+
---
53+
54+
top_level
55+
body:
56+
block
57+
stmt:
58+
type_alias_declaration
59+
name: identifier "Box"
60+
type_parameter:
61+
type_parameter
62+
name: identifier "T"
63+
bound:
64+
named_type_expr
65+
name: identifier "Equatable"
66+
type_parameter
67+
name: identifier "U"
68+
type:
69+
generic_type_expr
70+
base:
71+
named_type_expr
72+
name: identifier "Dictionary"
73+
type_argument:
74+
named_type_expr
75+
name: identifier "T"
76+
named_type_expr
77+
name: identifier "U"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
typealias Box<T: Equatable, U> = Dictionary<T, U>

0 commit comments

Comments
 (0)