Swift: Implement full tree of Assignment classes

This commit is contained in:
Geoffrey White
2023-02-21 09:34:39 +00:00
parent aaa89f7f32
commit 71813fa0a7
3 changed files with 129 additions and 3 deletions

View File

@@ -1,5 +1,117 @@
private import codeql.swift.generated.expr.AssignExpr
private import codeql.swift.elements.expr.BinaryExpr
/**
* Any assignment expression. For example:
* ```
* x = 0
* y += 1
* z <<= 1
* ```
*/
class Assignment extends Expr {
Assignment() {
this instanceof AssignExpr or
this instanceof AssignArithmeticOperationEx or
this instanceof AssignBitwiseOperationEx
}
/**
* Gets the destination of this assignment. For example `x` in:
* ```
* x = y
* ```
*/
Expr getDest() {
result = this.(AssignExpr).getDest() or
result = this.(AssignOperation).getLeftOperand()
}
/**
* Gets the source of this assignment. For example `y` in:
* ```
* x = y
* ```
*/
Expr getSource() {
result = this.(AssignExpr).getSource() or
result = this.(AssignOperation).getRightOperand()
}
}
/**
* A simple assignment expression using the `=` operator:
* ```
* x = 0
* ```
*/
class AssignExpr extends Generated::AssignExpr {
override string toString() { result = " ... = ..." }
}
/**
* Any assignment expression apart from `=`. For example:
* ```
* x += 1
* y &= z
* ```
*/
class AssignOperation extends Assignment, BinaryExpr {
AssignOperation() {
this instanceof AssignArithmeticOperationEx or
this instanceof AssignBitwiseOperationEx
}
}
/**
* An arithmetic assignment expression. For example:
* ```
* x += 1
* y *= z
* ```
*/
class AssignArithmeticOperation extends AssignOperation instanceof AssignArithmeticOperationEx { }
/**
* Private abstract class, extended to define the scope of `AssignArithmeticOperation`.
*/
abstract private class AssignArithmeticOperationEx extends BinaryExpr { }
/**
* A bitwise assignment expression. For example:
* ```
* x &= y
* z <<= 1
* ```
*/
class AssignBitwiseOperation extends AssignOperation instanceof AssignBitwiseOperationEx { }
/**
* Private abstract class, extended to define the scope of `AssignBitwiseOperation`.
*/
abstract private class AssignBitwiseOperationEx extends BinaryExpr { }
/**
* An addition assignment expression:
* ```
* a += b
* ```
*/
class AssignAddExpr extends AssignArithmeticOperationEx {
AssignAddExpr() { this.getOperator().getName() = "+=(_:_:)" }
override string toString() { result = "... += ..." }
}
/**
* A left-shift assignment expression:
* ```
* a <<= b
* ```
*/
class AssignLShiftExpr extends AssignBitwiseOperationEx {
AssignLShiftExpr() { this.getOperator().getName() = "<<=(_:_:)" }
override string toString() { result = "... <<= ..." }
}
// TODO ...

View File

@@ -1,2 +1,4 @@
| assignment.swift:6:2:6:6 | ... = ... | AssignExpr | x | 1 |
| assignment.swift:33:2:33:6 | ... = ... | AssignExpr | y | z |
| assignment.swift:6:2:6:6 | ... = ... | AssignExpr, Assignment | x | 1 |
| assignment.swift:9:2:9:7 | ... += ... | AssignAddExpr, AssignArithmeticOperation, AssignOperation, Assignment | &... | 1 |
| assignment.swift:19:2:19:8 | ... <<= ... | AssignBitwiseOperation, AssignLShiftExpr, AssignOperation, Assignment | &... | 1 |
| assignment.swift:33:2:33:6 | ... = ... | AssignExpr, Assignment | y | z |

View File

@@ -1,10 +1,22 @@
import swift
string describe(Expr e) {
e instanceof Assignment and result = "Assignment"
or
e instanceof AssignOperation and result = "AssignOperation"
or
e instanceof AssignArithmeticOperation and result = "AssignArithmeticOperation"
or
e instanceof AssignBitwiseOperation and result = "AssignBitwiseOperation"
or
e instanceof AssignExpr and result = "AssignExpr"
or
e instanceof AssignAddExpr and result = "AssignAddExpr"
or
e instanceof AssignLShiftExpr and result = "AssignLShiftExpr"
}
from AssignExpr e
from Assignment e
where
e.getLocation().getFile().getBaseName() != ""
select