Skip to content

Commit 28c9d6b

Browse files
committed
Swift: extract PropertyWrapperValuePlaceholderExpr
1 parent d7bbf74 commit 28c9d6b

12 files changed

+107
-6
lines changed

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,4 +564,13 @@ codeql::UnresolvedSpecializeExpr ExprTranslator::translateUnresolvedSpecializeEx
564564
return entry;
565565
}
566566

567+
codeql::PropertyWrapperValuePlaceholderExpr
568+
ExprTranslator::translatePropertyWrapperValuePlaceholderExpr(
569+
const swift::PropertyWrapperValuePlaceholderExpr& expr) {
570+
auto entry = createExprEntry(expr);
571+
entry.wrapped_value = dispatcher.fetchOptionalLabel(expr.getOriginalWrappedValue());
572+
entry.placeholder = dispatcher.fetchLabel(expr.getOpaqueValuePlaceholder());
573+
return entry;
574+
}
575+
567576
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
111111
const swift::DynamicSubscriptExpr& expr);
112112
codeql::UnresolvedSpecializeExpr translateUnresolvedSpecializeExpr(
113113
const swift::UnresolvedSpecializeExpr& expr);
114+
codeql::PropertyWrapperValuePlaceholderExpr translatePropertyWrapperValuePlaceholderExpr(
115+
const swift::PropertyWrapperValuePlaceholderExpr& expr);
114116

115117
private:
116118
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

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

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

562562
class PropertyWrapperValuePlaceholderExpr extends @property_wrapper_value_placeholder_expr, Expr {
563563
override string toString() { result = "PropertyWrapperValuePlaceholderExpr" }
564+
565+
Expr getWrappedValue() { property_wrapper_value_placeholder_expr_wrapped_values(this, result) }
566+
567+
OpaqueValueExpr getPlaceholder() { property_wrapper_value_placeholder_exprs(this, result) }
564568
}
565569

566570
class RebindSelfInConstructorExpr extends @rebind_self_in_constructor_expr, Expr {

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,56 @@
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.expr.OpaqueValueExpr
56

67
module Generated {
8+
/**
9+
* A placeholder substituting property initializations with `=` when the property has a property
10+
* wrapper with an initializer.
11+
*/
712
class PropertyWrapperValuePlaceholderExpr extends Synth::TPropertyWrapperValuePlaceholderExpr,
813
Expr {
914
override string getAPrimaryQlClass() { result = "PropertyWrapperValuePlaceholderExpr" }
15+
16+
/**
17+
* Gets the wrapped value of this property wrapper value placeholder expression, if it exists.
18+
*
19+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
20+
* behavior of both the `Immediate` and non-`Immediate` versions.
21+
*/
22+
Expr getImmediateWrappedValue() {
23+
result =
24+
Synth::convertExprFromRaw(Synth::convertPropertyWrapperValuePlaceholderExprToRaw(this)
25+
.(Raw::PropertyWrapperValuePlaceholderExpr)
26+
.getWrappedValue())
27+
}
28+
29+
/**
30+
* Gets the wrapped value of this property wrapper value placeholder expression, if it exists.
31+
*/
32+
final Expr getWrappedValue() { result = getImmediateWrappedValue().resolve() }
33+
34+
/**
35+
* Holds if `getWrappedValue()` exists.
36+
*/
37+
final predicate hasWrappedValue() { exists(getWrappedValue()) }
38+
39+
/**
40+
* Gets the placeholder of this property wrapper value placeholder expression.
41+
*
42+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
43+
* behavior of both the `Immediate` and non-`Immediate` versions.
44+
*/
45+
OpaqueValueExpr getImmediatePlaceholder() {
46+
result =
47+
Synth::convertOpaqueValueExprFromRaw(Synth::convertPropertyWrapperValuePlaceholderExprToRaw(this)
48+
.(Raw::PropertyWrapperValuePlaceholderExpr)
49+
.getPlaceholder())
50+
}
51+
52+
/**
53+
* Gets the placeholder of this property wrapper value placeholder expression.
54+
*/
55+
final OpaqueValueExpr getPlaceholder() { result = getImmediatePlaceholder().resolve() }
1056
}
1157
}

swift/ql/lib/swift.dbscheme

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -987,7 +987,14 @@ pack_exprs( //dir=expr
987987
);
988988

989989
property_wrapper_value_placeholder_exprs( //dir=expr
990-
unique int id: @property_wrapper_value_placeholder_expr
990+
unique int id: @property_wrapper_value_placeholder_expr,
991+
int placeholder: @opaque_value_expr_or_none ref
992+
);
993+
994+
#keyset[id]
995+
property_wrapper_value_placeholder_expr_wrapped_values( //dir=expr
996+
int id: @property_wrapper_value_placeholder_expr ref,
997+
int wrapped_value: @expr_or_none ref
991998
);
992999

9931000
rebind_self_in_constructor_exprs( //dir=expr

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

Lines changed: 0 additions & 4 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| property_wrapper_value_placeholder.swift:12:26:12:26 | PropertyWrapperValuePlaceholderExpr | getPlaceholder: | property_wrapper_value_placeholder.swift:12:26:12:26 | OpaqueValueExpr |
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 PropertyWrapperValuePlaceholderExpr x, OpaqueValueExpr getPlaceholder
6+
where
7+
toBeTested(x) and
8+
not x.isUnknown() and
9+
getPlaceholder = x.getPlaceholder()
10+
select x, "getPlaceholder:", getPlaceholder
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| property_wrapper_value_placeholder.swift:12:26:12:26 | PropertyWrapperValuePlaceholderExpr | Int |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// generated by codegen/codegen.py
2+
import codeql.swift.elements
3+
import TestUtils
4+
5+
from PropertyWrapperValuePlaceholderExpr x
6+
where toBeTested(x) and not x.isUnknown()
7+
select x, x.getType()

0 commit comments

Comments
 (0)