Skip to content

Commit 5f8e7e6

Browse files
committed
Swift: extract ObjectLiteralExpr
1 parent a05706d commit 5f8e7e6

16 files changed

+137
-11
lines changed

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,4 +526,16 @@ codeql::UnresolvedPatternExpr ExprTranslator::translateUnresolvedPatternExpr(
526526
return entry;
527527
}
528528

529+
codeql::ObjectLiteralExpr ExprTranslator::translateObjectLiteralExpr(
530+
const swift::ObjectLiteralExpr& expr) {
531+
auto entry = createExprEntry(expr);
532+
entry.kind = static_cast<int>(expr.getLiteralKind());
533+
if (auto args = expr.getArgs()) {
534+
for (const auto& arg : *args) {
535+
entry.arguments.push_back(emitArgument(arg));
536+
}
537+
}
538+
return entry;
539+
}
540+
529541
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
102102
codeql::ErrorExpr translateErrorExpr(const swift::ErrorExpr& expr);
103103
codeql::UnresolvedPatternExpr translateUnresolvedPatternExpr(
104104
const swift::UnresolvedPatternExpr& expr);
105+
codeql::ObjectLiteralExpr translateObjectLiteralExpr(const swift::ObjectLiteralExpr& expr);
105106

106107
private:
107108
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,
Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
private import codeql.swift.generated.expr.ObjectLiteralExpr
22

3-
class ObjectLiteralExpr extends Generated::ObjectLiteralExpr {
4-
override string toString() {
5-
result = "#...(...)" // TOOD: We can improve this once we extract the kind
6-
}
3+
class ObjectLiteralExpr extends Generated::ObjectLiteralExpr { }
4+
5+
class FileLiteralExpr extends ObjectLiteralExpr {
6+
FileLiteralExpr() { this.getKind() = 0 }
7+
8+
override string toString() { result = "#fileLiteral(...)" }
9+
}
10+
11+
class ImageLiteralExpr extends ObjectLiteralExpr {
12+
ImageLiteralExpr() { this.getKind() = 1 }
13+
14+
override string toString() { result = "#imageLiteral(...)" }
15+
}
16+
17+
class ColorLiteralExpr extends ObjectLiteralExpr {
18+
ColorLiteralExpr() { this.getKind() = 2 }
19+
20+
override string toString() { result = "#colorLiteral(...)" }
721
}

swift/ql/lib/codeql/swift/generated/ParentChild.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2588,15 +2588,19 @@ private module Impl {
25882588
private Element getImmediateChildOfObjectLiteralExpr(
25892589
ObjectLiteralExpr e, int index, string partialPredicateCall
25902590
) {
2591-
exists(int b, int bLiteralExpr, int n |
2591+
exists(int b, int bLiteralExpr, int n, int nArgument |
25922592
b = 0 and
25932593
bLiteralExpr =
25942594
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLiteralExpr(e, i, _)) | i) and
25952595
n = bLiteralExpr and
2596+
nArgument = n + 1 + max(int i | i = -1 or exists(e.getImmediateArgument(i)) | i) and
25962597
(
25972598
none()
25982599
or
25992600
result = getImmediateChildOfLiteralExpr(e, index - b, partialPredicateCall)
2601+
or
2602+
result = e.getImmediateArgument(index - n) and
2603+
partialPredicateCall = "Argument(" + (index - n).toString() + ")"
26002604
)
26012605
)
26022606
}

swift/ql/lib/codeql/swift/generated/Raw.qll

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,10 @@ module Raw {
839839

840840
class ObjectLiteralExpr extends @object_literal_expr, LiteralExpr {
841841
override string toString() { result = "ObjectLiteralExpr" }
842+
843+
int getKind() { object_literal_exprs(this, result) }
844+
845+
Argument getArgument(int index) { object_literal_expr_arguments(this, index, result) }
842846
}
843847

844848
class OptionalTryExpr extends @optional_try_expr, AnyTryExpr {
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,51 @@
11
// generated by codegen/codegen.py
22
private import codeql.swift.generated.Synth
33
private import codeql.swift.generated.Raw
4+
import codeql.swift.elements.expr.Argument
45
import codeql.swift.elements.expr.LiteralExpr
56

67
module Generated {
8+
/**
9+
* `#fileLiteral`, `#imageLiteral` and `#colorLiteral` expressions, which are used in playgrounds.
10+
*/
711
class ObjectLiteralExpr extends Synth::TObjectLiteralExpr, LiteralExpr {
812
override string getAPrimaryQlClass() { result = "ObjectLiteralExpr" }
13+
14+
/**
15+
* Gets the
16+
* This is 0 for `#fileLiteral`, 1 for `#imageLiteral` and 2 for `#colorLiteral`.
17+
* .
18+
*/
19+
int getKind() {
20+
result = Synth::convertObjectLiteralExprToRaw(this).(Raw::ObjectLiteralExpr).getKind()
21+
}
22+
23+
/**
24+
* Gets the `index`th argument of this object literal expression (0-based).
25+
*
26+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
27+
* behavior of both the `Immediate` and non-`Immediate` versions.
28+
*/
29+
Argument getImmediateArgument(int index) {
30+
result =
31+
Synth::convertArgumentFromRaw(Synth::convertObjectLiteralExprToRaw(this)
32+
.(Raw::ObjectLiteralExpr)
33+
.getArgument(index))
34+
}
35+
36+
/**
37+
* Gets the `index`th argument of this object literal expression (0-based).
38+
*/
39+
final Argument getArgument(int index) { result = getImmediateArgument(index).resolve() }
40+
41+
/**
42+
* Gets any of the arguments of this object literal expression.
43+
*/
44+
final Argument getAnArgument() { result = getArgument(_) }
45+
46+
/**
47+
* Gets the number of arguments of this object literal expression.
48+
*/
49+
final int getNumberOfArguments() { result = count(getAnArgument()) }
950
}
1051
}

swift/ql/lib/swift.dbscheme

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1307,7 +1307,15 @@ nil_literal_exprs( //dir=expr
13071307
);
13081308

13091309
object_literal_exprs( //dir=expr
1310-
unique int id: @object_literal_expr
1310+
unique int id: @object_literal_expr,
1311+
int kind: int ref
1312+
);
1313+
1314+
#keyset[id, index]
1315+
object_literal_expr_arguments( //dir=expr
1316+
int id: @object_literal_expr ref,
1317+
int index: int ref,
1318+
int argument: @argument_or_none ref
13111319
);
13121320

13131321
optional_try_exprs( //dir=expr

swift/ql/test/extractor-tests/generated/expr/ObjectLiteralExpr/MISSING_SOURCE.txt

Lines changed: 0 additions & 4 deletions
This file was deleted.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
| object_literals.swift:3:5:3:42 | #fileLiteral(...) | getKind: | 0 |
2+
| object_literals.swift:4:5:4:61 | #colorLiteral(...) | getKind: | 2 |
3+
| object_literals.swift:5:5:5:44 | #imageLiteral(...) | getKind: | 1 |
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// generated by codegen/codegen.py
2+
import codeql.swift.elements
3+
import TestUtils
4+
5+
from ObjectLiteralExpr x, int getKind
6+
where
7+
toBeTested(x) and
8+
not x.isUnknown() and
9+
getKind = x.getKind()
10+
select x, "getKind:", getKind

0 commit comments

Comments
 (0)