Skip to content
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
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
50 changes: 50 additions & 0 deletions unified/extractor/src/languages/swift/swift.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1065,19 +1065,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 +1119,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 +1142,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 +1165,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
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
class Box<T: Equatable, U> where U: Equatable, U == T {
}

---

sourceFile
endOfFileToken: endOfFile
statements:
codeBlockItem
item:
classDecl
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: >
genericWhereClause:
genericWhereClause
requirements:
genericRequirement
trailingComma: ,
requirement:
conformanceRequirement
colon: :
leftType:
identifierType
name: identifier "U"
rightType:
identifierType
name: identifier "Equatable"
genericRequirement
requirement:
sameTypeRequirement
equal: binaryOperator "=="
leftType:
identifierType
name: identifier "U"
rightType:
identifierType
name: identifier "T"
whereKeyword: where
memberBlock:
memberBlock
leftBrace: {
rightBrace: }
members:
modifiers:
classKeyword: class

---

top_level
body:
block
stmt:
class_like_declaration
modifier: modifier "class"
name: identifier "Box"
type_parameter:
type_parameter
name: identifier "T"
bound:
named_type_expr
name: identifier "Equatable"
type_parameter
name: identifier "U"
type_constraint:
bound_type_constraint
type:
named_type_expr
name: identifier "U"
bound:
named_type_expr
name: identifier "Equatable"
equality_type_constraint
left:
named_type_expr
name: identifier "U"
right:
named_type_expr
name: identifier "T"
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
class Box<T: Equatable, U> where U: Equatable, U == T {
}
5 changes: 5 additions & 0 deletions unified/ql/lib/codeql/unified/internal/AstExtra.qll
Original file line number Diff line number Diff line change
Expand Up @@ -52,4 +52,9 @@ module Public {
result = this.getValue().regexpCapture("(?s)/\\*(.*)\\*/", 1)
}
}

/** A `Stmt` at the top-level. */
Comment thread
hvitved marked this conversation as resolved.
final class TopLevelStmt extends Stmt {
TopLevelStmt() { this = any(TopLevel t).getBody().getAStmt() }
}
}
Loading