Skip to content

Commit 50e5b29

Browse files
committed
Swift: all Callables can have captures [codegen'd]
1 parent ce2e7f1 commit 50e5b29

17 files changed

+133
-108
lines changed

swift/ql/.generated.list

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,7 @@ ql/lib/codeql/swift/elements/type/WeakStorageType.qll 87a28616eea3600fb0156fffcd
366366
ql/lib/codeql/swift/elements/type/WeakStorageTypeConstructor.qll d88b031ef44d6de14b3ddcff2eb47b53dbd11550c37250ff2edb42e5d21ec3e9 26d855c33492cf7a118e439f7baeed0e5425cfaf058b1dcc007eca7ed765c897
367367
ql/lib/codeql/swift/elements.qll 3d387d94fce53782d0729062e3b4f0235e8a92365371410bfd4850b0b5bf2972 3d387d94fce53782d0729062e3b4f0235e8a92365371410bfd4850b0b5bf2972
368368
ql/lib/codeql/swift/generated/AstNode.qll 02ca56d82801f942ae6265c6079d92ccafdf6b532f6bcebd98a04029ddf696e4 6216fda240e45bd4302fa0cf0f08f5f945418b144659264cdda84622b0420aa2
369-
ql/lib/codeql/swift/generated/Callable.qll cc67625a86b62f91d1480e284a946aa5274a21a7da03d7ad9f1dc2197927d394 7ee41be3d36c74ed5662d7c1babe591942429f87020d09d7ba2c447ba058fb0a
369+
ql/lib/codeql/swift/generated/Callable.qll 042b4f975f1e416c48b5bf26bee257549eec13fb262f11025375560f75a73582 0434788243bc54e48fec49e4cce93509b9a2333f2079dacb6ffc12c972853540
370370
ql/lib/codeql/swift/generated/Comment.qll f58b49f6e68c21f87c51e2ff84c8a64b09286d733e86f70d67d3a98fe6260bd6 975bbb599a2a7adc35179f6ae06d9cbc56ea8a03b972ef2ee87604834bc6deb1
371371
ql/lib/codeql/swift/generated/DbFile.qll a49b2a2cb2788cb49c861ebcd458b8daead7b15adb19c3a9f4db3bf39a0051fc a49b2a2cb2788cb49c861ebcd458b8daead7b15adb19c3a9f4db3bf39a0051fc
372372
ql/lib/codeql/swift/generated/DbLocation.qll b9baea963d9fa82068986512c0649d1050897654eee3df51dba17cf6b1170873 b9baea963d9fa82068986512c0649d1050897654eee3df51dba17cf6b1170873
@@ -376,9 +376,9 @@ ql/lib/codeql/swift/generated/ErrorElement.qll 4b032abe8ffb71376a29c63e470a52943
376376
ql/lib/codeql/swift/generated/File.qll 61454459f5f1ae378bd4970ad1da4f39f3e696bac8a5eebdd162f131995c5316 3e6805f8858cd55dd0e0d0e5aeab923d6a55292dbf98b0029db1ae0208efe684
377377
ql/lib/codeql/swift/generated/Locatable.qll bdc98b9fb7788f44a4bf7e487ee5bd329473409950a8e9f116d61995615ad849 0b36b4fe45e2aa195e4bb70c50ea95f32f141b8e01e5f23466c6427dd9ab88fb
378378
ql/lib/codeql/swift/generated/Location.qll 851766e474cdfdfa67da42e0031fc42dd60196ff5edd39d82f08d3e32deb84c1 b29b2c37672f5acff15f1d3c5727d902f193e51122327b31bd27ec5f877bca3b
379-
ql/lib/codeql/swift/generated/ParentChild.qll 951f61a1f0a46feb0741ced1a550c263de6cc29c704b9e7126a7b47a78cd96c9 1fabdcc6b98c72fecc6724584f6bc6b4c3a911011343ce25446c8dd769b0f778
379+
ql/lib/codeql/swift/generated/ParentChild.qll a5ae2e7054de7c2250ffd4ce1e6cbcff125f0f87fc75797467054ac54426cbe2 a945a9b8a1790587d7926062799fe51af60f53db159a9bf4d86bbfd5910e5c58
380380
ql/lib/codeql/swift/generated/PureSynthConstructors.qll 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98
381-
ql/lib/codeql/swift/generated/Raw.qll e1ac822bd39d4a698802c9d42a043333d821545071bf1e81aa617507d3d93702 197f09336b11c84a1f0b46385cbb2fa73f79a06f822e5ef6147005d624e2810b
381+
ql/lib/codeql/swift/generated/Raw.qll 737b3a9bb3a67ad83c182dd06b76f633b4377837c2ea886659d07051cac49d17 0a264590d516bea7a15fbf4781d90d377b174994205a3483f890c62fc1919966
382382
ql/lib/codeql/swift/generated/Synth.qll 51621505f034f24980e7a940062970b82a74dbf1cd1df507dd50fb00876f6b7c 2ab724386c2eff89cf3894b7dbe91fad27f828eabc01455b9ac2f4b6b44c881e
383383
ql/lib/codeql/swift/generated/SynthConstructors.qll 79e4ffbc85a80b1d2c74c45449cd077fbf33d4498ccf93a51351ad0c7cc461ea 79e4ffbc85a80b1d2c74c45449cd077fbf33d4498ccf93a51351ad0c7cc461ea
384384
ql/lib/codeql/swift/generated/UnknownFile.qll 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6
@@ -427,7 +427,7 @@ ql/lib/codeql/swift/generated/decl/TypeDecl.qll 74bb5f0fe2648d95c84fdce804740f2b
427427
ql/lib/codeql/swift/generated/decl/ValueDecl.qll 7b4e4c9334be676f242857c77099306d8a0a4357b253f8bc68f71328cedf1f58 f18938c47f670f2e0c27ffd7e31e55f291f88fb50d8e576fcea116d5f9e5c66d
428428
ql/lib/codeql/swift/generated/decl/VarDecl.qll bdea76fe6c8f721bae52bbc26a2fc1cbd665a19a6920b36097822839158d9d3b 9c91d8159fd7a53cba479d8c8f31f49ad2b1e2617b8cd9e7d1a2cb4796dfa2da
429429
ql/lib/codeql/swift/generated/expr/AbiSafeConversionExpr.qll f4c913df3f1c139a0533f9a3a2f2e07aee96ab723c957fc7153d68564e4fdd6d f4c913df3f1c139a0533f9a3a2f2e07aee96ab723c957fc7153d68564e4fdd6d
430-
ql/lib/codeql/swift/generated/expr/AbstractClosureExpr.qll 27bc6fd8e091e4bf37f0092d31364fd6664f240a978a29f449c9bde262952edc 60c15957f6bb79b59c642bc4bf6437ddee5f64c4868e8ebb503a53dd23694ca2
430+
ql/lib/codeql/swift/generated/expr/AbstractClosureExpr.qll f0060c2972d2e1f9818d8deea3ceebbbe0b19d2ce11adc9b670beb672c4564d3 5f2500c5f3728f81599bd4e1fb9c97ac5a44a6dce8c1ab84a850c62aae3741ff
431431
ql/lib/codeql/swift/generated/expr/AnyHashableErasureExpr.qll f450ac8e316def1cd64dcb61411bae191144079df7f313a5973e59dc89fe367f f450ac8e316def1cd64dcb61411bae191144079df7f313a5973e59dc89fe367f
432432
ql/lib/codeql/swift/generated/expr/AnyTryExpr.qll f2929f39407e1717b91fc41f593bd52f1ae14c619d61598bd0668a478a04a91e 62693c2c18678af1ff9ce5393f0dd87c5381e567b340f1a8a9ecf91a92e2e666
433433
ql/lib/codeql/swift/generated/expr/AppliedPropertyWrapperExpr.qll 191612ec26b3f0d5a61301789a34d9e349b4c9754618760d1c0614f71712e828 cc212df0068ec318c997a83dc6e95bdda5135bccc12d1076b0aebf245da78a4b
@@ -653,8 +653,9 @@ ql/lib/codeql/swift/generated/type/WeakStorageType.qll dda4397a49f537ec44117a86d
653653
ql/test/extractor-tests/generated/Comment/MISSING_SOURCE.txt 7e714762ffb48c436102027d560fb5addc1f7dc6dd6936b06e0d3cca031d67fd 7e714762ffb48c436102027d560fb5addc1f7dc6dd6936b06e0d3cca031d67fd
654654
ql/test/extractor-tests/generated/Diagnostics/Diagnostics.ql 6a4a9480cc929381e0337b181e5ac519a7abc6d597ebe24fb6701acf79ced86f 199c5bf8bd38e161d989e0e4db1ea1d3ddcb4d7cf571afd9112ce3ed8d9b8d2a
655655
ql/test/extractor-tests/generated/File/File.ql ab0968ae31b749da2b66462bd04e4dfb30604dba405a84594b575abfc4fa4c35 bcc0ff648b28c5ecd567e196e700272883756bbcc65296bbb880a979e3162628
656-
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl.ql 18937cb9ff06912f624e9b26318fd5286b0f2532062b6af339c45ae111aed9fd 674912a0c75c096823f20a36d76804db0c68d8097abab48c9cec6fe7a7fb08f1
656+
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl.ql 5c017af7e6b16ee68990eec12affe81eb114338bac4d445f4b231fe0f110eccc db86c828a892b0acd150a780914e7e48c280cad473d3680a453bdee03aee1e9d
657657
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl_getBody.ql 1d42eb1a5b832cfaf1949b61a01a6a11448a6d4369a44f2511bb31d1d7fc10a8 b326a6743121353f8a66410d3d9151ca969939abcbbe5c411872ca290da45123
658+
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl_getCapture.ql 17f9903978c9a8fc607d970532270090cea030ff57c2f6699c37672707ce5c70 cdd7ce47691a84aa5402a8946d4027f7b9dbce930057dfd62c14b470a5710cb0
658659
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl_getGenericTypeParam.ql 8648679e9403477c7f97b6df450a0fa623dc9aff0777021ee33f9cc96eef2611 59c384c35804bf205c3c63e8b956e6bc89d3ded7952911c40e7bf156acb56bf8
659660
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl_getMember.ql 826f3cd3a3737938ade950555a36506d970894c3c761c07d36f0a6252672e9bc 0e681a49e07b69bf0df10c14864da946b04b2dea2412bdc93c9b5567c77f819a
660661
ql/test/extractor-tests/generated/decl/AccessorDecl/AccessorDecl_getName.ql a8f7b6cbb8ab43ed612cfbb36b48b5d6dd23b1dbe94a99d95fedf80e3c95f89f d70eb32403c4983c58448fe5c9e2d88bc873ab61e0e310c38356a9a144b42978
@@ -669,8 +670,9 @@ ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl.ql a76c9710142c368206
669670
ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl_getBaseType.ql 5f4fddbb3fb3d003f1485dc4c5a56f7d0d26dfc1d691540085654c4c66e70e69 0b5a5b757ca92e664ef136d26ac682aa5a0e071494d9f09d85f66cd13807e81d
670671
ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl_getGenericTypeParam.ql ca0b73a4f31eea47def7a1de017de36b5fdaec96ae98edb03ff00611bfcac572 f9badd62887a30113484496532b3ff9b67ff5047eb5a311aa2ec2e4d91321e0e
671672
ql/test/extractor-tests/generated/decl/ClassDecl/ClassDecl_getMember.ql f73881b14bb4eaf83dacf60b9e46d440227f90566e2dfb8908a55567626ccdda f78a7261f7ccfe01ca55f7279bd5a1a302fc65ba36b13e779426d173c7465b84
672-
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl.ql 71eec396eef782de51746fc192b6451421c09ba89a9639aeee558f20949a67b3 e9291ca7340fa625eae7b9677a46a7338c01b2327ade4bebfa6c4d6be6bb9736
673+
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl.ql 97813e8d28abdafa300278a7bdef824ca2cf62b0677e31cb7293f2063ffe69de c3c5f8784d1a0f4f38b691cec5b870587ae1c6587d4862681a9bc6ce10ffa73f
673674
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl_getBody.ql 3c742b9c8d8d8c23d1bef03f559e1b91f0d3848084ba5819f118c323dd1920a2 340d4e4a6312ffaf4c47bbc753828c1e478d84a2d399c66220288c081c8357ca
675+
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl_getCapture.ql d3fe4c473661944cd3868ee5c2ef9cc7e7da0b414c4b4f7018456b1a4ee44c02 491a3271a4e15c99d5a8b9429a07c63bbf2e311ac2e72604d3118163ba309ba9
674676
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl_getGenericTypeParam.ql b5e64bf02a5991a1549794af0aaab9ae654c88b5d52a3e04b7ac525b3a64af5e 034a7d0bf7500afa952a28d184d1d073e71c3dcec3bc26fcefaed70aef9de3ce
675677
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl_getMember.ql aaba9cb097602d761c48de09de059ef2fe112e0c6c64a5f6988a95cddc9155d8 6e6b76a51bd1d9d4ec25865a1c229e5859ca55f11639ccee414a8cac7de1662a
676678
ql/test/extractor-tests/generated/decl/ConcreteFuncDecl/ConcreteFuncDecl_getName.ql d80c7dfdde294264b6763a7129e666efd98111dbf203a9739c24942659d7f832 396e44281e4f4af2188a4f7d246872b7058132b12f508b88dc60d5bdd14e2092

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
private import codeql.swift.generated.Synth
33
private import codeql.swift.generated.Raw
44
import codeql.swift.elements.stmt.BraceStmt
5+
import codeql.swift.elements.decl.CapturedDecl
56
import codeql.swift.elements.Element
67
import codeql.swift.elements.decl.ParamDecl
78

@@ -90,5 +91,33 @@ module Generated {
9091
* Holds if `getBody()` exists.
9192
*/
9293
final predicate hasBody() { exists(getBody()) }
94+
95+
/**
96+
* Gets the `index`th capture of this callable (0-based).
97+
*
98+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
99+
* behavior of both the `Immediate` and non-`Immediate` versions.
100+
*/
101+
CapturedDecl getImmediateCapture(int index) {
102+
result =
103+
Synth::convertCapturedDeclFromRaw(Synth::convertCallableToRaw(this)
104+
.(Raw::Callable)
105+
.getCapture(index))
106+
}
107+
108+
/**
109+
* Gets the `index`th capture of this callable (0-based).
110+
*/
111+
final CapturedDecl getCapture(int index) { result = getImmediateCapture(index).resolve() }
112+
113+
/**
114+
* Gets any of the captures of this callable.
115+
*/
116+
final CapturedDecl getACapture() { result = getCapture(_) }
117+
118+
/**
119+
* Gets the number of captures of this callable.
120+
*/
121+
final int getNumberOfCaptures() { result = count(int i | exists(getCapture(i))) }
93122
}
94123
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@ private module Impl {
88
}
99

1010
private Element getImmediateChildOfCallable(Callable e, int index, string partialPredicateCall) {
11-
exists(int b, int bElement, int n, int nSelfParam, int nParam, int nBody |
11+
exists(int b, int bElement, int n, int nSelfParam, int nParam, int nBody, int nCapture |
1212
b = 0 and
1313
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
1414
n = bElement and
1515
nSelfParam = n + 1 and
1616
nParam = nSelfParam + 1 + max(int i | i = -1 or exists(e.getImmediateParam(i)) | i) and
1717
nBody = nParam + 1 and
18+
nCapture = nBody + 1 + max(int i | i = -1 or exists(e.getImmediateCapture(i)) | i) and
1819
(
1920
none()
2021
or
@@ -26,6 +27,9 @@ private module Impl {
2627
partialPredicateCall = "Param(" + (index - nSelfParam).toString() + ")"
2728
or
2829
index = nParam and result = e.getImmediateBody() and partialPredicateCall = "Body()"
30+
or
31+
result = e.getImmediateCapture(index - nBody) and
32+
partialPredicateCall = "Capture(" + (index - nBody).toString() + ")"
2933
)
3034
)
3135
}
@@ -953,22 +957,18 @@ private module Impl {
953957
private Element getImmediateChildOfAbstractClosureExpr(
954958
AbstractClosureExpr e, int index, string partialPredicateCall
955959
) {
956-
exists(int b, int bExpr, int bCallable, int n, int nCapture |
960+
exists(int b, int bExpr, int bCallable, int n |
957961
b = 0 and
958962
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
959963
bCallable =
960964
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfCallable(e, i, _)) | i) and
961965
n = bCallable and
962-
nCapture = n + 1 + max(int i | i = -1 or exists(e.getImmediateCapture(i)) | i) and
963966
(
964967
none()
965968
or
966969
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
967970
or
968971
result = getImmediateChildOfCallable(e, index - bExpr, partialPredicateCall)
969-
or
970-
result = e.getImmediateCapture(index - n) and
971-
partialPredicateCall = "Capture(" + (index - n).toString() + ")"
972972
)
973973
)
974974
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ module Raw {
1313
ParamDecl getParam(int index) { callable_params(this, index, result) }
1414

1515
BraceStmt getBody() { callable_bodies(this, result) }
16+
17+
CapturedDecl getCapture(int index) { callable_captures(this, index, result) }
1618
}
1719

1820
class File extends @file, Element {
@@ -360,9 +362,7 @@ module Raw {
360362
Type getType() { expr_types(this, result) }
361363
}
362364

363-
class AbstractClosureExpr extends @abstract_closure_expr, Expr, Callable {
364-
CapturedDecl getCapture(int index) { abstract_closure_expr_captures(this, index, result) }
365-
}
365+
class AbstractClosureExpr extends @abstract_closure_expr, Expr, Callable { }
366366

367367
class AnyTryExpr extends @any_try_expr, Expr {
368368
Expr getSubExpr() { any_try_exprs(this, result) }

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

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,37 +2,8 @@
22
private import codeql.swift.generated.Synth
33
private import codeql.swift.generated.Raw
44
import codeql.swift.elements.Callable
5-
import codeql.swift.elements.decl.CapturedDecl
65
import codeql.swift.elements.expr.Expr
76

87
module Generated {
9-
class AbstractClosureExpr extends Synth::TAbstractClosureExpr, Expr, Callable {
10-
/**
11-
* Gets the `index`th capture of this abstract closure expression (0-based).
12-
*
13-
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
14-
* behavior of both the `Immediate` and non-`Immediate` versions.
15-
*/
16-
CapturedDecl getImmediateCapture(int index) {
17-
result =
18-
Synth::convertCapturedDeclFromRaw(Synth::convertAbstractClosureExprToRaw(this)
19-
.(Raw::AbstractClosureExpr)
20-
.getCapture(index))
21-
}
22-
23-
/**
24-
* Gets the `index`th capture of this abstract closure expression (0-based).
25-
*/
26-
final CapturedDecl getCapture(int index) { result = getImmediateCapture(index).resolve() }
27-
28-
/**
29-
* Gets any of the captures of this abstract closure expression.
30-
*/
31-
final CapturedDecl getACapture() { result = getCapture(_) }
32-
33-
/**
34-
* Gets the number of captures of this abstract closure expression.
35-
*/
36-
final int getNumberOfCaptures() { result = count(int i | exists(getCapture(i))) }
37-
}
8+
class AbstractClosureExpr extends Synth::TAbstractClosureExpr, Expr, Callable { }
389
}

swift/ql/lib/swift.dbscheme

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,13 @@ callable_bodies(
5555
int body: @brace_stmt_or_none ref
5656
);
5757

58+
#keyset[id, index]
59+
callable_captures(
60+
int id: @callable ref,
61+
int index: int ref,
62+
int capture: @captured_decl_or_none ref
63+
);
64+
5865
@file =
5966
@db_file
6067
;
@@ -713,13 +720,6 @@ expr_types( //dir=expr
713720
| @closure_expr
714721
;
715722

716-
#keyset[id, index]
717-
abstract_closure_expr_captures( //dir=expr
718-
int id: @abstract_closure_expr ref,
719-
int index: int ref,
720-
int capture: @captured_decl_or_none ref
721-
);
722-
723723
@any_try_expr =
724724
@force_try_expr
725725
| @optional_try_expr

0 commit comments

Comments
 (0)