Skip to content

Commit 7c958df

Browse files
authored
Merge pull request #9639 from github/redsun82/swift-extraction
Swift: some expression extractions
2 parents 46e6203 + e25f22d commit 7c958df

39 files changed

+522
-378
lines changed

Diff for: swift/codegen/schema.yml

+18-1
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,7 @@ EnumIsCaseExpr:
385385

386386
ErrorExpr:
387387
_extends: Expr
388+
_tags: [ no_qltest ] # unexpected emission
388389

389390
ExplicitCastExpr:
390391
_extends: Expr
@@ -445,7 +446,7 @@ LookupExpr:
445446
_extends: Expr
446447
_children:
447448
base_expr: Expr
448-
member: Decl
449+
member: Decl?
449450

450451
MakeTemporarilyEscapableExpr:
451452
_extends: Expr
@@ -459,6 +460,7 @@ ObjCSelectorExpr:
459460
_children:
460461
sub_expr: Expr
461462
method: AbstractFunctionDecl
463+
_tags: [ no_qltest ] # to be tested in integration tests
462464

463465
OneWayExpr:
464466
_extends: Expr
@@ -498,6 +500,9 @@ RebindSelfInConstructorExpr:
498500

499501
SequenceExpr:
500502
_extends: Expr
503+
_children:
504+
elements: Expr*
505+
_tags: [ no_qltest ] # we should really never extract these, as these should be resolved to trees of operations
501506

502507
SuperRefExpr:
503508
_extends: Expr
@@ -528,18 +533,27 @@ TypeExpr:
528533

529534
UnresolvedDeclRefExpr:
530535
_extends: Expr
536+
name: string?
537+
_tags: [ no_qltest ] # we should really never extract these
531538

532539
UnresolvedDotExpr:
533540
_extends: Expr
541+
_children:
542+
base: Expr
543+
name: string
534544

535545
UnresolvedMemberExpr:
536546
_extends: Expr
547+
name: string
548+
_tags: [ no_qltest ] # we should really never extract these
537549

538550
UnresolvedPatternExpr:
539551
_extends: Expr
552+
_tags: [ no_qltest ] # we should really never extract these
540553

541554
UnresolvedSpecializeExpr:
542555
_extends: Expr
556+
_tags: [ no_qltest ] # we should really never extract these
543557

544558
VarargExpansionExpr:
545559
_extends: Expr
@@ -807,9 +821,11 @@ ArrayToPointerExpr:
807821

808822
BridgeFromObjCExpr:
809823
_extends: ImplicitConversionExpr
824+
_tags: [ no_qltest ] # to be tested in integration tests
810825

811826
BridgeToObjCExpr:
812827
_extends: ImplicitConversionExpr
828+
_tags: [ no_qltest ] # to be tested in integration tests
813829

814830
ClassMetatypeToObjectExpr:
815831
_extends: ImplicitConversionExpr
@@ -819,6 +835,7 @@ CollectionUpcastConversionExpr:
819835

820836
ConditionalBridgeFromObjCExpr:
821837
_extends: ImplicitConversionExpr
838+
_tags: [ no_qltest ] # to be tested in integration tests
822839

823840
CovariantFunctionConversionExpr:
824841
_extends: ImplicitConversionExpr

Diff for: swift/extractor/SwiftDispatcher.h

+1
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`.

Diff for: swift/extractor/visitors/ExprVisitor.h

+72-17
Original file line numberDiff line numberDiff line change
@@ -271,19 +271,16 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
271271
emitImplicitConversionExpr(expr, label);
272272
}
273273

274-
void visitTypeExpr(swift::TypeExpr* expr) {
275-
auto label = dispatcher_.assignNewLabel(expr);
276-
dispatcher_.emit(TypeExprsTrap{label});
277-
if (auto repr = expr->getTypeRepr()) {
278-
auto typeLabel = dispatcher_.fetchLabel(repr);
279-
dispatcher_.emit(TypeExprTypeReprsTrap{label, typeLabel});
280-
}
274+
codeql::TypeExpr translateTypeExpr(const swift::TypeExpr& expr) {
275+
TypeExpr entry{dispatcher_.assignNewLabel(expr)};
276+
entry.type_repr = dispatcher_.fetchOptionalLabel(expr.getTypeRepr());
277+
return entry;
281278
}
282279

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

289286
void visitLoadExpr(swift::LoadExpr* expr) {
@@ -531,6 +528,62 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
531528
dispatcher_.emit(OtherConstructorDeclRefExprsTrap{label, ctorLabel});
532529
}
533530

531+
codeql::UnresolvedDeclRefExpr translateUnresolvedDeclRefExpr(
532+
const swift::UnresolvedDeclRefExpr& expr) {
533+
codeql::UnresolvedDeclRefExpr entry{dispatcher_.assignNewLabel(expr)};
534+
if (expr.hasName()) {
535+
llvm::SmallVector<char> scratch;
536+
entry.name = expr.getName().getString(scratch).str();
537+
}
538+
return entry;
539+
}
540+
541+
codeql::UnresolvedDotExpr translateUnresolvedDotExpr(const swift::UnresolvedDotExpr& expr) {
542+
codeql::UnresolvedDotExpr entry{dispatcher_.assignNewLabel(expr)};
543+
assert(expr.getBase() && "Expect UnresolvedDotExpr to have a base");
544+
entry.base = dispatcher_.fetchLabel(expr.getBase());
545+
llvm::SmallVector<char> scratch;
546+
entry.name = expr.getName().getString(scratch).str();
547+
return entry;
548+
}
549+
550+
codeql::UnresolvedMemberExpr translateUnresolvedMemberExpr(
551+
const swift::UnresolvedMemberExpr& expr) {
552+
UnresolvedMemberExpr entry{dispatcher_.assignNewLabel(expr)};
553+
llvm::SmallVector<char> scratch;
554+
entry.name = expr.getName().getString(scratch).str();
555+
return entry;
556+
}
557+
558+
codeql::SequenceExpr translateSequenceExpr(const swift::SequenceExpr& expr) {
559+
SequenceExpr entry{dispatcher_.assignNewLabel(expr)};
560+
entry.elements = dispatcher_.fetchRepeatedLabels(expr.getElements());
561+
return entry;
562+
}
563+
564+
codeql::BridgeToObjCExpr translateBridgeToObjCExpr(const swift::BridgeToObjCExpr& expr) {
565+
BridgeToObjCExpr entry{dispatcher_.assignNewLabel(expr)};
566+
entry.sub_expr = dispatcher_.fetchLabel(expr.getSubExpr());
567+
return entry;
568+
}
569+
570+
codeql::BridgeFromObjCExpr translateBridgeFromObjCExpr(const swift::BridgeFromObjCExpr& expr) {
571+
BridgeFromObjCExpr entry{dispatcher_.assignNewLabel(expr)};
572+
entry.sub_expr = dispatcher_.fetchLabel(expr.getSubExpr());
573+
return entry;
574+
}
575+
576+
codeql::DotSelfExpr translateDotSelfExpr(const swift::DotSelfExpr& expr) {
577+
DotSelfExpr entry{dispatcher_.assignNewLabel(expr)};
578+
fillIdentityExpr(expr, entry);
579+
return entry;
580+
}
581+
582+
codeql::ErrorExpr translateErrorExpr(const swift::ErrorExpr& expr) {
583+
ErrorExpr entry{dispatcher_.assignNewLabel(expr)};
584+
return entry;
585+
}
586+
534587
private:
535588
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,
536589
codeql::AbstractClosureExpr& entry) {
@@ -560,9 +613,9 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
560613
dispatcher_.emit(ExplicitCastExprsTrap{label, dispatcher_.fetchLabel(expr->getSubExpr())});
561614
}
562615

563-
void emitIdentityExpr(swift::IdentityExpr* expr, TrapLabel<IdentityExprTag> label) {
564-
assert(expr->getSubExpr() && "IdentityExpr has getSubExpr()");
565-
dispatcher_.emit(IdentityExprsTrap{label, dispatcher_.fetchLabel(expr->getSubExpr())});
616+
void fillIdentityExpr(const swift::IdentityExpr& expr, codeql::IdentityExpr& entry) {
617+
assert(expr.getSubExpr() && "IdentityExpr has getSubExpr()");
618+
entry.sub_expr = dispatcher_.fetchLabel(expr.getSubExpr());
566619
}
567620

568621
void emitAnyTryExpr(swift::AnyTryExpr* expr, TrapLabel<AnyTryExprTag> label) {
@@ -590,9 +643,11 @@ class ExprVisitor : public AstVisitorBase<ExprVisitor> {
590643
void emitLookupExpr(const swift::LookupExpr* expr, TrapLabel<LookupExprTag> label) {
591644
assert(expr->getBase() && "LookupExpr has getBase()");
592645
auto baseLabel = dispatcher_.fetchLabel(expr->getBase());
593-
assert(expr->hasDecl() && "LookupExpr has decl");
594-
auto declLabel = dispatcher_.fetchLabel(expr->getDecl().getDecl());
595-
dispatcher_.emit(LookupExprsTrap{label, baseLabel, declLabel});
646+
dispatcher_.emit(LookupExprsTrap{label, baseLabel});
647+
if (expr->hasDecl()) {
648+
auto declLabel = dispatcher_.fetchLabel(expr->getDecl().getDecl());
649+
dispatcher_.emit(LookupExprMembersTrap{label, declLabel});
650+
}
596651
}
597652

598653
/*
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
21
private import codeql.swift.generated.expr.UnresolvedDotExpr
32

4-
class UnresolvedDotExpr extends UnresolvedDotExprBase { }
3+
class UnresolvedDotExpr extends UnresolvedDotExprBase {
4+
override string toString() { result = "... ." + getName() }
5+
}

Diff for: swift/ql/lib/codeql/swift/generated/GetImmediateParent.qll

+5-1
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ Element getAnImmediateChild(Element e) {
102102
or
103103
lazy_initializer_exprs(e, x)
104104
or
105-
lookup_exprs(e, x, _)
105+
lookup_exprs(e, x)
106106
or
107107
make_temporarily_escapable_exprs(e, x, _, _)
108108
or
@@ -128,6 +128,8 @@ Element getAnImmediateChild(Element e) {
128128
or
129129
self_apply_exprs(e, x)
130130
or
131+
sequence_expr_elements(e, _, x)
132+
or
131133
subscript_expr_arguments(e, _, x)
132134
or
133135
tap_expr_sub_exprs(e, x)
@@ -140,6 +142,8 @@ Element getAnImmediateChild(Element e) {
140142
or
141143
type_expr_type_reprs(e, x)
142144
or
145+
unresolved_dot_exprs(e, x, _)
146+
or
143147
vararg_expansion_exprs(e, x)
144148
or
145149
binding_patterns(e, x)

Diff for: swift/ql/lib/codeql/swift/generated/expr/LookupExpr.qll

+4-2
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ import codeql.swift.elements.expr.Expr
55
class LookupExprBase extends @lookup_expr, Expr {
66
Expr getBaseExpr() {
77
exists(Expr x |
8-
lookup_exprs(this, x, _) and
8+
lookup_exprs(this, x) and
99
result = x.resolve()
1010
)
1111
}
1212

1313
Decl getMember() {
1414
exists(Decl x |
15-
lookup_exprs(this, _, x) and
15+
lookup_expr_members(this, x) and
1616
result = x.resolve()
1717
)
1818
}
19+
20+
predicate hasMember() { exists(getMember()) }
1921
}

Diff for: swift/ql/lib/codeql/swift/generated/expr/SequenceExpr.qll

+11
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
}

Diff for: swift/ql/lib/codeql/swift/generated/expr/UnresolvedDeclRefExpr.qll

+4
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
}

Diff for: swift/ql/lib/codeql/swift/generated/expr/UnresolvedDotExpr.qll

+9
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
}

Diff for: swift/ql/lib/codeql/swift/generated/expr/UnresolvedMemberExpr.qll

+2
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
}

Diff for: swift/ql/lib/swift.dbscheme

+24-3
Original file line numberDiff line numberDiff line change
@@ -955,7 +955,12 @@ lazy_initializer_exprs(
955955
#keyset[id]
956956
lookup_exprs(
957957
int id: @lookup_expr ref,
958-
int base_expr: @expr ref,
958+
int base_expr: @expr ref
959+
);
960+
961+
#keyset[id]
962+
lookup_expr_members(
963+
int id: @lookup_expr ref,
959964
int member: @decl ref
960965
);
961966

@@ -1016,6 +1021,13 @@ sequence_exprs(
10161021
unique int id: @sequence_expr
10171022
);
10181023

1024+
#keyset[id, index]
1025+
sequence_expr_elements(
1026+
int id: @sequence_expr ref,
1027+
int index: int ref,
1028+
int element: @expr ref
1029+
);
1030+
10191031
super_ref_exprs(
10201032
unique int id: @super_ref_expr,
10211033
int self: @var_decl ref
@@ -1064,12 +1076,21 @@ unresolved_decl_ref_exprs(
10641076
unique int id: @unresolved_decl_ref_expr
10651077
);
10661078

1079+
#keyset[id]
1080+
unresolved_decl_ref_expr_names(
1081+
int id: @unresolved_decl_ref_expr ref,
1082+
string name: string ref
1083+
);
1084+
10671085
unresolved_dot_exprs(
1068-
unique int id: @unresolved_dot_expr
1086+
unique int id: @unresolved_dot_expr,
1087+
int base: @expr ref,
1088+
string name: string ref
10691089
);
10701090

10711091
unresolved_member_exprs(
1072-
unique int id: @unresolved_member_expr
1092+
unique int id: @unresolved_member_expr,
1093+
string name: string ref
10731094
);
10741095

10751096
unresolved_pattern_exprs(

0 commit comments

Comments
 (0)