Swift: Make Callable a sub type of AstNode

This commit is contained in:
Tom Hvitved
2024-09-13 15:39:40 +02:00
parent 9250c29bd5
commit 4912ee8ab3
8 changed files with 115 additions and 114 deletions

View File

@@ -394,7 +394,7 @@ lib/codeql/swift/elements.qll bb863ff140bfaa0bf887708f421a16c85816886f4d061bbc5a
lib/codeql/swift/generated/AstNode.qll 68877daa9e14b462247ac6b7b724f5e683288e39953a8ebb02a362b7d1df8e4c 54d3512744738e1ee15645f3af116437053cb5209687f4106361a1943b38b666 lib/codeql/swift/generated/AstNode.qll 68877daa9e14b462247ac6b7b724f5e683288e39953a8ebb02a362b7d1df8e4c 54d3512744738e1ee15645f3af116437053cb5209687f4106361a1943b38b666
lib/codeql/swift/generated/AvailabilityInfo.qll e74e218a1ab00416cb8823610ff93642101aa784aa61cbc2b4deef61471a5bac e2c6c19860dc3e6e211041c95d8e6d52c3505ccff7018b80a849735cc98141af lib/codeql/swift/generated/AvailabilityInfo.qll e74e218a1ab00416cb8823610ff93642101aa784aa61cbc2b4deef61471a5bac e2c6c19860dc3e6e211041c95d8e6d52c3505ccff7018b80a849735cc98141af
lib/codeql/swift/generated/AvailabilitySpec.qll a8afc5071887a67b4e0dec27356ab8cbf3e176b5358cb34c785e3015b2cad5a2 c7f88b0d701612c821359c983b3102f31b23edc211c3dcfe97de5adec61af386 lib/codeql/swift/generated/AvailabilitySpec.qll a8afc5071887a67b4e0dec27356ab8cbf3e176b5358cb34c785e3015b2cad5a2 c7f88b0d701612c821359c983b3102f31b23edc211c3dcfe97de5adec61af386
lib/codeql/swift/generated/Callable.qll 967fcb4f24a31754ef3bfdd1ea1e585ee8dc7fca02c8f6a2db451df22b156e38 d2e2824119e1b01964851a58099e19f787d12402de8ebce278731433325a76e9 lib/codeql/swift/generated/Callable.qll d1a674575ec2edfeada622a5b34133101927b40714bdd6106f5f8b0708119c16 177e44bab51c105bc34925b06b18564b71a2c112e6fb700e47f1cc62fa03b483
lib/codeql/swift/generated/Comment.qll fea1b1eb97adcb9a1e5eee0a516240de7b0f0ffef55068c91dc13d29acd3a9a1 f2c8cf8ab5cd5daa67aae51bad4cd34a80a81c00220950476b2e91fd0808628d lib/codeql/swift/generated/Comment.qll fea1b1eb97adcb9a1e5eee0a516240de7b0f0ffef55068c91dc13d29acd3a9a1 f2c8cf8ab5cd5daa67aae51bad4cd34a80a81c00220950476b2e91fd0808628d
lib/codeql/swift/generated/DbFile.qll fc2f1cd370a6e67d0e0aeeb9ccd585ce6875064101a1385c2e456021728cfd53 fc2f1cd370a6e67d0e0aeeb9ccd585ce6875064101a1385c2e456021728cfd53 lib/codeql/swift/generated/DbFile.qll fc2f1cd370a6e67d0e0aeeb9ccd585ce6875064101a1385c2e456021728cfd53 fc2f1cd370a6e67d0e0aeeb9ccd585ce6875064101a1385c2e456021728cfd53
lib/codeql/swift/generated/DbLocation.qll 929f015202c9c5a8062c913c38ef069482e4f459606ce4e917d021c643cfc11d 929f015202c9c5a8062c913c38ef069482e4f459606ce4e917d021c643cfc11d lib/codeql/swift/generated/DbLocation.qll 929f015202c9c5a8062c913c38ef069482e4f459606ce4e917d021c643cfc11d 929f015202c9c5a8062c913c38ef069482e4f459606ce4e917d021c643cfc11d
@@ -407,11 +407,11 @@ lib/codeql/swift/generated/Locatable.qll 6cb437dd7ff7331429ec6586b0af50b1af15e4f
lib/codeql/swift/generated/Location.qll 3f3bad413be87d05a596fe7b8004f415c2caa98cb759021a6aad20b589b7d700 ed30ed646962b3ffb6b47c97c6434fe47a6b1ea8e3f2e0589577bea5cf96c88e lib/codeql/swift/generated/Location.qll 3f3bad413be87d05a596fe7b8004f415c2caa98cb759021a6aad20b589b7d700 ed30ed646962b3ffb6b47c97c6434fe47a6b1ea8e3f2e0589577bea5cf96c88e
lib/codeql/swift/generated/MacroRole.qll aaf5631c49de81e046854955341202d6d3516713cd09bc2e7b870e40c261cc9f 6cd17d40cbf1d8fa4ef01dfb8b3462b7cee902e6058fb76417c2035be12481d1 lib/codeql/swift/generated/MacroRole.qll aaf5631c49de81e046854955341202d6d3516713cd09bc2e7b870e40c261cc9f 6cd17d40cbf1d8fa4ef01dfb8b3462b7cee902e6058fb76417c2035be12481d1
lib/codeql/swift/generated/OtherAvailabilitySpec.qll 06393a08e8da36106c5ec6efb9f1bd56a5c7b3d3f3d0bcefc6fa07fa96860c31 06393a08e8da36106c5ec6efb9f1bd56a5c7b3d3f3d0bcefc6fa07fa96860c31 lib/codeql/swift/generated/OtherAvailabilitySpec.qll 06393a08e8da36106c5ec6efb9f1bd56a5c7b3d3f3d0bcefc6fa07fa96860c31 06393a08e8da36106c5ec6efb9f1bd56a5c7b3d3f3d0bcefc6fa07fa96860c31
lib/codeql/swift/generated/ParentChild.qll eae164aa8a78e883e707fba6c671ff2cd0ddab1084b0871fc5ae27c44cded4c5 3af88b63e21d58090f9702e6e4716a5b8a5a65897b8c92362b6e3c0fba60ddc2 lib/codeql/swift/generated/ParentChild.qll 9c93c47197f4d510dc0e6a619e15938dc9b31907a300fde2fc27906448422e08 b153266ec86d64414c0c5c6a8f051209937594d40964715e2145982173ef6854
lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll 5355be9da8b778d1d8ae60d25d9c3394477da24f94e8a6ab4484c6a16d07cd7c 075438c1762ec0a7775004b39032dcf85aada038a4269e6f428c34b8282786e9 lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll 5355be9da8b778d1d8ae60d25d9c3394477da24f94e8a6ab4484c6a16d07cd7c 075438c1762ec0a7775004b39032dcf85aada038a4269e6f428c34b8282786e9
lib/codeql/swift/generated/PureSynthConstructors.qll 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229 lib/codeql/swift/generated/PureSynthConstructors.qll 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229
lib/codeql/swift/generated/Raw.qll 10633b948918d315b98b6ff6733d4c368e082c5afd78334c0862291f9d883216 66abde4c9a2283773033d90a4633c1203d6563fc238ddbd48fdf1b910f90021a lib/codeql/swift/generated/Raw.qll 118b43fedd4265b5aa15c33ef01a2f5a5db6e5597f95bef1078a01c3ff8da983 075aec2c8b232f0361ebf63f07ae9b66163f3975e6023583fb0fa2e40b979a33
lib/codeql/swift/generated/Synth.qll 848284b2ae9854c5be74e5ef50a51090e248e5c9c02289a6bc63455e440122da e2607f46a4830e81718ca1636fa65bc29420a18539443d109fafd7f1af1591ce lib/codeql/swift/generated/Synth.qll 221f40afbc2bed0f5de1961877fd39dd025574bc72622af0e9f47f278a8324b7 05b8aaa9ac6236b0c08d6afc7a13e58361b90524cff6520a1ac6d422eea4fe40
lib/codeql/swift/generated/SynthConstructors.qll 7edffc30d3dddc4d73241f4e0d3df4501a99eb38d056f82043ed69e481404342 7edffc30d3dddc4d73241f4e0d3df4501a99eb38d056f82043ed69e481404342 lib/codeql/swift/generated/SynthConstructors.qll 7edffc30d3dddc4d73241f4e0d3df4501a99eb38d056f82043ed69e481404342 7edffc30d3dddc4d73241f4e0d3df4501a99eb38d056f82043ed69e481404342
lib/codeql/swift/generated/UnknownFile.qll 5325944cf96a72d5d224597745e15960fb6a9448b96b6644ececd6344dfd9d74 5325944cf96a72d5d224597745e15960fb6a9448b96b6644ececd6344dfd9d74 lib/codeql/swift/generated/UnknownFile.qll 5325944cf96a72d5d224597745e15960fb6a9448b96b6644ececd6344dfd9d74 5325944cf96a72d5d224597745e15960fb6a9448b96b6644ececd6344dfd9d74
lib/codeql/swift/generated/UnknownLocation.qll dfdeb8eedb2564eccaac416695784ea04fe9754a3e109e8484c695021af4e554 dfdeb8eedb2564eccaac416695784ea04fe9754a3e109e8484c695021af4e554 lib/codeql/swift/generated/UnknownLocation.qll dfdeb8eedb2564eccaac416695784ea04fe9754a3e109e8484c695021af4e554 dfdeb8eedb2564eccaac416695784ea04fe9754a3e109e8484c695021af4e554

View File

@@ -2,7 +2,7 @@ private import codeql.swift.generated.Callable
private import codeql.swift.elements.AstNode private import codeql.swift.elements.AstNode
private import codeql.swift.elements.decl.Decl private import codeql.swift.elements.decl.Decl
class Callable extends Generated::Callable, AstNode { class Callable extends Generated::Callable {
/** /**
* Holds if this Callable is a function named `funcName`. * Holds if this Callable is a function named `funcName`.
*/ */

View File

@@ -6,9 +6,9 @@
private import codeql.swift.generated.Synth private import codeql.swift.generated.Synth
private import codeql.swift.generated.Raw private import codeql.swift.generated.Raw
import codeql.swift.elements.AstNode
import codeql.swift.elements.stmt.BraceStmt import codeql.swift.elements.stmt.BraceStmt
import codeql.swift.elements.decl.CapturedDecl import codeql.swift.elements.decl.CapturedDecl
import codeql.swift.elements.Element
import codeql.swift.elements.decl.ParamDecl import codeql.swift.elements.decl.ParamDecl
/** /**
@@ -20,7 +20,7 @@ module Generated {
* INTERNAL: Do not reference the `Generated::Callable` class directly. * INTERNAL: Do not reference the `Generated::Callable` class directly.
* Use the subclass `Callable`, where the following predicates are available. * Use the subclass `Callable`, where the following predicates are available.
*/ */
class Callable extends Synth::TCallable, Element { class Callable extends Synth::TCallable, AstNode {
/** /**
* Gets the name of this callable, if it exists. * Gets the name of this callable, if it exists.
* *

View File

@@ -14,33 +14,6 @@ private module Impl {
none() none()
} }
private Element getImmediateChildOfCallable(Callable e, int index, string partialPredicateCall) {
exists(int b, int bElement, int n, int nSelfParam, int nParam, int nBody, int nCapture |
b = 0 and
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
n = bElement and
nSelfParam = n + 1 and
nParam = nSelfParam + 1 + max(int i | i = -1 or exists(e.getParam(i)) | i) and
nBody = nParam + 1 and
nCapture = nBody + 1 + max(int i | i = -1 or exists(e.getCapture(i)) | i) and
(
none()
or
result = getImmediateChildOfElement(e, index - b, partialPredicateCall)
or
index = n and result = e.getSelfParam() and partialPredicateCall = "SelfParam()"
or
result = e.getParam(index - nSelfParam) and
partialPredicateCall = "Param(" + (index - nSelfParam).toString() + ")"
or
index = nParam and result = e.getBody() and partialPredicateCall = "Body()"
or
result = e.getCapture(index - nBody) and
partialPredicateCall = "Capture(" + (index - nBody).toString() + ")"
)
)
}
private Element getImmediateChildOfFile(File e, int index, string partialPredicateCall) { private Element getImmediateChildOfFile(File e, int index, string partialPredicateCall) {
exists(int b, int bElement, int n | exists(int b, int bElement, int n |
b = 0 and b = 0 and
@@ -226,6 +199,33 @@ private module Impl {
) )
} }
private Element getImmediateChildOfCallable(Callable e, int index, string partialPredicateCall) {
exists(int b, int bAstNode, int n, int nSelfParam, int nParam, int nBody, int nCapture |
b = 0 and
bAstNode = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfAstNode(e, i, _)) | i) and
n = bAstNode and
nSelfParam = n + 1 and
nParam = nSelfParam + 1 + max(int i | i = -1 or exists(e.getParam(i)) | i) and
nBody = nParam + 1 and
nCapture = nBody + 1 + max(int i | i = -1 or exists(e.getCapture(i)) | i) and
(
none()
or
result = getImmediateChildOfAstNode(e, index - b, partialPredicateCall)
or
index = n and result = e.getSelfParam() and partialPredicateCall = "SelfParam()"
or
result = e.getParam(index - nSelfParam) and
partialPredicateCall = "Param(" + (index - nSelfParam).toString() + ")"
or
index = nParam and result = e.getBody() and partialPredicateCall = "Body()"
or
result = e.getCapture(index - nBody) and
partialPredicateCall = "Capture(" + (index - nBody).toString() + ")"
)
)
}
private Element getImmediateChildOfKeyPathComponent( private Element getImmediateChildOfKeyPathComponent(
KeyPathComponent e, int index, string partialPredicateCall KeyPathComponent e, int index, string partialPredicateCall
) { ) {

View File

@@ -15,40 +15,6 @@ module Raw {
predicate isUnknown() { element_is_unknown(this) } predicate isUnknown() { element_is_unknown(this) }
} }
/**
* INTERNAL: Do not use.
*/
class Callable extends @callable, Element {
/**
* Gets the name of this callable, if it exists.
*
* The name includes argument labels of the callable, for example `myFunction(arg:)`.
*/
string getName() { callable_names(this, result) }
/**
* Gets the self parameter of this callable, if it exists.
*/
ParamDecl getSelfParam() { callable_self_params(this, result) }
/**
* Gets the `index`th parameter of this callable (0-based).
*/
ParamDecl getParam(int index) { callable_params(this, index, result) }
/**
* Gets the body of this callable, if it exists.
*
* The body is absent within protocol declarations.
*/
BraceStmt getBody() { callable_bodies(this, result) }
/**
* Gets the `index`th capture of this callable (0-based).
*/
CapturedDecl getCapture(int index) { callable_captures(this, index, result) }
}
/** /**
* INTERNAL: Do not use. * INTERNAL: Do not use.
*/ */
@@ -197,6 +163,40 @@ module Raw {
*/ */
class AvailabilitySpec extends @availability_spec, AstNode { } class AvailabilitySpec extends @availability_spec, AstNode { }
/**
* INTERNAL: Do not use.
*/
class Callable extends @callable, AstNode {
/**
* Gets the name of this callable, if it exists.
*
* The name includes argument labels of the callable, for example `myFunction(arg:)`.
*/
string getName() { callable_names(this, result) }
/**
* Gets the self parameter of this callable, if it exists.
*/
ParamDecl getSelfParam() { callable_self_params(this, result) }
/**
* Gets the `index`th parameter of this callable (0-based).
*/
ParamDecl getParam(int index) { callable_params(this, index, result) }
/**
* Gets the body of this callable, if it exists.
*
* The body is absent within protocol declarations.
*/
BraceStmt getBody() { callable_bodies(this, result) }
/**
* Gets the `index`th capture of this callable (0-based).
*/
CapturedDecl getCapture(int index) { callable_captures(this, index, result) }
}
/** /**
* INTERNAL: Do not use. * INTERNAL: Do not use.
* A component of a `KeyPathExpr`. * A component of a `KeyPathExpr`.

View File

@@ -1080,8 +1080,9 @@ module Synth {
* INTERNAL: Do not use. * INTERNAL: Do not use.
*/ */
class TAstNode = class TAstNode =
TAvailabilityInfo or TAvailabilitySpec or TCaseLabelItem or TConditionElement or TDecl or TAvailabilityInfo or TAvailabilitySpec or TCallable or TCaseLabelItem or TConditionElement or
TExpr or TKeyPathComponent or TMacroRole or TPattern or TStmt or TStmtCondition or TTypeRepr; TDecl or TExpr or TKeyPathComponent or TMacroRole or TPattern or TStmt or TStmtCondition or
TTypeRepr;
/** /**
* INTERNAL: Do not use. * INTERNAL: Do not use.
@@ -3369,6 +3370,8 @@ module Synth {
or or
result = convertAvailabilitySpecFromRaw(e) result = convertAvailabilitySpecFromRaw(e)
or or
result = convertCallableFromRaw(e)
or
result = convertCaseLabelItemFromRaw(e) result = convertCaseLabelItemFromRaw(e)
or or
result = convertConditionElementFromRaw(e) result = convertConditionElementFromRaw(e)
@@ -3418,8 +3421,6 @@ module Synth {
*/ */
cached cached
TElement convertElementFromRaw(Raw::Element e) { TElement convertElementFromRaw(Raw::Element e) {
result = convertCallableFromRaw(e)
or
result = convertFileFromRaw(e) result = convertFileFromRaw(e)
or or
result = convertGenericContextFromRaw(e) result = convertGenericContextFromRaw(e)
@@ -6341,6 +6342,8 @@ module Synth {
or or
result = convertAvailabilitySpecToRaw(e) result = convertAvailabilitySpecToRaw(e)
or or
result = convertCallableToRaw(e)
or
result = convertCaseLabelItemToRaw(e) result = convertCaseLabelItemToRaw(e)
or or
result = convertConditionElementToRaw(e) result = convertConditionElementToRaw(e)
@@ -6390,8 +6393,6 @@ module Synth {
*/ */
cached cached
Raw::Element convertElementToRaw(TElement e) { Raw::Element convertElementToRaw(TElement e) {
result = convertCallableToRaw(e)
or
result = convertFileToRaw(e) result = convertFileToRaw(e)
or or
result = convertGenericContextToRaw(e) result = convertGenericContextToRaw(e)

View File

@@ -12,8 +12,7 @@ sourceLocationPrefix(
// from schema.py // from schema.py
@element = @element =
@callable @file
| @file
| @generic_context | @generic_context
| @locatable | @locatable
| @location | @location
@@ -25,43 +24,6 @@ element_is_unknown(
int id: @element ref int id: @element ref
); );
@callable =
@closure_expr
| @function
;
#keyset[id]
callable_names(
int id: @callable ref,
string name: string ref
);
#keyset[id]
callable_self_params(
int id: @callable ref,
int self_param: @param_decl_or_none ref
);
#keyset[id, index]
callable_params(
int id: @callable ref,
int index: int ref,
int param: @param_decl_or_none ref
);
#keyset[id]
callable_bodies(
int id: @callable ref,
int body: @brace_stmt_or_none ref
);
#keyset[id, index]
callable_captures(
int id: @callable ref,
int index: int ref,
int capture: @captured_decl_or_none ref
);
@file = @file =
@db_file @db_file
; ;
@@ -108,6 +70,7 @@ locations(
@ast_node = @ast_node =
@availability_info @availability_info
| @availability_spec | @availability_spec
| @callable
| @case_label_item | @case_label_item
| @condition_element | @condition_element
| @decl | @decl
@@ -175,6 +138,43 @@ availability_info_specs(
| @platform_version_availability_spec | @platform_version_availability_spec
; ;
@callable =
@closure_expr
| @function
;
#keyset[id]
callable_names(
int id: @callable ref,
string name: string ref
);
#keyset[id]
callable_self_params(
int id: @callable ref,
int self_param: @param_decl_or_none ref
);
#keyset[id, index]
callable_params(
int id: @callable ref,
int index: int ref,
int param: @param_decl_or_none ref
);
#keyset[id]
callable_bodies(
int id: @callable ref,
int body: @brace_stmt_or_none ref
);
#keyset[id, index]
callable_captures(
int id: @callable ref,
int index: int ref,
int capture: @captured_decl_or_none ref
);
key_path_components( key_path_components(
unique int id: @key_path_component, unique int id: @key_path_component,
int kind: int ref, int kind: int ref,

View File

@@ -242,7 +242,7 @@ class ParamDecl(VarDecl):
has a property wrapper. has a property wrapper.
""") """)
class Callable(Element): class Callable(AstNode):
name: optional[string] | doc("name of this callable") | desc("The name includes argument " name: optional[string] | doc("name of this callable") | desc("The name includes argument "
"labels of the callable, for example `myFunction(arg:)`.") "labels of the callable, for example `myFunction(arg:)`.")
self_param: optional[ParamDecl] | child self_param: optional[ParamDecl] | child