mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Swift: extract types for patterns
This commit is contained in:
@@ -3,40 +3,42 @@
|
||||
namespace codeql {
|
||||
|
||||
codeql::NamedPattern PatternTranslator::translateNamedPattern(const swift::NamedPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.name = pattern.getNameStr().str();
|
||||
entry.var_decl = dispatcher.fetchLabel(pattern.getDecl());
|
||||
return entry;
|
||||
}
|
||||
|
||||
codeql::TypedPattern PatternTranslator::translateTypedPattern(const swift::TypedPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
|
||||
entry.type_repr = dispatcher.fetchOptionalLabel(pattern.getTypeRepr(), pattern.getType());
|
||||
return entry;
|
||||
}
|
||||
|
||||
codeql::TuplePattern PatternTranslator::translateTuplePattern(const swift::TuplePattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
for (const auto& p : pattern.getElements()) {
|
||||
entry.elements.push_back(dispatcher.fetchLabel(p.getPattern()));
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
codeql::AnyPattern PatternTranslator::translateAnyPattern(const swift::AnyPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
return entry;
|
||||
}
|
||||
|
||||
codeql::BindingPattern PatternTranslator::translateBindingPattern(
|
||||
const swift::BindingPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
|
||||
return entry;
|
||||
}
|
||||
|
||||
codeql::EnumElementPattern PatternTranslator::translateEnumElementPattern(
|
||||
const swift::EnumElementPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.element = dispatcher.fetchLabel(pattern.getElementDecl());
|
||||
entry.sub_pattern = dispatcher.fetchOptionalLabel(pattern.getSubPattern());
|
||||
return entry;
|
||||
@@ -44,13 +46,13 @@ codeql::EnumElementPattern PatternTranslator::translateEnumElementPattern(
|
||||
|
||||
codeql::OptionalSomePattern PatternTranslator::translateOptionalSomePattern(
|
||||
const swift::OptionalSomePattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
|
||||
return entry;
|
||||
}
|
||||
|
||||
codeql::IsPattern PatternTranslator::translateIsPattern(const swift::IsPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.cast_type_repr =
|
||||
dispatcher.fetchOptionalLabel(pattern.getCastTypeRepr(), pattern.getCastType());
|
||||
entry.sub_pattern = dispatcher.fetchOptionalLabel(pattern.getSubPattern());
|
||||
@@ -58,7 +60,7 @@ codeql::IsPattern PatternTranslator::translateIsPattern(const swift::IsPattern&
|
||||
}
|
||||
|
||||
codeql::ExprPattern PatternTranslator::translateExprPattern(const swift::ExprPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
if (auto match = pattern.getMatchExpr()) {
|
||||
entry.sub_expr = dispatcher.fetchLabel(match);
|
||||
} else {
|
||||
@@ -68,13 +70,13 @@ codeql::ExprPattern PatternTranslator::translateExprPattern(const swift::ExprPat
|
||||
}
|
||||
|
||||
codeql::ParenPattern PatternTranslator::translateParenPattern(const swift::ParenPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.sub_pattern = dispatcher.fetchLabel(pattern.getSubPattern());
|
||||
return entry;
|
||||
}
|
||||
|
||||
codeql::BoolPattern PatternTranslator::translateBoolPattern(const swift::BoolPattern& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
auto entry = createPatternEntry(pattern);
|
||||
entry.value = pattern.getValue();
|
||||
return entry;
|
||||
}
|
||||
|
||||
@@ -23,5 +23,13 @@ class PatternTranslator : public AstTranslatorBase<PatternTranslator> {
|
||||
codeql::ExprPattern translateExprPattern(const swift::ExprPattern& pattern);
|
||||
codeql::ParenPattern translateParenPattern(const swift::ParenPattern& pattern);
|
||||
codeql::BoolPattern translateBoolPattern(const swift::BoolPattern& pattern);
|
||||
|
||||
private:
|
||||
template <typename T>
|
||||
TrapClassOf<T> createPatternEntry(const T& pattern) {
|
||||
auto entry = dispatcher.createEntry(pattern);
|
||||
entry.type = dispatcher.fetchOptionalLabel(pattern.getType());
|
||||
return entry;
|
||||
}
|
||||
};
|
||||
} // namespace codeql
|
||||
|
||||
6
swift/ql/.generated.list
generated
6
swift/ql/.generated.list
generated
@@ -407,10 +407,10 @@ lib/codeql/swift/generated/Locatable.qll 6cb437dd7ff7331429ec6586b0af50b1af15e4f
|
||||
lib/codeql/swift/generated/Location.qll 3f3bad413be87d05a596fe7b8004f415c2caa98cb759021a6aad20b589b7d700 ed30ed646962b3ffb6b47c97c6434fe47a6b1ea8e3f2e0589577bea5cf96c88e
|
||||
lib/codeql/swift/generated/MacroRole.qll aaf5631c49de81e046854955341202d6d3516713cd09bc2e7b870e40c261cc9f 6cd17d40cbf1d8fa4ef01dfb8b3462b7cee902e6058fb76417c2035be12481d1
|
||||
lib/codeql/swift/generated/OtherAvailabilitySpec.qll 06393a08e8da36106c5ec6efb9f1bd56a5c7b3d3f3d0bcefc6fa07fa96860c31 06393a08e8da36106c5ec6efb9f1bd56a5c7b3d3f3d0bcefc6fa07fa96860c31
|
||||
lib/codeql/swift/generated/ParentChild.qll 281ac5b565c0d8b2c9cfc1a524024e3a2514034a5266b7a7d75ab3770fc398d3 2829f5e61adbd863f4ad823ecfd7c1bb5eccaf14bb121b85ad460175b733fe30
|
||||
lib/codeql/swift/generated/ParentChild.qll 523f0fdf11a8007a80b35d7f8b99f736face08513311c8e998ca20ae1e535ebe 2829f5e61adbd863f4ad823ecfd7c1bb5eccaf14bb121b85ad460175b733fe30
|
||||
lib/codeql/swift/generated/PlatformVersionAvailabilitySpec.qll 5355be9da8b778d1d8ae60d25d9c3394477da24f94e8a6ab4484c6a16d07cd7c 075438c1762ec0a7775004b39032dcf85aada038a4269e6f428c34b8282786e9
|
||||
lib/codeql/swift/generated/PureSynthConstructors.qll 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229 40f5c0c573ce12f16322d9efb12306750f672254cbc36a200c298cb08e504229
|
||||
lib/codeql/swift/generated/Raw.qll 1915a5a46c0ba57ebc8a0e41c4e49e3f3d9ee21cd863d1c9a8a0a455e5e9e24a 04f4a7eb8deb7f501e4a98563283094e1d53f8f0f8c82809ed05a5e99dff6787
|
||||
lib/codeql/swift/generated/Raw.qll 252bb96829d1c284ec8036e54f14db83d5a3c9be1c2bdc05bc7add7cf46ca618 4cdc6643270b2fc78805635a738dfd506bdee9dc770bc74ec66558c1efff7697
|
||||
lib/codeql/swift/generated/Synth.qll b8bf274c60f60df473ed9093b50906822613dee047bda19ad37d07c308f04564 692590b0b18556a23cc1de0c8a60fd17534791dccb876cab85170bbf78392bd1
|
||||
lib/codeql/swift/generated/SynthConstructors.qll d3b4b5d93be989004d7c05bbc32a5b859eaad768b4a52cfb01a767c90542f9a4 d3b4b5d93be989004d7c05bbc32a5b859eaad768b4a52cfb01a767c90542f9a4
|
||||
lib/codeql/swift/generated/UnknownFile.qll 5325944cf96a72d5d224597745e15960fb6a9448b96b6644ececd6344dfd9d74 5325944cf96a72d5d224597745e15960fb6a9448b96b6644ececd6344dfd9d74
|
||||
@@ -598,7 +598,7 @@ lib/codeql/swift/generated/pattern/IsPattern.qll e7f07b8788fa9146222bd2a11ee95ff
|
||||
lib/codeql/swift/generated/pattern/NamedPattern.qll fe1a2a14423410c58bdfff496c50bbaf3990420ee72f3924d7bc190c9aee8dec a4acf22a77764575e1e7351dc99c682e9dba3df79adaeae1c716d4305b1e5fb9
|
||||
lib/codeql/swift/generated/pattern/OptionalSomePattern.qll 91dacbff67ce93fac560eee6991729e12f00b768f3d55d8423840478f0aa10f6 3dab75289fe8e90eed5ddaad9b8064ffd4c5d74c25a6fa929d4406212f7371ca
|
||||
lib/codeql/swift/generated/pattern/ParenPattern.qll 91d0cfe2cc1b1f321e252798469fb8f0dfcca91c8b1e1a120f3ffef317ef1391 ee1ceaa127d4fd5826e637f741d3a90fa9cf474ee8d4a4fdf39b4e680b7d7111
|
||||
lib/codeql/swift/generated/pattern/Pattern.qll 09438ac3d6a84171b2d3b98d9a2331c0f5c14c9ef5df4cd5bc6650bd6a246032 f1ba81c3f87a71da3be416735026ff0e476ed74f017dced77a1cc78dfc0e2e68
|
||||
lib/codeql/swift/generated/pattern/Pattern.qll 4da3547291a5078cc5c9d607440dd814a123302517087aa85b3c2f8da0437dbb 0ef78e49d9ec683559bf42fd5b3335a66a063afb29db6fc61467c703323cded4
|
||||
lib/codeql/swift/generated/pattern/TuplePattern.qll d3477149a849f6e6076967d8369de531f9047ad0b8fa50081b9575337a8b97ea 8ae46d5e763e23e88a24b95731caa940f7b476a54d41f7fd35856266209a397a
|
||||
lib/codeql/swift/generated/pattern/TypedPattern.qll 5831d67d800c60619de0043f61ba316fa8f3c6b6c135c7efbbabd918bf30d455 e6867d3501168c2953db83f3a69fd327b366a5e4038916afabdc7997b0c743bd
|
||||
lib/codeql/swift/generated/stmt/BraceStmt.qll 8ba805c9798a7b5c83b30230f9eec5ad991fdbb0dc6060a15e7dd36579433cf2 7104211507d4f64056cf698d282778d68224240e79674085d1165fd25197fa92
|
||||
|
||||
7
swift/ql/lib/codeql/swift/generated/Raw.qll
generated
7
swift/ql/lib/codeql/swift/generated/Raw.qll
generated
@@ -2552,7 +2552,12 @@ module Raw {
|
||||
/**
|
||||
* INTERNAL: Do not use.
|
||||
*/
|
||||
class Pattern extends @pattern, AstNode { }
|
||||
class Pattern extends @pattern, AstNode {
|
||||
/**
|
||||
* Gets the type of this pattern, if it exists.
|
||||
*/
|
||||
Type getType() { pattern_types(this, result) }
|
||||
}
|
||||
|
||||
/**
|
||||
* INTERNAL: Do not use.
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
private import codeql.swift.generated.Synth
|
||||
private import codeql.swift.generated.Raw
|
||||
import codeql.swift.elements.AstNode
|
||||
import codeql.swift.elements.type.Type
|
||||
|
||||
/**
|
||||
* INTERNAL: This module contains the fully generated definition of `Pattern` and should not
|
||||
@@ -17,5 +18,30 @@ module Generated {
|
||||
* INTERNAL: Do not reference the `Generated::Pattern` class directly.
|
||||
* Use the subclass `Pattern`, where the following predicates are available.
|
||||
*/
|
||||
class Pattern extends Synth::TPattern, AstNode { }
|
||||
class Pattern extends Synth::TPattern, AstNode {
|
||||
/**
|
||||
* Gets the type of this pattern, if it exists.
|
||||
*
|
||||
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
|
||||
* behavior of both the `Immediate` and non-`Immediate` versions.
|
||||
*/
|
||||
Type getImmediateType() {
|
||||
result = Synth::convertTypeFromRaw(Synth::convertPatternToRaw(this).(Raw::Pattern).getType())
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the type of this pattern, if it exists.
|
||||
*/
|
||||
final Type getType() {
|
||||
exists(Type immediate |
|
||||
immediate = this.getImmediateType() and
|
||||
if exists(this.getResolveStep()) then result = immediate else result = immediate.resolve()
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if `getType()` exists.
|
||||
*/
|
||||
final predicate hasType() { exists(this.getType()) }
|
||||
}
|
||||
}
|
||||
|
||||
6
swift/ql/lib/swift.dbscheme
generated
6
swift/ql/lib/swift.dbscheme
generated
@@ -1706,6 +1706,12 @@ integer_literal_exprs( //dir=expr
|
||||
| @typed_pattern
|
||||
;
|
||||
|
||||
#keyset[id]
|
||||
pattern_types( //dir=pattern
|
||||
int id: @pattern ref,
|
||||
int type_: @type_or_none ref
|
||||
);
|
||||
|
||||
any_patterns( //dir=pattern
|
||||
unique int id: @any_pattern
|
||||
);
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
<dbstats>
|
||||
<typesizes />
|
||||
<stats />
|
||||
</dbstats>
|
||||
@@ -103,7 +103,7 @@ class Expr(AstNode):
|
||||
@group("pattern")
|
||||
@ql.hideable
|
||||
class Pattern(AstNode):
|
||||
pass
|
||||
type: optional[Type]
|
||||
|
||||
@group("stmt")
|
||||
class Stmt(AstNode):
|
||||
|
||||
Reference in New Issue
Block a user