From ffff10a7e860e43cb2170e0bf04239188a43609a Mon Sep 17 00:00:00 2001 From: Paolo Tranquilli Date: Tue, 31 Oct 2023 10:43:14 +0100 Subject: [PATCH] Swift: synthesize `CaptureListExpr::getVariable` in QL instead of extracting it --- swift/extractor/translators/ExprTranslator.cpp | 1 - swift/ql/.generated.list | 4 ++-- .../lib/codeql/swift/elements/expr/CaptureListExpr.qll | 6 ++++++ swift/ql/lib/codeql/swift/generated/Raw.qll | 5 ----- .../lib/codeql/swift/generated/expr/CaptureListExpr.qll | 9 +++------ swift/ql/lib/swift.dbscheme | 7 ------- swift/schema.py | 4 +++- 7 files changed, 14 insertions(+), 22 deletions(-) diff --git a/swift/extractor/translators/ExprTranslator.cpp b/swift/extractor/translators/ExprTranslator.cpp index b6a1fe6e24e..3274c49675e 100644 --- a/swift/extractor/translators/ExprTranslator.cpp +++ b/swift/extractor/translators/ExprTranslator.cpp @@ -119,7 +119,6 @@ codeql::CaptureListExpr ExprTranslator::translateCaptureListExpr( entry.closure_body = dispatcher.fetchLabel(expr.getClosureBody()); for (const auto& item : const_cast(expr).getCaptureList()) { entry.binding_decls.push_back(dispatcher.fetchLabel(item.PBD)); - entry.variables.push_back(dispatcher.fetchLabel(item.getVar())); } return entry; } diff --git a/swift/ql/.generated.list b/swift/ql/.generated.list index 9e4c60eb4d3..00d6f0fe319 100644 --- a/swift/ql/.generated.list +++ b/swift/ql/.generated.list @@ -379,7 +379,7 @@ lib/codeql/swift/generated/OtherAvailabilitySpec.qll 0e26a203b26ff0581b7396b0c6d lib/codeql/swift/generated/ParentChild.qll 680cbaa7cad7b8c33b7cf3b60aba7013facdbc5601b5076a6f38560fd284f2e8 af472eeaca6bd32848cb2de647ff015053f9fb7c54c1eca18f91fcc6ea8ad7b7 lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll f82d9ca416fe8bd59b5531b65b1c74c9f317b3297a6101544a11339a1cffce38 7f5c6d3309e66c134107afe55bae76dfc9a72cb7cdd6d4c3706b6b34cee09fa0 lib/codeql/swift/generated/PureSynthConstructors.qll 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 173c0dd59396a1de26fe870e3bc2766c46de689da2a4d8807cb62023bbce1a98 -lib/codeql/swift/generated/Raw.qll fc093e8aef6c558b17ba4f7a4d42ce782b0fef3222b983df41b79f921bae37c8 586b13654f152b747f07373edd69b7f478d59ecf5abc7c18a5a221851ce8f73a +lib/codeql/swift/generated/Raw.qll 59a847c009d682dfceb72f33bb54d6cf6da589e59a386450bb5fba310a4170e7 ed02d96d3bfc998a105b8f34e6a92d966e6c3db5c581872a53ac5db6904e5fab lib/codeql/swift/generated/Synth.qll 551fdf7e4b53f9ee1314d1bb42c2638cf82f45bfa1f40a635dfa7b6072e4418c 9ab178464700a19951fc5285acacda4913addee81515d8e072b3d7055935a814 lib/codeql/swift/generated/SynthConstructors.qll 2f801bd8b0db829b0253cd459ed3253c1fdfc55dce68ebc53e7fec138ef0aca4 2f801bd8b0db829b0253cd459ed3253c1fdfc55dce68ebc53e7fec138ef0aca4 lib/codeql/swift/generated/UnknownFile.qll 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 0fcf9beb8de79440bcdfff4bb6ab3dd139bd273e6c32754e05e6a632651e85f6 @@ -446,7 +446,7 @@ lib/codeql/swift/generated/expr/BridgeFromObjCExpr.qll b9a6520d01613dfb8c7606177 lib/codeql/swift/generated/expr/BridgeToObjCExpr.qll 31ca13762aee9a6a17746f40ec4e1e929811c81fdadb27c48e0e7ce6a3a6222d 31ca13762aee9a6a17746f40ec4e1e929811c81fdadb27c48e0e7ce6a3a6222d lib/codeql/swift/generated/expr/BuiltinLiteralExpr.qll 052f8d0e9109a0d4496da1ae2b461417951614c88dbc9d80220908734b3f70c6 536fa290bb75deae0517d53528237eab74664958bf7fdbf8041283415dda2142 lib/codeql/swift/generated/expr/CallExpr.qll c7dc105fcb6c0956e20d40f736db35bd7f38f41c3d872858972c2ca120110d36 c7dc105fcb6c0956e20d40f736db35bd7f38f41c3d872858972c2ca120110d36 -lib/codeql/swift/generated/expr/CaptureListExpr.qll 29271af76039bf16aadc5544ab59f06e5689cb92c944f0ed0cf6d23702fcf449 b467850b683f6415edba260065e15c89fb52d0f3ec07f65d526db9f6965694d1 +lib/codeql/swift/generated/expr/CaptureListExpr.qll 61a43bb830403a97ebe41729e87666a4ab4a7343f7f61e8cd94875ee7ca9906e 4c04002502de6cce8b67e0afe84114b81749625da0883bb19a48049d6024b72d lib/codeql/swift/generated/expr/CheckedCastExpr.qll 146c24e72cda519676321d3bdb89d1953dfe1810d2710f04cfdc4210ace24c40 91093e0ba88ec3621b538d98454573b5eea6d43075a2ab0a08f80f9b9be336d3 lib/codeql/swift/generated/expr/ClassMetatypeToObjectExpr.qll 076c0f7369af3fffc8860429bd8e290962bf7fc8cf53bbba061de534e99cc8bf 076c0f7369af3fffc8860429bd8e290962bf7fc8cf53bbba061de534e99cc8bf lib/codeql/swift/generated/expr/ClosureExpr.qll f194fc8c5f67fcf0219e8e2de93ee2b820c27a609b2986b68d57a54445f66b61 3cae87f6c6eefb32195f06bc4c95ff6634446ecf346d3a3c94dc05c1539f3de2 diff --git a/swift/ql/lib/codeql/swift/elements/expr/CaptureListExpr.qll b/swift/ql/lib/codeql/swift/elements/expr/CaptureListExpr.qll index 430ba96fd4f..8bd7248dc89 100644 --- a/swift/ql/lib/codeql/swift/elements/expr/CaptureListExpr.qll +++ b/swift/ql/lib/codeql/swift/elements/expr/CaptureListExpr.qll @@ -1,5 +1,11 @@ private import codeql.swift.generated.expr.CaptureListExpr +private import codeql.swift.elements.decl.VarDecl +private import codeql.swift.elements.pattern.NamedPattern class CaptureListExpr extends Generated::CaptureListExpr { override string toString() { result = this.getClosureBody().toString() } + + override VarDecl getVariable(int index) { + result = this.getBindingDecl(index).getPattern(0).(NamedPattern).getVarDecl() + } } diff --git a/swift/ql/lib/codeql/swift/generated/Raw.qll b/swift/ql/lib/codeql/swift/generated/Raw.qll index 4a1a4dcbad4..00693018cf1 100644 --- a/swift/ql/lib/codeql/swift/generated/Raw.qll +++ b/swift/ql/lib/codeql/swift/generated/Raw.qll @@ -1103,11 +1103,6 @@ module Raw { capture_list_expr_binding_decls(this, index, result) } - /** - * Gets the `index`th variable of this capture list expression (0-based). - */ - VarDecl getVariable(int index) { capture_list_expr_variables(this, index, result) } - /** * Gets the closure body of this capture list expression. */ diff --git a/swift/ql/lib/codeql/swift/generated/expr/CaptureListExpr.qll b/swift/ql/lib/codeql/swift/generated/expr/CaptureListExpr.qll index e2aeb2f9ffd..828d99637d8 100644 --- a/swift/ql/lib/codeql/swift/generated/expr/CaptureListExpr.qll +++ b/swift/ql/lib/codeql/swift/generated/expr/CaptureListExpr.qll @@ -32,13 +32,10 @@ module Generated { /** * Gets the `index`th variable of this capture list expression (0-based). + * + * These are the variables introduced by this capture in the closure's scope, not the captured ones. */ - VarDecl getVariable(int index) { - result = - Synth::convertVarDeclFromRaw(Synth::convertCaptureListExprToRaw(this) - .(Raw::CaptureListExpr) - .getVariable(index)) - } + VarDecl getVariable(int index) { none() } /** * Gets any of the variables of this capture list expression. diff --git a/swift/ql/lib/swift.dbscheme b/swift/ql/lib/swift.dbscheme index afa3da98ec1..7c17e1f4b2d 100644 --- a/swift/ql/lib/swift.dbscheme +++ b/swift/ql/lib/swift.dbscheme @@ -846,13 +846,6 @@ capture_list_expr_binding_decls( //dir=expr int binding_decl: @pattern_binding_decl_or_none ref ); -#keyset[id, index] -capture_list_expr_variables( //dir=expr - int id: @capture_list_expr ref, - int index: int ref, - int variable: @var_decl_or_none ref -); - @closure_expr = @auto_closure_expr | @explicit_closure_expr diff --git a/swift/schema.py b/swift/schema.py index b74103a283a..c46a2e4552d 100644 --- a/swift/schema.py +++ b/swift/schema.py @@ -411,7 +411,9 @@ class CapturedDecl(Decl): class CaptureListExpr(Expr): binding_decls: list[PatternBindingDecl] | child - variables: list[VarDecl] | child + variables: list[VarDecl] | child | synth | desc(""" + These are the variables introduced by this capture in the closure's scope, not the captured ones. + """) closure_body: "ClosureExpr" | child class CollectionExpr(Expr):