Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions unified/extractor/src/languages/swift/swift.rs
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
// the target AST has no expression-level discard (only `ignore_pattern`,
// which is a pattern), so it becomes a `name_expr` over the `_` token.
rule!((discardAssignmentExpr wildcard: @@w) => (name_expr identifier: (identifier #{w}))),
// A generic specialization in expression position (`C<Foo>`,
// `Array<Int>`) is represented by swift-syntax as a
// `genericSpecializationExpr`. When used as a call target
// (`C<Foo>()`), this should become a `call_expr` whose callee is a
// `generic_type_expr`, so we map it directly to that shape.
rule!(
(genericSpecializationExpr
expression: (declReferenceExpr baseName: @name)
genericArgumentClause: (genericArgumentClause arguments: (genericArgument argument: @args)*))
=>
(generic_type_expr
base: (named_type_expr name: (identifier #{name}))
type_argument: {args})
),
// ---- Operators ----
// The parser front-end folds operator chains into nested
// `infixOperatorExpr`s by precedence (see swift-syntax-rs), so
Expand Down Expand Up @@ -568,26 +582,30 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
rule!(
(functionDecl
name: @name
genericParameterClause: (genericParameterClause parameters: _* @type_params)?
signature: (functionSignature
parameterClause: (functionParameterClause parameters: _* @params)
returnClause: (returnClause type: @ret)?)
body: (codeBlock statements: _* @body))
=>
(function_declaration
name: (identifier #{name})
type_parameter: {type_params}
parameter: {params}
return_type: {ret}
body: (block stmt: {body}))
),
rule!(
(functionDecl
name: @name
genericParameterClause: (genericParameterClause parameters: _* @type_params)?
signature: (functionSignature
parameterClause: (functionParameterClause parameters: _* @params)
returnClause: (returnClause type: @ret)?))
=>
(function_declaration
name: (identifier #{name})
type_parameter: {type_params}
parameter: {params}
return_type: {ret}
body: (block))
Expand Down Expand Up @@ -1065,19 +1083,51 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
// A nominal type's `inheritanceClause` (`: Base, Proto`) becomes a list
// of `base_type`s, one per inherited type. Each declaration keyword
// gets its own rule; the bodies are identical but for the keyword.
rule!(
(genericParameter
attributes: _* @attrs
specifier: _? @@spec
name: @@name
inheritedType: _? @bound)
Comment thread
asgerf marked this conversation as resolved.
=>
(type_parameter
modifier: {attrs}
modifier: (modifier #{spec})?
name: (identifier #{name})
bound: {bound})
),
rule!(
(genericRequirement
requirement: (conformanceRequirement leftType: @ty rightType: @bound))
=>
(bound_type_constraint type: {ty} bound: {bound})
),
rule!(
(genericRequirement
requirement: (sameTypeRequirement leftType: @left rightType: @right))
=>
(equality_type_constraint left: {left} right: {right})
),
// Class declaration with body containing members
rule!(
(classDecl
classKeyword: @kind
modifiers: _* @mods
name: @name
genericParameterClause: (genericParameterClause
parameters: _* @params
genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)?
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
memberBlock: (memberBlock members: _* @members))
=>
(class_like_declaration
modifier: (modifier #{kind})
modifier: {mods}
name: (identifier #{name})
type_parameter: {params}
type_constraint: {parameter_constraints}
type_constraint: {declaration_constraints}
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
member: {members})
),
Expand All @@ -1087,13 +1137,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
enumKeyword: @kind
modifiers: _* @mods
name: @name
genericParameterClause: (genericParameterClause
parameters: _* @params
genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)?
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
memberBlock: (memberBlock members: _* @members))
=>
(class_like_declaration
modifier: (modifier #{kind})
modifier: {mods}
name: (identifier #{name})
type_parameter: {params}
type_constraint: {parameter_constraints}
type_constraint: {declaration_constraints}
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
member: {members})
),
Expand All @@ -1103,13 +1160,20 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
structKeyword: @kind
modifiers: _* @mods
name: @name
genericParameterClause: (genericParameterClause
parameters: _* @params
genericWhereClause: (genericWhereClause requirements: _* @parameter_constraints)?)?
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
memberBlock: (memberBlock members: _* @members))
=>
(class_like_declaration
modifier: (modifier #{kind})
modifier: {mods}
name: (identifier #{name})
type_parameter: {params}
type_constraint: {parameter_constraints}
type_constraint: {declaration_constraints}
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
member: {members})
),
Expand All @@ -1119,13 +1183,17 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
protocolKeyword: @kind
modifiers: _* @mods
name: @name
genericParameterClause: (genericParameterClause parameters: _* @params)?
inheritanceClause: (inheritanceClause inheritedTypes: (inheritedType type: @bases)*)?
genericWhereClause: (genericWhereClause requirements: _* @declaration_constraints)?
memberBlock: (memberBlock members: _* @members))
=>
(class_like_declaration
modifier: (modifier #{kind})
modifier: {mods}
name: (identifier #{name})
type_parameter: {params}
type_constraint: {declaration_constraints}
base_type: {bases.into_iter().map(|ty| tree!((base_type type: {ty})))}
member: {members})
),
Expand Down Expand Up @@ -1180,11 +1248,13 @@ fn translation_rules() -> Vec<Rule<SwiftContext>> {
(typeAliasDecl
modifiers: _* @mods
name: @@name
genericParameterClause: (genericParameterClause parameters: _* @type_params)?
initializer: (typeInitializerClause value: @val))
=>
(type_alias_declaration
modifier: {mods}
name: (identifier #{name})
type_parameter: {type_params}
r#type: {val})
),
// Associated type declaration (with optional bound)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,11 @@ top_level
identifier: identifier "numbers"
value:
call_expr
callee: unsupported_node "Array<Int>"
callee:
generic_type_expr
base:
named_type_expr
name: identifier "Array"
type_argument:
named_type_expr
name: identifier "Int"
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
class Foo {}
class C<T> {}
let x = C<Foo>()

---

sourceFile
endOfFileToken: endOfFile
statements:
codeBlockItem
item:
classDecl
attributes:
name: identifier "Foo"
memberBlock:
memberBlock
leftBrace: {
rightBrace: }
members:
modifiers:
classKeyword: class
codeBlockItem
item:
classDecl
attributes:
name: identifier "C"
genericParameterClause:
genericParameterClause
parameters:
genericParameter
attributes:
name: identifier "T"
leftAngle: <
rightAngle: >
memberBlock:
memberBlock
leftBrace: {
rightBrace: }
members:
modifiers:
classKeyword: class
codeBlockItem
item:
variableDecl
attributes:
modifiers:
bindingSpecifier: let
bindings:
patternBinding
initializer:
initializerClause
equal: =
value:
functionCallExpr
leftParen: (
rightParen: )
arguments:
additionalTrailingClosures:
calledExpression:
genericSpecializationExpr
expression:
declReferenceExpr
baseName: identifier "C"
genericArgumentClause:
genericArgumentClause
arguments:
genericArgument
argument:
identifierType
name: identifier "Foo"
leftAngle: <
rightAngle: >
pattern:
identifierPattern
identifier: identifier "x"

---

top_level
body:
block
stmt:
class_like_declaration
modifier: modifier "class"
name: identifier "Foo"
class_like_declaration
modifier: modifier "class"
name: identifier "C"
type_parameter:
type_parameter
name: identifier "T"
variable_declaration
modifier: modifier "let"
pattern:
name_pattern
identifier: identifier "x"
value:
call_expr
callee:
generic_type_expr
base:
named_type_expr
name: identifier "C"
type_argument:
named_type_expr
name: identifier "Foo"
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
class Foo {}
class C<T> {}
let x = C<Foo>()
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,9 @@ top_level
stmt:
function_declaration
name: identifier "identity"
type_parameter:
type_parameter
name: identifier "T"
parameter:
parameter
external_name: identifier "_"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
typealias Box<T: Equatable, U> = Dictionary<T, U>

---

sourceFile
endOfFileToken: endOfFile
statements:
codeBlockItem
item:
typeAliasDecl
attributes:
name: identifier "Box"
genericParameterClause:
genericParameterClause
parameters:
genericParameter
colon: :
attributes:
name: identifier "T"
trailingComma: ,
inheritedType:
identifierType
name: identifier "Equatable"
genericParameter
attributes:
name: identifier "U"
leftAngle: <
rightAngle: >
modifiers:
initializer:
typeInitializerClause
equal: =
value:
identifierType
name: identifier "Dictionary"
genericArgumentClause:
genericArgumentClause
arguments:
genericArgument
trailingComma: ,
argument:
identifierType
name: identifier "T"
genericArgument
argument:
identifierType
name: identifier "U"
leftAngle: <
rightAngle: >
typealiasKeyword: typealias

---

top_level
body:
block
stmt:
type_alias_declaration
name: identifier "Box"
type_parameter:
type_parameter
name: identifier "T"
bound:
named_type_expr
name: identifier "Equatable"
type_parameter
name: identifier "U"
type:
generic_type_expr
base:
named_type_expr
name: identifier "Dictionary"
type_argument:
named_type_expr
name: identifier "T"
named_type_expr
name: identifier "U"
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
typealias Box<T: Equatable, U> = Dictionary<T, U>
Loading
Loading