Skip to content

Commit 1d4925d

Browse files
committed
Swift: Expand assignment operations.
1 parent 71813fa commit 1d4925d

File tree

3 files changed

+120
-1
lines changed

3 files changed

+120
-1
lines changed

swift/ql/lib/codeql/swift/elements/expr/AssignExpr.qll

Lines changed: 96 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,54 @@ class AssignAddExpr extends AssignArithmeticOperationEx {
103103
override string toString() { result = "... += ..." }
104104
}
105105

106+
/**
107+
* A subtraction assignment expression:
108+
* ```
109+
* a -= b
110+
* ```
111+
*/
112+
class AssignSubExpr extends AssignArithmeticOperationEx {
113+
AssignSubExpr() { this.getOperator().getName() = "-=(_:_:)" }
114+
115+
override string toString() { result = "... -= ..." }
116+
}
117+
118+
/**
119+
* A multiplication assignment expression:
120+
* ```
121+
* a *= b
122+
* ```
123+
*/
124+
class AssignMulExpr extends AssignArithmeticOperationEx {
125+
AssignMulExpr() { this.getOperator().getName() = "*=(_:_:)" }
126+
127+
override string toString() { result = "... *= ..." }
128+
}
129+
130+
/**
131+
* A division assignment expression:
132+
* ```
133+
* a /= b
134+
* ```
135+
*/
136+
class AssignDivExpr extends AssignArithmeticOperationEx {
137+
AssignDivExpr() { this.getOperator().getName() = "/=(_:_:)" }
138+
139+
override string toString() { result = "... /= ..." }
140+
}
141+
142+
/**
143+
* A remainder assignment expression:
144+
* ```
145+
* a %= b
146+
* ```
147+
*/
148+
class AssignRemExpr extends AssignArithmeticOperationEx {
149+
AssignRemExpr() { this.getOperator().getName() = "%=(_:_:)" }
150+
151+
override string toString() { result = "... %= ..." }
152+
}
153+
106154
/**
107155
* A left-shift assignment expression:
108156
* ```
@@ -114,4 +162,51 @@ class AssignLShiftExpr extends AssignBitwiseOperationEx {
114162

115163
override string toString() { result = "... <<= ..." }
116164
}
117-
// TODO ...
165+
166+
/**
167+
* A right-shift assignment expression:
168+
* ```
169+
* a >>= b
170+
* ```
171+
*/
172+
class AssignRShiftExpr extends AssignBitwiseOperationEx {
173+
AssignRShiftExpr() { this.getOperator().getName() = ">>=(_:_:)" }
174+
175+
override string toString() { result = "... >>= ..." }
176+
}
177+
178+
/**
179+
* A bitwise-and assignment expression:
180+
* ```
181+
* a &= b
182+
* ```
183+
*/
184+
class AssignAndExpr extends AssignBitwiseOperationEx {
185+
AssignAndExpr() { this.getOperator().getName() = "&=(_:_:)" }
186+
187+
override string toString() { result = "... &= ..." }
188+
}
189+
190+
/**
191+
* A bitwise-or assignment expression:
192+
* ```
193+
* a |= b
194+
* ```
195+
*/
196+
class AssignOrExpr extends AssignBitwiseOperationEx {
197+
AssignOrExpr() { this.getOperator().getName() = "|=(_:_:)" }
198+
199+
override string toString() { result = "... |= ..." }
200+
}
201+
202+
/**
203+
* A bitwise exclusive-or assignment expression:
204+
* ```
205+
* a ^= b
206+
* ```
207+
*/
208+
class AssignXorExpr extends AssignBitwiseOperationEx {
209+
AssignXorExpr() { this.getOperator().getName() = "^=(_:_:)" }
210+
211+
override string toString() { result = "... ^= ..." }
212+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
| assignment.swift:6:2:6:6 | ... = ... | AssignExpr, Assignment | x | 1 |
22
| assignment.swift:9:2:9:7 | ... += ... | AssignAddExpr, AssignArithmeticOperation, AssignOperation, Assignment | &... | 1 |
3+
| assignment.swift:10:2:10:7 | ... -= ... | AssignArithmeticOperation, AssignOperation, AssignSubExpr, Assignment | &... | 1 |
4+
| assignment.swift:11:2:11:7 | ... *= ... | AssignArithmeticOperation, AssignMulExpr, AssignOperation, Assignment | &... | 1 |
5+
| assignment.swift:12:2:12:7 | ... /= ... | AssignArithmeticOperation, AssignDivExpr, AssignOperation, Assignment | &... | 1 |
6+
| assignment.swift:13:2:13:7 | ... %= ... | AssignArithmeticOperation, AssignOperation, AssignRemExpr, Assignment | &... | 1 |
7+
| assignment.swift:16:2:16:7 | ... &= ... | AssignAndExpr, AssignBitwiseOperation, AssignOperation, Assignment | &... | 1 |
8+
| assignment.swift:17:2:17:7 | ... \|= ... | AssignBitwiseOperation, AssignOperation, AssignOrExpr, Assignment | &... | 1 |
9+
| assignment.swift:18:2:18:7 | ... ^= ... | AssignBitwiseOperation, AssignOperation, AssignXorExpr, Assignment | &... | 1 |
310
| assignment.swift:19:2:19:8 | ... <<= ... | AssignBitwiseOperation, AssignLShiftExpr, AssignOperation, Assignment | &... | 1 |
11+
| assignment.swift:20:2:20:8 | ... >>= ... | AssignBitwiseOperation, AssignOperation, AssignRShiftExpr, Assignment | &... | 1 |
412
| assignment.swift:33:2:33:6 | ... = ... | AssignExpr, Assignment | y | z |

swift/ql/test/library-tests/elements/expr/assignment/assignment.ql

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,23 @@ string describe(Expr e) {
1313
or
1414
e instanceof AssignAddExpr and result = "AssignAddExpr"
1515
or
16+
e instanceof AssignSubExpr and result = "AssignSubExpr"
17+
or
18+
e instanceof AssignMulExpr and result = "AssignMulExpr"
19+
or
20+
e instanceof AssignDivExpr and result = "AssignDivExpr"
21+
or
22+
e instanceof AssignRemExpr and result = "AssignRemExpr"
23+
or
1624
e instanceof AssignLShiftExpr and result = "AssignLShiftExpr"
25+
or
26+
e instanceof AssignRShiftExpr and result = "AssignRShiftExpr"
27+
or
28+
e instanceof AssignAndExpr and result = "AssignAndExpr"
29+
or
30+
e instanceof AssignOrExpr and result = "AssignOrExpr"
31+
or
32+
e instanceof AssignXorExpr and result = "AssignXorExpr"
1733
}
1834

1935
from Assignment e

0 commit comments

Comments
 (0)