Skip to content

Commit edfecdd

Browse files
committed
Swift: extract AppliedPropertyWrapperExpr
1 parent 28c9d6b commit edfecdd

20 files changed

+262
-7
lines changed

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -573,4 +573,25 @@ ExprTranslator::translatePropertyWrapperValuePlaceholderExpr(
573573
return entry;
574574
}
575575

576+
static int translatePropertyWrapperValueKind(swift::AppliedPropertyWrapperExpr::ValueKind kind) {
577+
using K = swift::AppliedPropertyWrapperExpr::ValueKind;
578+
switch (kind) {
579+
case K::WrappedValue:
580+
return 1;
581+
case K::ProjectedValue:
582+
return 2;
583+
default:
584+
return 0;
585+
}
586+
}
587+
codeql::AppliedPropertyWrapperExpr ExprTranslator::translateAppliedPropertyWrapperExpr(
588+
const swift::AppliedPropertyWrapperExpr& expr) {
589+
auto entry = createExprEntry(expr);
590+
entry.kind = translatePropertyWrapperValueKind(expr.getValueKind());
591+
entry.value =
592+
dispatcher.fetchLabel(const_cast<swift::AppliedPropertyWrapperExpr&>(expr).getValue());
593+
entry.param = dispatcher.fetchLabel(expr.getParamDecl());
594+
return entry;
595+
}
596+
576597
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
113113
const swift::UnresolvedSpecializeExpr& expr);
114114
codeql::PropertyWrapperValuePlaceholderExpr translatePropertyWrapperValuePlaceholderExpr(
115115
const swift::PropertyWrapperValuePlaceholderExpr& expr);
116+
codeql::AppliedPropertyWrapperExpr translateAppliedPropertyWrapperExpr(
117+
const swift::AppliedPropertyWrapperExpr& expr);
116118

117119
private:
118120
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -962,14 +962,17 @@ private module Impl {
962962
private Element getImmediateChildOfAppliedPropertyWrapperExpr(
963963
AppliedPropertyWrapperExpr e, int index, string partialPredicateCall
964964
) {
965-
exists(int b, int bExpr, int n |
965+
exists(int b, int bExpr, int n, int nValue |
966966
b = 0 and
967967
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
968968
n = bExpr and
969+
nValue = n + 1 and
969970
(
970971
none()
971972
or
972973
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
974+
or
975+
index = n and result = e.getImmediateValue() and partialPredicateCall = "Value()"
973976
)
974977
)
975978
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,12 @@ module Raw {
327327

328328
class AppliedPropertyWrapperExpr extends @applied_property_wrapper_expr, Expr {
329329
override string toString() { result = "AppliedPropertyWrapperExpr" }
330+
331+
int getKind() { applied_property_wrapper_exprs(this, result, _, _) }
332+
333+
Expr getValue() { applied_property_wrapper_exprs(this, _, result, _) }
334+
335+
ParamDecl getParam() { applied_property_wrapper_exprs(this, _, _, result) }
330336
}
331337

332338
class ApplyExpr extends @apply_expr, Expr {

swift/ql/lib/codeql/swift/generated/expr/AppliedPropertyWrapperExpr.qll

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,63 @@
22
private import codeql.swift.generated.Synth
33
private import codeql.swift.generated.Raw
44
import codeql.swift.elements.expr.Expr
5+
import codeql.swift.elements.decl.ParamDecl
56

67
module Generated {
8+
/**
9+
* An implicit application of a property wrapper.
10+
*/
711
class AppliedPropertyWrapperExpr extends Synth::TAppliedPropertyWrapperExpr, Expr {
812
override string getAPrimaryQlClass() { result = "AppliedPropertyWrapperExpr" }
13+
14+
/**
15+
* Gets the kind of this applied property wrapper expression.
16+
*
17+
* This is 1 for the wrapped value and 2 for the projected one.
18+
*/
19+
int getKind() {
20+
result =
21+
Synth::convertAppliedPropertyWrapperExprToRaw(this)
22+
.(Raw::AppliedPropertyWrapperExpr)
23+
.getKind()
24+
}
25+
26+
/**
27+
* Gets the value of this applied property wrapper expression.
28+
*
29+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
30+
* behavior of both the `Immediate` and non-`Immediate` versions.
31+
*/
32+
Expr getImmediateValue() {
33+
result =
34+
Synth::convertExprFromRaw(Synth::convertAppliedPropertyWrapperExprToRaw(this)
35+
.(Raw::AppliedPropertyWrapperExpr)
36+
.getValue())
37+
}
38+
39+
/**
40+
* Gets the value of this applied property wrapper expression.
41+
*
42+
* The value on which the wrapper is applied.
43+
*/
44+
final Expr getValue() { result = getImmediateValue().resolve() }
45+
46+
/**
47+
* Gets the parameter declaration owning this wrapper application.
48+
*
49+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
50+
* behavior of both the `Immediate` and non-`Immediate` versions.
51+
*/
52+
ParamDecl getImmediateParam() {
53+
result =
54+
Synth::convertParamDeclFromRaw(Synth::convertAppliedPropertyWrapperExprToRaw(this)
55+
.(Raw::AppliedPropertyWrapperExpr)
56+
.getParam())
57+
}
58+
59+
/**
60+
* Gets the parameter declaration owning this wrapper application.
61+
*/
62+
final ParamDecl getParam() { result = getImmediateParam().resolve() }
963
}
1064
}

swift/ql/lib/swift.dbscheme

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -664,7 +664,10 @@ any_try_exprs( //dir=expr
664664
);
665665

666666
applied_property_wrapper_exprs( //dir=expr
667-
unique int id: @applied_property_wrapper_expr
667+
unique int id: @applied_property_wrapper_expr,
668+
int kind: int ref,
669+
int value: @expr_or_none ref,
670+
int param: @param_decl_or_none ref
668671
);
669672

670673
@apply_expr =

swift/ql/test/TestUtils.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ cached
44
predicate toBeTested(Element e) {
55
e instanceof File
66
or
7+
e instanceof AppliedPropertyWrapperExpr
8+
or
79
exists(ModuleDecl m |
810
m = e and
911
not m.isBuiltinModule() and
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
| applied_property_wrapper.swift:14:8:14:8 | AppliedPropertyWrapperExpr | getKind: | 1 | getValue: | applied_property_wrapper.swift:14:8:14:8 | 42 | getParam: | applied_property_wrapper.swift:12:19:12:22 | x |
2+
| applied_property_wrapper.swift:15:9:15:9 | AppliedPropertyWrapperExpr | getKind: | 2 | getValue: | applied_property_wrapper.swift:15:9:15:9 | true | getParam: | applied_property_wrapper.swift:12:19:12:22 | x |
3+
| file://:0:0:0:0 | AppliedPropertyWrapperExpr | getKind: | 1 | getValue: | file://:0:0:0:0 | y | getParam: | applied_property_wrapper.swift:17:26:17:29 | y |
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// generated by codegen/codegen.py
2+
import codeql.swift.elements
3+
import TestUtils
4+
5+
from AppliedPropertyWrapperExpr x, int getKind, Expr getValue, ParamDecl getParam
6+
where
7+
toBeTested(x) and
8+
not x.isUnknown() and
9+
getKind = x.getKind() and
10+
getValue = x.getValue() and
11+
getParam = x.getParam()
12+
select x, "getKind:", getKind, "getValue:", getValue, "getParam:", getParam

swift/ql/test/extractor-tests/generated/expr/AppliedPropertyWrapperExpr/AppliedPropertyWrapperExpr_getParam.expected

Whitespace-only changes.

0 commit comments

Comments
 (0)