Skip to content

Commit 1e4ac44

Browse files
committed
Swift: some expression extractions
1 parent 0912996 commit 1e4ac44

File tree

28 files changed

+159
-57
lines changed

28 files changed

+159
-57
lines changed

swift/codegen/schema.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,7 @@ EnumIsCaseExpr:
380380

381381
ErrorExpr:
382382
_extends: Expr
383+
_tags: [ no_qltest ] # unexpected emission
383384

384385
ExplicitCastExpr:
385386
_extends: Expr
@@ -454,6 +455,7 @@ ObjCSelectorExpr:
454455
_children:
455456
sub_expr: Expr
456457
method: AbstractFunctionDecl
458+
_tags: [ no_qltest ] # to be tested in integration tests
457459

458460
OneWayExpr:
459461
_extends: Expr
@@ -493,6 +495,9 @@ RebindSelfInConstructorExpr:
493495

494496
SequenceExpr:
495497
_extends: Expr
498+
_children:
499+
elements: Expr*
500+
_tags: [ no_qltest ] # we should really never extract these, as these should be resolved to trees of operations
496501

497502
SuperRefExpr:
498503
_extends: Expr
@@ -523,18 +528,28 @@ TypeExpr:
523528

524529
UnresolvedDeclRefExpr:
525530
_extends: Expr
531+
name: string?
532+
_tags: [ no_qltest ] # we should really never extract these
526533

527534
UnresolvedDotExpr:
528535
_extends: Expr
536+
_children:
537+
base: Expr
538+
name: string
539+
_tags: [ no_qltest ] # we should really never extract these
529540

530541
UnresolvedMemberExpr:
531542
_extends: Expr
543+
name: string
544+
_tags: [ no_qltest ] # we should really never extract these
532545

533546
UnresolvedPatternExpr:
534547
_extends: Expr
548+
_tags: [ no_qltest ] # we should really never extract these
535549

536550
UnresolvedSpecializeExpr:
537551
_extends: Expr
552+
_tags: [ no_qltest ] # we should really never extract these
538553

539554
VarargExpansionExpr:
540555
_extends: Expr
@@ -808,9 +823,11 @@ ArrayToPointerExpr:
808823

809824
BridgeFromObjCExpr:
810825
_extends: ImplicitConversionExpr
826+
_tags: [ no_qltest ] # to be tested in integration tests
811827

812828
BridgeToObjCExpr:
813829
_extends: ImplicitConversionExpr
830+
_tags: [ no_qltest ] # to be tested in integration tests
814831

815832
ClassMetatypeToObjectExpr:
816833
_extends: ImplicitConversionExpr
@@ -820,6 +837,7 @@ CollectionUpcastConversionExpr:
820837

821838
ConditionalBridgeFromObjCExpr:
822839
_extends: ImplicitConversionExpr
840+
_tags: [ no_qltest ] # to be tested in integration tests
823841

824842
CovariantFunctionConversionExpr:
825843
_extends: ImplicitConversionExpr

swift/extractor/SwiftDispatcher.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class SwiftDispatcher {
6464
// visitor (see `visit(T *)` methods below).
6565
template <typename E>
6666
TrapLabelOf<E> fetchLabel(E* e) {
67+
assert(e && "trying to fetch a label on nullptr, maybe fetchOptionalLabel is to be used?");
6768
// this is required so we avoid any recursive loop: a `fetchLabel` during the visit of `e` might
6869
// end up calling `fetchLabel` on `e` itself, so we want the visit of `e` to call `fetchLabel`
6970
// only after having called `assignNewLabel` on `e`.

swift/extractor/visitors/ExprVisitor.h

Lines changed: 63 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -280,10 +280,10 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
280280
}
281281
}
282282

283-
void visitParenExpr(swift::ParenExpr* expr) {
284-
auto label = dispatcher_.assignNewLabel(expr);
285-
dispatcher_.emit(ParenExprsTrap{label});
286-
emitIdentityExpr(expr, label);
283+
codeql::ParenExpr translateParenExpr(const swift::ParenExpr& expr) {
284+
ParenExpr entry{dispatcher_.assignNewLabel(expr)};
285+
fillIdentityExpr(expr, entry);
286+
return entry;
287287
}
288288

289289
void visitLoadExpr(swift::LoadExpr* expr) {
@@ -535,6 +535,62 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
535535
dispatcher_.emit(OtherConstructorDeclRefExprsTrap{label, ctorLabel});
536536
}
537537

538+
codeql::UnresolvedDeclRefExpr translateUnresolvedDeclRefExpr(
539+
const swift::UnresolvedDeclRefExpr& expr) {
540+
codeql::UnresolvedDeclRefExpr entry{dispatcher_.assignNewLabel(expr)};
541+
if (expr.hasName()) {
542+
llvm::SmallVector<char> scratch;
543+
entry.name = expr.getName().getString(scratch).str();
544+
}
545+
return entry;
546+
}
547+
548+
codeql::UnresolvedDotExpr translateUnresolvedDotExpr(const swift::UnresolvedDotExpr& expr) {
549+
codeql::UnresolvedDotExpr entry{dispatcher_.assignNewLabel(expr)};
550+
assert(expr.getBase() && "Expect UnresolvedDotExpr to have a base");
551+
entry.base = dispatcher_.fetchLabel(expr.getBase());
552+
llvm::SmallVector<char> scratch;
553+
entry.name = expr.getName().getString(scratch).str();
554+
return entry;
555+
}
556+
557+
codeql::UnresolvedMemberExpr translateUnresolvedMemberExpr(
558+
const swift::UnresolvedMemberExpr& expr) {
559+
UnresolvedMemberExpr entry{dispatcher_.assignNewLabel(expr)};
560+
llvm::SmallVector<char> scratch;
561+
entry.name = expr.getName().getString(scratch).str();
562+
return entry;
563+
}
564+
565+
codeql::SequenceExpr translateSequenceExpr(const swift::SequenceExpr& expr) {
566+
SequenceExpr entry{dispatcher_.assignNewLabel(expr)};
567+
entry.elements = dispatcher_.fetchRepeatedLabels(expr.getElements());
568+
return entry;
569+
}
570+
571+
codeql::BridgeToObjCExpr translateBridgeToObjCExpr(const swift::BridgeToObjCExpr& expr) {
572+
BridgeToObjCExpr entry{dispatcher_.assignNewLabel(expr)};
573+
entry.sub_expr = dispatcher_.fetchLabel(expr.getSubExpr());
574+
return entry;
575+
}
576+
577+
codeql::BridgeFromObjCExpr translateBridgeFromObjCExpr(const swift::BridgeFromObjCExpr& expr) {
578+
BridgeFromObjCExpr entry{dispatcher_.assignNewLabel(expr)};
579+
entry.sub_expr = dispatcher_.fetchLabel(expr.getSubExpr());
580+
return entry;
581+
}
582+
583+
codeql::DotSelfExpr translateDotSelfExpr(const swift::DotSelfExpr& expr) {
584+
DotSelfExpr entry{dispatcher_.assignNewLabel(expr)};
585+
fillIdentityExpr(expr, entry);
586+
return entry;
587+
}
588+
589+
codeql::ErrorExpr translateErrorExpr(const swift::ErrorExpr& expr) {
590+
ErrorExpr entry{dispatcher_.assignNewLabel(expr)};
591+
return entry;
592+
}
593+
538594
private:
539595
void emitAbstractClosureExpr(swift::AbstractClosureExpr* expr,
540596
TrapLabel<AbstractClosureExprTag> label) {
@@ -566,9 +622,9 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
566622
dispatcher_.emit(ExplicitCastExprsTrap{label, dispatcher_.fetchLabel(expr->getSubExpr())});
567623
}
568624

569-
void emitIdentityExpr(swift::IdentityExpr* expr, TrapLabel<IdentityExprTag> label) {
570-
assert(expr->getSubExpr() && "IdentityExpr has getSubExpr()");
571-
dispatcher_.emit(IdentityExprsTrap{label, dispatcher_.fetchLabel(expr->getSubExpr())});
625+
void fillIdentityExpr(const swift::IdentityExpr& expr, codeql::IdentityExpr& entry) {
626+
assert(expr.getSubExpr() && "IdentityExpr has getSubExpr()");
627+
entry.sub_expr = dispatcher_.fetchLabel(expr.getSubExpr());
572628
}
573629

574630
void emitAnyTryExpr(swift::AnyTryExpr* expr, TrapLabel<AnyTryExprTag> label) {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,8 @@ Element getAnImmediateChild(Element e) {
134134
or
135135
self_apply_exprs(e, x)
136136
or
137+
sequence_expr_elements(e, _, x)
138+
or
137139
subscript_expr_arguments(e, _, x)
138140
or
139141
tap_expr_sub_exprs(e, x)
@@ -146,6 +148,8 @@ Element getAnImmediateChild(Element e) {
146148
or
147149
type_expr_type_reprs(e, x)
148150
or
151+
unresolved_dot_exprs(e, x, _)
152+
or
149153
vararg_expansion_exprs(e, x)
150154
or
151155
binding_patterns(e, x)

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,15 @@ import codeql.swift.elements.expr.Expr
33

44
class SequenceExprBase extends @sequence_expr, Expr {
55
override string getAPrimaryQlClass() { result = "SequenceExpr" }
6+
7+
Expr getElement(int index) {
8+
exists(Expr x |
9+
sequence_expr_elements(this, index, x) and
10+
result = x.resolve()
11+
)
12+
}
13+
14+
Expr getAnElement() { result = getElement(_) }
15+
16+
int getNumberOfElements() { result = count(getAnElement()) }
617
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,8 @@ import codeql.swift.elements.expr.Expr
33

44
class UnresolvedDeclRefExprBase extends @unresolved_decl_ref_expr, Expr {
55
override string getAPrimaryQlClass() { result = "UnresolvedDeclRefExpr" }
6+
7+
string getName() { unresolved_decl_ref_expr_names(this, result) }
8+
9+
predicate hasName() { exists(getName()) }
610
}

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,13 @@ import codeql.swift.elements.expr.Expr
33

44
class UnresolvedDotExprBase extends @unresolved_dot_expr, Expr {
55
override string getAPrimaryQlClass() { result = "UnresolvedDotExpr" }
6+
7+
Expr getBase() {
8+
exists(Expr x |
9+
unresolved_dot_exprs(this, x, _) and
10+
result = x.resolve()
11+
)
12+
}
13+
14+
string getName() { unresolved_dot_exprs(this, _, result) }
615
}

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,6 @@ import codeql.swift.elements.expr.Expr
33

44
class UnresolvedMemberExprBase extends @unresolved_member_expr, Expr {
55
override string getAPrimaryQlClass() { result = "UnresolvedMemberExpr" }
6+
7+
string getName() { unresolved_member_exprs(this, result) }
68
}

swift/ql/lib/swift.dbscheme

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,13 @@ sequence_exprs(
10041004
unique int id: @sequence_expr
10051005
);
10061006

1007+
#keyset[id, index]
1008+
sequence_expr_elements(
1009+
int id: @sequence_expr ref,
1010+
int index: int ref,
1011+
int element: @expr ref
1012+
);
1013+
10071014
super_ref_exprs(
10081015
unique int id: @super_ref_expr,
10091016
int self: @var_decl ref
@@ -1052,12 +1059,21 @@ unresolved_decl_ref_exprs(
10521059
unique int id: @unresolved_decl_ref_expr
10531060
);
10541061

1062+
#keyset[id]
1063+
unresolved_decl_ref_expr_names(
1064+
int id: @unresolved_decl_ref_expr ref,
1065+
string name: string ref
1066+
);
1067+
10551068
unresolved_dot_exprs(
1056-
unique int id: @unresolved_dot_expr
1069+
unique int id: @unresolved_dot_expr,
1070+
int base: @expr ref,
1071+
string name: string ref
10571072
);
10581073

10591074
unresolved_member_exprs(
1060-
unique int id: @unresolved_member_expr
1075+
unique int id: @unresolved_member_expr,
1076+
string name: string ref
10611077
);
10621078

10631079
unresolved_pattern_exprs(

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

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

0 commit comments

Comments
 (0)