Skip to content

Commit 7f36f65

Browse files
authored
Merge pull request github#11190 from github/redsun82/swift-exprs
Swift: extract some more `Expr`
2 parents 5d2ab8a + de8e7b0 commit 7f36f65

File tree

63 files changed

+654
-148
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+654
-148
lines changed

swift/extractor/infra/SwiftTagTraits.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ using SILBoxTypeTag = SilBoxTypeTag;
1616
using SILFunctionTypeTag = SilFunctionTypeTag;
1717
using SILTokenTypeTag = SilTokenTypeTag;
1818

19+
// OverloadSetRefExpr is collapsed with its only derived class OverloadedDeclRefExpr
20+
using OverloadSetRefExprTag = OverloadedDeclRefExprTag;
21+
1922
#define MAP_TYPE_TO_TAG(TYPE, TAG) \
2023
template <> \
2124
struct detail::ToTagFunctor<TYPE> { \

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,4 +526,72 @@ 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+
codeql::OverloadedDeclRefExpr ExprTranslator::translateOverloadedDeclRefExpr(
541+
const swift::OverloadedDeclRefExpr& expr) {
542+
auto entry = createExprEntry(expr);
543+
entry.possible_declarations = dispatcher.fetchRepeatedLabels(expr.getDecls());
544+
return entry;
545+
}
546+
547+
codeql::DynamicMemberRefExpr ExprTranslator::translateDynamicMemberRefExpr(
548+
const swift::DynamicMemberRefExpr& expr) {
549+
auto entry = createExprEntry(expr);
550+
fillLookupExpr(expr, entry);
551+
return entry;
552+
}
553+
554+
codeql::DynamicSubscriptExpr ExprTranslator::translateDynamicSubscriptExpr(
555+
const swift::DynamicSubscriptExpr& expr) {
556+
auto entry = createExprEntry(expr);
557+
fillLookupExpr(expr, entry);
558+
return entry;
559+
}
560+
codeql::UnresolvedSpecializeExpr ExprTranslator::translateUnresolvedSpecializeExpr(
561+
const swift::UnresolvedSpecializeExpr& expr) {
562+
auto entry = createExprEntry(expr);
563+
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
564+
return entry;
565+
}
566+
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+
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+
529597
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,19 @@ 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);
106+
codeql::OverloadedDeclRefExpr translateOverloadedDeclRefExpr(
107+
const swift::OverloadedDeclRefExpr& expr);
108+
codeql::DynamicMemberRefExpr translateDynamicMemberRefExpr(
109+
const swift::DynamicMemberRefExpr& expr);
110+
codeql::DynamicSubscriptExpr translateDynamicSubscriptExpr(
111+
const swift::DynamicSubscriptExpr& expr);
112+
codeql::UnresolvedSpecializeExpr translateUnresolvedSpecializeExpr(
113+
const swift::UnresolvedSpecializeExpr& expr);
114+
codeql::PropertyWrapperValuePlaceholderExpr translatePropertyWrapperValuePlaceholderExpr(
115+
const swift::PropertyWrapperValuePlaceholderExpr& expr);
116+
codeql::AppliedPropertyWrapperExpr translateAppliedPropertyWrapperExpr(
117+
const swift::AppliedPropertyWrapperExpr& expr);
105118

106119
private:
107120
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ import codeql.swift.elements.expr.OpenExistentialExpr
150150
import codeql.swift.elements.expr.OptionalEvaluationExpr
151151
import codeql.swift.elements.expr.OptionalTryExpr
152152
import codeql.swift.elements.expr.OtherConstructorDeclRefExpr
153-
import codeql.swift.elements.expr.OverloadSetRefExpr
154153
import codeql.swift.elements.expr.OverloadedDeclRefExpr
155154
import codeql.swift.elements.expr.PackExpr
156155
import codeql.swift.elements.expr.ParenExpr
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/elements/expr/OverloadSetRefExpr.qll

Lines changed: 0 additions & 4 deletions
This file was deleted.

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

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,6 @@ private module Impl {
6868
)
6969
}
7070

71-
private Element getImmediateChildOfUnresolvedElement(
72-
UnresolvedElement e, int index, string partialPredicateCall
73-
) {
74-
exists(int b, int bElement, int n |
75-
b = 0 and
76-
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
77-
n = bElement and
78-
(
79-
none()
80-
or
81-
result = getImmediateChildOfElement(e, index - b, partialPredicateCall)
82-
)
83-
)
84-
}
85-
8671
private Element getImmediateChildOfAstNode(AstNode e, int index, string partialPredicateCall) {
8772
exists(int b, int bLocatable, int n |
8873
b = 0 and
@@ -180,6 +165,21 @@ private module Impl {
180165
)
181166
}
182167

168+
private Element getImmediateChildOfUnresolvedElement(
169+
UnresolvedElement e, int index, string partialPredicateCall
170+
) {
171+
exists(int b, int bLocatable, int n |
172+
b = 0 and
173+
bLocatable = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLocatable(e, i, _)) | i) and
174+
n = bLocatable and
175+
(
176+
none()
177+
or
178+
result = getImmediateChildOfLocatable(e, index - b, partialPredicateCall)
179+
)
180+
)
181+
}
182+
183183
private Element getImmediateChildOfUnspecifiedElement(
184184
UnspecifiedElement e, int index, string partialPredicateCall
185185
) {
@@ -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
}
@@ -1592,8 +1595,8 @@ private module Impl {
15921595
)
15931596
}
15941597

1595-
private Element getImmediateChildOfOverloadSetRefExpr(
1596-
OverloadSetRefExpr e, int index, string partialPredicateCall
1598+
private Element getImmediateChildOfOverloadedDeclRefExpr(
1599+
OverloadedDeclRefExpr e, int index, string partialPredicateCall
15971600
) {
15981601
exists(int b, int bExpr, int n |
15991602
b = 0 and
@@ -1842,18 +1845,21 @@ private module Impl {
18421845
private Element getImmediateChildOfUnresolvedSpecializeExpr(
18431846
UnresolvedSpecializeExpr e, int index, string partialPredicateCall
18441847
) {
1845-
exists(int b, int bExpr, int bUnresolvedElement, int n |
1848+
exists(int b, int bExpr, int bUnresolvedElement, int n, int nSubExpr |
18461849
b = 0 and
18471850
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
18481851
bUnresolvedElement =
18491852
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
18501853
n = bUnresolvedElement and
1854+
nSubExpr = n + 1 and
18511855
(
18521856
none()
18531857
or
18541858
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
18551859
or
18561860
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
1861+
or
1862+
index = n and result = e.getImmediateSubExpr() and partialPredicateCall = "SubExpr()"
18571863
)
18581864
)
18591865
}
@@ -2588,15 +2594,19 @@ private module Impl {
25882594
private Element getImmediateChildOfObjectLiteralExpr(
25892595
ObjectLiteralExpr e, int index, string partialPredicateCall
25902596
) {
2591-
exists(int b, int bLiteralExpr, int n |
2597+
exists(int b, int bLiteralExpr, int n, int nArgument |
25922598
b = 0 and
25932599
bLiteralExpr =
25942600
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLiteralExpr(e, i, _)) | i) and
25952601
n = bLiteralExpr and
2602+
nArgument = n + 1 + max(int i | i = -1 or exists(e.getImmediateArgument(i)) | i) and
25962603
(
25972604
none()
25982605
or
25992606
result = getImmediateChildOfLiteralExpr(e, index - b, partialPredicateCall)
2607+
or
2608+
result = e.getImmediateArgument(index - n) and
2609+
partialPredicateCall = "Argument(" + (index - n).toString() + ")"
26002610
)
26012611
)
26022612
}
@@ -2617,22 +2627,6 @@ private module Impl {
26172627
)
26182628
}
26192629

2620-
private Element getImmediateChildOfOverloadedDeclRefExpr(
2621-
OverloadedDeclRefExpr e, int index, string partialPredicateCall
2622-
) {
2623-
exists(int b, int bOverloadSetRefExpr, int n |
2624-
b = 0 and
2625-
bOverloadSetRefExpr =
2626-
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfOverloadSetRefExpr(e, i, _)) | i) and
2627-
n = bOverloadSetRefExpr and
2628-
(
2629-
none()
2630-
or
2631-
result = getImmediateChildOfOverloadSetRefExpr(e, index - b, partialPredicateCall)
2632-
)
2633-
)
2634-
}
2635-
26362630
private Element getImmediateChildOfParenExpr(ParenExpr e, int index, string partialPredicateCall) {
26372631
exists(int b, int bIdentityExpr, int n |
26382632
b = 0 and
@@ -5024,6 +5018,8 @@ private module Impl {
50245018
or
50255019
result = getImmediateChildOfOtherConstructorDeclRefExpr(e, index, partialAccessor)
50265020
or
5021+
result = getImmediateChildOfOverloadedDeclRefExpr(e, index, partialAccessor)
5022+
or
50275023
result = getImmediateChildOfPackExpr(e, index, partialAccessor)
50285024
or
50295025
result = getImmediateChildOfPropertyWrapperValuePlaceholderExpr(e, index, partialAccessor)
@@ -5136,8 +5132,6 @@ private module Impl {
51365132
or
51375133
result = getImmediateChildOfOptionalTryExpr(e, index, partialAccessor)
51385134
or
5139-
result = getImmediateChildOfOverloadedDeclRefExpr(e, index, partialAccessor)
5140-
or
51415135
result = getImmediateChildOfParenExpr(e, index, partialAccessor)
51425136
or
51435137
result = getImmediateChildOfPointerToPointerExpr(e, index, partialAccessor)

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

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ module Raw {
3333
int getEndColumn() { locations(this, _, _, _, _, result) }
3434
}
3535

36-
class UnresolvedElement extends @unresolved_element, Element { }
37-
3836
class AstNode extends @ast_node, Locatable { }
3937

4038
class Comment extends @comment, Locatable {
@@ -59,6 +57,8 @@ module Raw {
5957
int getKind() { diagnostics(this, _, result) }
6058
}
6159

60+
class UnresolvedElement extends @unresolved_element, Locatable { }
61+
6262
class UnspecifiedElement extends @unspecified_element, Locatable {
6363
override string toString() { result = "UnspecifiedElement" }
6464

@@ -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 {
@@ -547,14 +553,24 @@ module Raw {
547553
ConstructorDecl getConstructorDecl() { other_constructor_decl_ref_exprs(this, result) }
548554
}
549555

550-
class OverloadSetRefExpr extends @overload_set_ref_expr, Expr { }
556+
class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, Expr {
557+
override string toString() { result = "OverloadedDeclRefExpr" }
558+
559+
ValueDecl getPossibleDeclaration(int index) {
560+
overloaded_decl_ref_expr_possible_declarations(this, index, result)
561+
}
562+
}
551563

552564
class PackExpr extends @pack_expr, Expr {
553565
override string toString() { result = "PackExpr" }
554566
}
555567

556568
class PropertyWrapperValuePlaceholderExpr extends @property_wrapper_value_placeholder_expr, Expr {
557569
override string toString() { result = "PropertyWrapperValuePlaceholderExpr" }
570+
571+
Expr getWrappedValue() { property_wrapper_value_placeholder_expr_wrapped_values(this, result) }
572+
573+
OpaqueValueExpr getPlaceholder() { property_wrapper_value_placeholder_exprs(this, result) }
558574
}
559575

560576
class RebindSelfInConstructorExpr extends @rebind_self_in_constructor_expr, Expr {
@@ -635,6 +651,8 @@ module Raw {
635651

636652
class UnresolvedSpecializeExpr extends @unresolved_specialize_expr, Expr, UnresolvedElement {
637653
override string toString() { result = "UnresolvedSpecializeExpr" }
654+
655+
Expr getSubExpr() { unresolved_specialize_exprs(this, result) }
638656
}
639657

640658
class VarargExpansionExpr extends @vararg_expansion_expr, Expr {
@@ -839,16 +857,16 @@ module Raw {
839857

840858
class ObjectLiteralExpr extends @object_literal_expr, LiteralExpr {
841859
override string toString() { result = "ObjectLiteralExpr" }
860+
861+
int getKind() { object_literal_exprs(this, result) }
862+
863+
Argument getArgument(int index) { object_literal_expr_arguments(this, index, result) }
842864
}
843865

844866
class OptionalTryExpr extends @optional_try_expr, AnyTryExpr {
845867
override string toString() { result = "OptionalTryExpr" }
846868
}
847869

848-
class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, OverloadSetRefExpr {
849-
override string toString() { result = "OverloadedDeclRefExpr" }
850-
}
851-
852870
class ParenExpr extends @paren_expr, IdentityExpr {
853871
override string toString() { result = "ParenExpr" }
854872
}

0 commit comments

Comments
 (0)