Skip to content

Commit 2dcc6ea

Browse files
committed
unified: Let bare identifiers appear in expr, pattern, and type context
1 parent d06e55c commit 2dcc6ea

130 files changed

Lines changed: 695 additions & 1370 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎unified/extractor/ast_types.yml‎

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
supertypes:
22
expr:
3-
- name_expr
3+
- identifier
44
- named_pattern
55
- expr_pattern
66
- int_literal
@@ -97,15 +97,11 @@ named:
9797
top_level:
9898
body: block
9999

100-
# An identifier used as a name reference.
101-
name_expr:
102-
identifier: identifier
103-
104-
# An identifier that introduces a binding, optionally applying a nested pattern.
100+
# An identifier pattern that applies a nested pattern. Used for scoped imports.
105101
named_pattern:
106102
modifier*: modifier
107103
identifier: identifier
108-
sub_pattern?: expr
104+
sub_pattern: expr
109105

110106
# A pattern expression with modifiers, such as `let x` or `var x`.
111107
expr_pattern:
@@ -313,7 +309,7 @@ named:
313309
#
314310
import_declaration:
315311
modifier*: modifier
316-
imported_expr: expr # Qualified names are encoded as a chain of member_access_expr ending with a name_expr
312+
imported_expr: expr # Qualified names are encoded as a chain of member_access_expr ending with an identifier
317313
pattern?: expr # Binds local names in scope (possibly via bulk_importing_pattern)
318314

319315
# `typealias Name = Type`

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

Lines changed: 45 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ fn make_or_pattern(
105105
}
106106

107107
/// Translate a multi-part identifier (for example `Foo.Bar.Baz`) into a
108-
/// `member_access_expr` chain rooted at a `name_expr` over the first
108+
/// `member_access_expr` chain rooted at an `identifier` for the first
109109
/// part. Panics on an empty input because the grammar's `_+` quantifier
110110
/// guarantees at least one part.
111111
fn member_chain(
@@ -116,7 +116,7 @@ fn member_chain(
116116
let first = iter
117117
.next()
118118
.expect("identifier with `part:` must have at least one part");
119-
let init = tree!((name_expr identifier: (identifier #{first})));
119+
let init = tree!((identifier #{first}));
120120
iter.fold(
121121
init,
122122
|acc, elem| tree!((member_access_expr base: {acc} member: (identifier #{elem}))),
@@ -186,16 +186,16 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
186186
(unsupported_node)
187187
),
188188
rule!((declReferenceExpr baseName: (identifier) @name) => expr {
189-
tree!((name_expr identifier: (identifier #{name})))
189+
tree!((identifier #{name}))
190190
}),
191191
// A bare name reference (`x`), and an operator used as a value (`+` in
192192
// `reduce(0, +)`), are both `declReferenceExpr`; its `baseName` is the
193193
// referenced identifier / operator symbol.
194-
rule!((declReferenceExpr baseName: @name) => (name_expr identifier: (identifier #{name}))),
194+
rule!((declReferenceExpr baseName: @name) => (identifier #{name})),
195195
// A discard `_` used as an expression — e.g. the target of a discarding
196196
// assignment `_ = x`. swift-syntax models it as a `discardAssignmentExpr`;
197-
// the target AST represents it as a `name_expr` over the `_` token.
198-
rule!((discardAssignmentExpr wildcard: @@w) => (name_expr identifier: (identifier #{w}))),
197+
// the target AST represents it as an `identifier` over the `_` token.
198+
rule!((discardAssignmentExpr wildcard: @@w) => (identifier #{w})),
199199
// A generic specialization in expression position (`C<Foo>`,
200200
// `Array<Int>`) is represented by swift-syntax as a
201201
// `genericSpecializationExpr`. When used as a call target
@@ -207,7 +207,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
207207
genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*))
208208
=>
209209
(generic_type_expr
210-
base: (name_expr identifier: (identifier #{name}))
210+
base: (identifier #{name})
211211
type_argument: {args})
212212
),
213213
// ---- Operators ----
@@ -342,7 +342,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
342342
result.push(tree!(
343343
(variable_declaration
344344
modifier: {ctx.outer_modifiers.clone()}
345-
pattern: (named_pattern identifier: (identifier #{name}))
345+
pattern: (identifier #{name})
346346
type: {ty}
347347
value: {val})
348348
));
@@ -450,7 +450,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
450450
rule!(
451451
(enumCaseParameter firstName: _? @@name type: @ty)
452452
=>
453-
(parameter pattern: (named_pattern identifier: (identifier #{name}))? type: {ty})
453+
(parameter pattern: (identifier #{name})? type: {ty})
454454
),
455455
// An enum element with associated values (`case circle(radius: Double)`)
456456
// becomes a nested `class_like_declaration` whose constructor carries the
@@ -476,7 +476,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
476476
modifier: {ctx.outer_modifiers.clone()}
477477
modifier: {chained_modifier(&mut ctx)}
478478
modifier: (modifier "enum_case")
479-
pattern: (named_pattern identifier: (identifier #{name}))
479+
pattern: (identifier #{name})
480480
value: {val})
481481
),
482482
rule!(
@@ -486,7 +486,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
486486
modifier: {ctx.outer_modifiers.clone()}
487487
modifier: {chained_modifier(&mut ctx)}
488488
modifier: (modifier "enum_case")
489-
pattern: (named_pattern identifier: (identifier #{name})))
489+
pattern: (identifier #{name}))
490490
),
491491
// Enum cases. A single `case` declaration may carry modifiers
492492
// (e.g. `indirect`) and list several comma-separated elements; each
@@ -512,7 +512,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
512512
rule!(
513513
(identifierPattern identifier: @name)
514514
=>
515-
(named_pattern identifier: (identifier #{name}))
515+
(identifier #{name})
516516
),
517517
// A `let`/`var` value-binding pattern (`let x`) inside a case or `if case`
518518
// preserves the binding specifier around its inner pattern.
@@ -538,7 +538,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
538538
// A wildcard *binding* pattern (`let _ = x`, `for _ in xs`). swift-syntax
539539
// models this as a `wildcardPattern`, distinct from the `_` match form
540540
// handled by the context-aware `discardAssignmentExpr` rule.
541-
rule!((wildcardPattern) @@wildcard => (name_expr identifier: (identifier #{wildcard}))),
541+
rule!((wildcardPattern) @@wildcard => (identifier #{wildcard})),
542542
// An expression pattern only establishes pattern context; its child
543543
// determines the concrete pattern shape.
544544
rule!((expressionPattern expression: @@e) => expr {
@@ -599,7 +599,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
599599
};
600600
tree!((parameter
601601
external_name: {external}
602-
pattern: (named_pattern identifier: (identifier #{name}))
602+
pattern: (identifier #{name})
603603
type: {ty}
604604
default: {val}))
605605
}
@@ -617,7 +617,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
617617
=>
618618
(call_expr
619619
callee: (generic_type_expr
620-
base: (name_expr identifier: (identifier "Array"))
620+
base: (identifier "Array")
621621
type_argument: {element})
622622
argument: {args}
623623
argument: (argument value: {tc}))
@@ -629,7 +629,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
629629
=>
630630
(call_expr
631631
callee: (generic_type_expr
632-
base: (name_expr identifier: (identifier "Array"))
632+
base: (identifier "Array")
633633
type_argument: {element})
634634
argument: {args})
635635
),
@@ -679,7 +679,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
679679
rule!(
680680
(labeledExpr label: _? @@lbl expression: (discardAssignmentExpr) @@wildcard)
681681
=>
682-
(argument name: (identifier #{lbl})? value: (name_expr identifier: (identifier #{wildcard})))
682+
(argument name: (identifier #{lbl})? value: (identifier #{wildcard}))
683683
),
684684
rule!(
685685
(labeledExpr label: _? @@lbl expression: @val)
@@ -702,7 +702,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
702702
=>
703703
(member_access_expr
704704
base: (generic_type_expr
705-
base: (name_expr identifier: (identifier "Array"))
705+
base: (identifier "Array")
706706
type_argument: {element})
707707
member: (identifier #{member}))
708708
),
@@ -748,7 +748,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
748748
),
749749
// A closure capture (`[weak self]`, `[x]`, `[y = expr]`). The optional
750750
// ownership specifier (`weak`/`unowned`) becomes a modifier; the
751-
// captured name becomes the bound `name_expr`; an explicit capture
751+
// captured name becomes the bound `identifier`; an explicit capture
752752
// initializer (`[y = expr]`) becomes the bound value.
753753
rule!(
754754
(closureCapture
@@ -758,7 +758,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
758758
=>
759759
(variable_declaration
760760
modifier: (modifier #{spec})?
761-
pattern: (named_pattern identifier: (identifier #{name}))
761+
pattern: (identifier #{name})
762762
value: {val})
763763
),
764764
// A closure parameter clause (`(x: Int, y)`) unwraps to its parameters.
@@ -768,14 +768,14 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
768768
rule!(
769769
(closureParameter firstName: @name type: _? @ty)
770770
=>
771-
(parameter pattern: (named_pattern identifier: (identifier #{name})) type: {ty})
771+
(parameter pattern: (identifier #{name}) type: {ty})
772772
),
773773
// A shorthand closure parameter (`x` in `{ x, y in … }`): a bare name
774774
// with no parentheses and no type.
775775
rule!(
776776
(closureShorthandParameter name: @name)
777777
=>
778-
(parameter pattern: (named_pattern identifier: (identifier #{name})))
778+
(parameter pattern: (identifier #{name}))
779779
),
780780
// ---- Control flow ----
781781
// An `if`/`else` expression. Conditions are joined via `and_chain`; the
@@ -847,17 +847,21 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
847847
(pattern_guard_expr
848848
value: {val}
849849
pattern: (call_expr
850-
callee: (member_access_expr base: (name_expr identifier: (identifier "Optional")) member: (identifier "some"))
851-
argument: (argument value: (named_pattern identifier: (identifier #{name})))))
850+
callee: (member_access_expr base: (identifier "Optional") member: (identifier "some"))
851+
argument: (argument value: (expr_pattern
852+
modifier: (modifier "let")
853+
expr: (identifier #{name})))))
852854
),
853855
rule!(
854856
(optionalBindingCondition pattern: (identifierPattern identifier: @name))
855857
=>
856858
(pattern_guard_expr
857-
value: (name_expr identifier: (identifier #{name}))
859+
value: (identifier #{name})
858860
pattern: (call_expr
859-
callee: (member_access_expr base: (name_expr identifier: (identifier "Optional")) member: (identifier "some"))
860-
argument: (argument value: (named_pattern identifier: (identifier #{name})))))
861+
callee: (member_access_expr base: (identifier "Optional") member: (identifier "some"))
862+
argument: (argument value: (expr_pattern
863+
modifier: (modifier "let")
864+
expr: (identifier #{name})))))
861865
),
862866
// A single condition in an `if`/`while`/`guard` condition list unwraps to
863867
// its inner expression; `and_chain` joins multiple with `&&`.
@@ -931,7 +935,7 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
931935
if ctx.in_pattern {
932936
tree!((call_expr
933937
callee: (member_access_expr
934-
base: (name_expr identifier: (identifier "Optional"))
938+
base: (identifier "Optional")
935939
member: (identifier "some"))
936940
argument: (argument value: {inner})))
937941
} else {
@@ -991,10 +995,10 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
991995
rule!((forceUnwrapExpr expression: @e) => (unary_expr operator: (postfix_operator "!") operand: {e})),
992996
// ---- Imports ----
993997
// An import declaration. The dotted path (a list of
994-
// `importPathComponent`s) becomes a `name_expr`/`member_access_expr`
998+
// `importPathComponent`s) becomes an `identifier`/`member_access_expr`
995999
// chain (via `member_chain`). A scoped import (`import struct Foo.Bar`)
9961000
// has an `importKindSpecifier` and binds the last path component as a
997-
// `name_expr`; a plain import (`import Foundation`) has none and uses
1001+
// raw identifier; a plain import (`import Foundation`) has none and uses
9981002
// a `bulk_importing_pattern` spanning the whole declaration. Any leading
9991003
// attributes (`@_exported`) and access modifiers (`public`) become
10001004
// `modifier`s.
@@ -1006,12 +1010,13 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10061010
path: (importPathComponent name: @@parts)*)
10071011
=>
10081012
import_declaration {
1009-
let bulk_import = match kind {
1010-
None => Some(tree!((bulk_importing_pattern))),
1011-
Some(_) => None, // scoped import, no bulk import
1012-
};
10131013
let last = *parts.last().ok_or("import has no path")?;
1014-
let pattern = tree!((named_pattern identifier: (identifier #{last}) sub_pattern: {bulk_import}));
1014+
let pattern = match kind {
1015+
None => tree!((named_pattern
1016+
identifier: (identifier #{last})
1017+
sub_pattern: (bulk_importing_pattern))),
1018+
Some(_) => tree!((identifier #{last})),
1019+
};
10151020
tree!((import_declaration
10161021
modifier: (modifier #{kind})?
10171022
modifier: {attrs}
@@ -1040,11 +1045,11 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10401045
genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*))
10411046
=>
10421047
(generic_type_expr
1043-
base: (name_expr identifier: (identifier #{name}))
1048+
base: (identifier #{name})
10441049
type_argument: {args})
10451050
),
10461051
// A named type (`Int`). `identifierType.name` is the type-name token.
1047-
rule!((identifierType name: @@n) => (name_expr identifier: (identifier #{n}))),
1052+
rule!((identifierType name: @@n) => (identifier #{n})),
10481053
// A qualified type (`Outer.Inner`, `NSString.CompareOptions`). swift-syntax
10491054
// nests these as `memberType` nodes; preserve the nesting as ordinary
10501055
// member access.
@@ -1058,17 +1063,17 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
10581063
rule!(
10591064
(optionalType wrappedType: @w)
10601065
=>
1061-
(generic_type_expr base: (name_expr identifier: (identifier "Optional")) type_argument: {w})
1066+
(generic_type_expr base: (identifier "Optional") type_argument: {w})
10621067
),
10631068
rule!(
10641069
(arrayType element: @e)
10651070
=>
1066-
(generic_type_expr base: (name_expr identifier: (identifier "Array")) type_argument: {e})
1071+
(generic_type_expr base: (identifier "Array") type_argument: {e})
10671072
),
10681073
rule!(
10691074
(dictionaryType key: @k value: @v)
10701075
=>
1071-
(generic_type_expr base: (name_expr identifier: (identifier "Dictionary")) type_argument: {k} type_argument: {v})
1076+
(generic_type_expr base: (identifier "Dictionary") type_argument: {k} type_argument: {v})
10721077
),
10731078
// A tuple type (`(Int, String)`) or function type (`(Int) -> Bool`).
10741079
// Both hold their contents as `tupleTypeElement`s, but a tuple element

‎unified/extractor/tests/corpus/swift/closures/closure-with-capture-list.output‎

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -66,24 +66,18 @@ top_level
6666
stmt:
6767
variable_declaration
6868
modifier: modifier "let"
69-
pattern:
70-
named_pattern
71-
identifier: identifier "f"
69+
pattern: identifier "f"
7270
value:
7371
function_expr
7472
capture_declaration:
7573
variable_declaration
7674
modifier: modifier "weak"
77-
pattern:
78-
named_pattern
79-
identifier: identifier "self"
75+
pattern: identifier "self"
8076
body:
8177
block
8278
stmt:
8379
call_expr
8480
callee:
8581
member_access_expr
86-
base:
87-
name_expr
88-
identifier: identifier "self"
82+
base: identifier "self"
8983
member: identifier "doThing"

‎unified/extractor/tests/corpus/swift/closures/closure-with-explicit-parameters.output‎

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,28 +68,18 @@ top_level
6868
stmt:
6969
variable_declaration
7070
modifier: modifier "let"
71-
pattern:
72-
named_pattern
73-
identifier: identifier "f"
71+
pattern: identifier "f"
7472
value:
7573
function_expr
7674
parameter:
7775
parameter
78-
type:
79-
name_expr
80-
identifier: identifier "Int"
81-
pattern:
82-
named_pattern
83-
identifier: identifier "x"
84-
return_type:
85-
name_expr
86-
identifier: identifier "Int"
76+
type: identifier "Int"
77+
pattern: identifier "x"
78+
return_type: identifier "Int"
8779
body:
8880
block
8981
stmt:
9082
binary_expr
91-
left:
92-
name_expr
93-
identifier: identifier "x"
83+
left: identifier "x"
9484
operator: infix_operator "*"
9585
right: int_literal "2"

0 commit comments

Comments
 (0)