mirror of
https://github.com/github/codeql.git
synced 2026-04-30 19:26:02 +02:00
Swift: extract OverloadedDeclRefExpr
This commit is contained in:
@@ -16,6 +16,9 @@ using SILBoxTypeTag = SilBoxTypeTag;
|
||||
using SILFunctionTypeTag = SilFunctionTypeTag;
|
||||
using SILTokenTypeTag = SilTokenTypeTag;
|
||||
|
||||
// OverloadSetRefExpr is collapsed with its only derived class OverloadedDeclRefExpr
|
||||
using OverloadSetRefExprTag = OverloadedDeclRefExprTag;
|
||||
|
||||
#define MAP_TYPE_TO_TAG(TYPE, TAG) \
|
||||
template <> \
|
||||
struct detail::ToTagFunctor<TYPE> { \
|
||||
|
||||
@@ -537,5 +537,11 @@ codeql::ObjectLiteralExpr ExprTranslator::translateObjectLiteralExpr(
|
||||
}
|
||||
return entry;
|
||||
}
|
||||
codeql::OverloadedDeclRefExpr ExprTranslator::translateOverloadedDeclRefExpr(
|
||||
const swift::OverloadedDeclRefExpr& expr) {
|
||||
auto entry = createExprEntry(expr);
|
||||
entry.possible_declarations = dispatcher.fetchRepeatedLabels(expr.getDecls());
|
||||
return entry;
|
||||
}
|
||||
|
||||
} // namespace codeql
|
||||
|
||||
@@ -103,6 +103,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
|
||||
codeql::UnresolvedPatternExpr translateUnresolvedPatternExpr(
|
||||
const swift::UnresolvedPatternExpr& expr);
|
||||
codeql::ObjectLiteralExpr translateObjectLiteralExpr(const swift::ObjectLiteralExpr& expr);
|
||||
codeql::OverloadedDeclRefExpr translateOverloadedDeclRefExpr(
|
||||
const swift::OverloadedDeclRefExpr& expr);
|
||||
|
||||
private:
|
||||
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,
|
||||
|
||||
@@ -150,7 +150,6 @@ import codeql.swift.elements.expr.OpenExistentialExpr
|
||||
import codeql.swift.elements.expr.OptionalEvaluationExpr
|
||||
import codeql.swift.elements.expr.OptionalTryExpr
|
||||
import codeql.swift.elements.expr.OtherConstructorDeclRefExpr
|
||||
import codeql.swift.elements.expr.OverloadSetRefExpr
|
||||
import codeql.swift.elements.expr.OverloadedDeclRefExpr
|
||||
import codeql.swift.elements.expr.PackExpr
|
||||
import codeql.swift.elements.expr.ParenExpr
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
|
||||
private import codeql.swift.generated.expr.OverloadSetRefExpr
|
||||
|
||||
class OverloadSetRefExpr extends Generated::OverloadSetRefExpr { }
|
||||
@@ -1592,8 +1592,8 @@ private module Impl {
|
||||
)
|
||||
}
|
||||
|
||||
private Element getImmediateChildOfOverloadSetRefExpr(
|
||||
OverloadSetRefExpr e, int index, string partialPredicateCall
|
||||
private Element getImmediateChildOfOverloadedDeclRefExpr(
|
||||
OverloadedDeclRefExpr e, int index, string partialPredicateCall
|
||||
) {
|
||||
exists(int b, int bExpr, int n |
|
||||
b = 0 and
|
||||
@@ -2621,22 +2621,6 @@ private module Impl {
|
||||
)
|
||||
}
|
||||
|
||||
private Element getImmediateChildOfOverloadedDeclRefExpr(
|
||||
OverloadedDeclRefExpr e, int index, string partialPredicateCall
|
||||
) {
|
||||
exists(int b, int bOverloadSetRefExpr, int n |
|
||||
b = 0 and
|
||||
bOverloadSetRefExpr =
|
||||
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfOverloadSetRefExpr(e, i, _)) | i) and
|
||||
n = bOverloadSetRefExpr and
|
||||
(
|
||||
none()
|
||||
or
|
||||
result = getImmediateChildOfOverloadSetRefExpr(e, index - b, partialPredicateCall)
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
private Element getImmediateChildOfParenExpr(ParenExpr e, int index, string partialPredicateCall) {
|
||||
exists(int b, int bIdentityExpr, int n |
|
||||
b = 0 and
|
||||
@@ -5028,6 +5012,8 @@ private module Impl {
|
||||
or
|
||||
result = getImmediateChildOfOtherConstructorDeclRefExpr(e, index, partialAccessor)
|
||||
or
|
||||
result = getImmediateChildOfOverloadedDeclRefExpr(e, index, partialAccessor)
|
||||
or
|
||||
result = getImmediateChildOfPackExpr(e, index, partialAccessor)
|
||||
or
|
||||
result = getImmediateChildOfPropertyWrapperValuePlaceholderExpr(e, index, partialAccessor)
|
||||
@@ -5140,8 +5126,6 @@ private module Impl {
|
||||
or
|
||||
result = getImmediateChildOfOptionalTryExpr(e, index, partialAccessor)
|
||||
or
|
||||
result = getImmediateChildOfOverloadedDeclRefExpr(e, index, partialAccessor)
|
||||
or
|
||||
result = getImmediateChildOfParenExpr(e, index, partialAccessor)
|
||||
or
|
||||
result = getImmediateChildOfPointerToPointerExpr(e, index, partialAccessor)
|
||||
|
||||
@@ -547,7 +547,13 @@ module Raw {
|
||||
ConstructorDecl getConstructorDecl() { other_constructor_decl_ref_exprs(this, result) }
|
||||
}
|
||||
|
||||
class OverloadSetRefExpr extends @overload_set_ref_expr, Expr { }
|
||||
class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, Expr {
|
||||
override string toString() { result = "OverloadedDeclRefExpr" }
|
||||
|
||||
ValueDecl getPossibleDeclaration(int index) {
|
||||
overloaded_decl_ref_expr_possible_declarations(this, index, result)
|
||||
}
|
||||
}
|
||||
|
||||
class PackExpr extends @pack_expr, Expr {
|
||||
override string toString() { result = "PackExpr" }
|
||||
@@ -849,10 +855,6 @@ module Raw {
|
||||
override string toString() { result = "OptionalTryExpr" }
|
||||
}
|
||||
|
||||
class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, OverloadSetRefExpr {
|
||||
override string toString() { result = "OverloadedDeclRefExpr" }
|
||||
}
|
||||
|
||||
class ParenExpr extends @paren_expr, IdentityExpr {
|
||||
override string toString() { result = "ParenExpr" }
|
||||
}
|
||||
|
||||
@@ -390,7 +390,7 @@ module Synth {
|
||||
TKeyPathDotExpr or TKeyPathExpr or TLazyInitializerExpr or TLiteralExpr or TLookupExpr or
|
||||
TMakeTemporarilyEscapableExpr or TObjCSelectorExpr or TOneWayExpr or TOpaqueValueExpr or
|
||||
TOpenExistentialExpr or TOptionalEvaluationExpr or TOtherConstructorDeclRefExpr or
|
||||
TOverloadSetRefExpr or TPackExpr or TPropertyWrapperValuePlaceholderExpr or
|
||||
TOverloadedDeclRefExpr or TPackExpr or TPropertyWrapperValuePlaceholderExpr or
|
||||
TRebindSelfInConstructorExpr or TSequenceExpr or TSuperRefExpr or TTapExpr or
|
||||
TTupleElementExpr or TTupleExpr or TTypeExpr or TUnresolvedDeclRefExpr or
|
||||
TUnresolvedDotExpr or TUnresolvedMemberExpr or TUnresolvedPatternExpr or
|
||||
@@ -422,8 +422,6 @@ module Synth {
|
||||
|
||||
class TNumberLiteralExpr = TFloatLiteralExpr or TIntegerLiteralExpr;
|
||||
|
||||
class TOverloadSetRefExpr = TOverloadedDeclRefExpr;
|
||||
|
||||
class TSelfApplyExpr = TConstructorRefCallExpr or TDotSyntaxCallExpr;
|
||||
|
||||
class TPattern =
|
||||
@@ -1781,7 +1779,7 @@ module Synth {
|
||||
or
|
||||
result = convertOtherConstructorDeclRefExprFromRaw(e)
|
||||
or
|
||||
result = convertOverloadSetRefExprFromRaw(e)
|
||||
result = convertOverloadedDeclRefExprFromRaw(e)
|
||||
or
|
||||
result = convertPackExprFromRaw(e)
|
||||
or
|
||||
@@ -1923,11 +1921,6 @@ module Synth {
|
||||
result = convertIntegerLiteralExprFromRaw(e)
|
||||
}
|
||||
|
||||
cached
|
||||
TOverloadSetRefExpr convertOverloadSetRefExprFromRaw(Raw::Element e) {
|
||||
result = convertOverloadedDeclRefExprFromRaw(e)
|
||||
}
|
||||
|
||||
cached
|
||||
TSelfApplyExpr convertSelfApplyExprFromRaw(Raw::Element e) {
|
||||
result = convertConstructorRefCallExprFromRaw(e)
|
||||
@@ -3491,7 +3484,7 @@ module Synth {
|
||||
or
|
||||
result = convertOtherConstructorDeclRefExprToRaw(e)
|
||||
or
|
||||
result = convertOverloadSetRefExprToRaw(e)
|
||||
result = convertOverloadedDeclRefExprToRaw(e)
|
||||
or
|
||||
result = convertPackExprToRaw(e)
|
||||
or
|
||||
@@ -3633,11 +3626,6 @@ module Synth {
|
||||
result = convertIntegerLiteralExprToRaw(e)
|
||||
}
|
||||
|
||||
cached
|
||||
Raw::Element convertOverloadSetRefExprToRaw(TOverloadSetRefExpr e) {
|
||||
result = convertOverloadedDeclRefExprToRaw(e)
|
||||
}
|
||||
|
||||
cached
|
||||
Raw::Element convertSelfApplyExprToRaw(TSelfApplyExpr e) {
|
||||
result = convertConstructorRefCallExprToRaw(e)
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
// generated by codegen/codegen.py
|
||||
private import codeql.swift.generated.Synth
|
||||
private import codeql.swift.generated.Raw
|
||||
import codeql.swift.elements.expr.Expr
|
||||
|
||||
module Generated {
|
||||
class OverloadSetRefExpr extends Synth::TOverloadSetRefExpr, Expr { }
|
||||
}
|
||||
@@ -1,10 +1,45 @@
|
||||
// generated by codegen/codegen.py
|
||||
private import codeql.swift.generated.Synth
|
||||
private import codeql.swift.generated.Raw
|
||||
import codeql.swift.elements.expr.OverloadSetRefExpr
|
||||
import codeql.swift.elements.expr.Expr
|
||||
import codeql.swift.elements.decl.ValueDecl
|
||||
|
||||
module Generated {
|
||||
class OverloadedDeclRefExpr extends Synth::TOverloadedDeclRefExpr, OverloadSetRefExpr {
|
||||
/**
|
||||
* An ambiguous expression that might refer to multiple declarations. This will be present only
|
||||
* for failing compilations.
|
||||
*/
|
||||
class OverloadedDeclRefExpr extends Synth::TOverloadedDeclRefExpr, Expr {
|
||||
override string getAPrimaryQlClass() { result = "OverloadedDeclRefExpr" }
|
||||
|
||||
/**
|
||||
* Gets the `index`th possible declaration of this overloaded declaration ref expression (0-based).
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
ValueDecl getImmediatePossibleDeclaration(int index) {
|
||||
result =
|
||||
Synth::convertValueDeclFromRaw(Synth::convertOverloadedDeclRefExprToRaw(this)
|
||||
.(Raw::OverloadedDeclRefExpr)
|
||||
.getPossibleDeclaration(index))
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the `index`th possible declaration of this overloaded declaration ref expression (0-based).
|
||||
*/
|
||||
final ValueDecl getPossibleDeclaration(int index) {
|
||||
result = getImmediatePossibleDeclaration(index).resolve()
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets any of the possible declarations of this overloaded declaration ref expression.
|
||||
*/
|
||||
final ValueDecl getAPossibleDeclaration() { result = getPossibleDeclaration(_) }
|
||||
|
||||
/**
|
||||
* Gets the number of possible declarations of this overloaded declaration ref expression.
|
||||
*/
|
||||
final int getNumberOfPossibleDeclarations() { result = count(getAPossibleDeclaration()) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -622,7 +622,7 @@ arguments( //dir=expr
|
||||
| @open_existential_expr
|
||||
| @optional_evaluation_expr
|
||||
| @other_constructor_decl_ref_expr
|
||||
| @overload_set_ref_expr
|
||||
| @overloaded_decl_ref_expr
|
||||
| @pack_expr
|
||||
| @property_wrapper_value_placeholder_expr
|
||||
| @rebind_self_in_constructor_expr
|
||||
@@ -971,9 +971,16 @@ other_constructor_decl_ref_exprs( //dir=expr
|
||||
int constructor_decl: @constructor_decl_or_none ref
|
||||
);
|
||||
|
||||
@overload_set_ref_expr =
|
||||
@overloaded_decl_ref_expr
|
||||
;
|
||||
overloaded_decl_ref_exprs( //dir=expr
|
||||
unique int id: @overloaded_decl_ref_expr
|
||||
);
|
||||
|
||||
#keyset[id, index]
|
||||
overloaded_decl_ref_expr_possible_declarations( //dir=expr
|
||||
int id: @overloaded_decl_ref_expr ref,
|
||||
int index: int ref,
|
||||
int possible_declaration: @value_decl_or_none ref
|
||||
);
|
||||
|
||||
pack_exprs( //dir=expr
|
||||
unique int id: @pack_expr
|
||||
@@ -1322,10 +1329,6 @@ optional_try_exprs( //dir=expr
|
||||
unique int id: @optional_try_expr
|
||||
);
|
||||
|
||||
overloaded_decl_ref_exprs( //dir=expr
|
||||
unique int id: @overloaded_decl_ref_expr
|
||||
);
|
||||
|
||||
paren_exprs( //dir=expr
|
||||
unique int id: @paren_expr
|
||||
);
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
// generated by codegen/codegen.py
|
||||
|
||||
After a swift source file is added in this directory and codegen/codegen.py is run again, test queries
|
||||
will appear and this file will be deleted
|
||||
@@ -0,0 +1 @@
|
||||
| overloaded.swift:6:5:6:5 | OverloadedDeclRefExpr |
|
||||
@@ -0,0 +1,7 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from OverloadedDeclRefExpr x
|
||||
where toBeTested(x) and not x.isUnknown()
|
||||
select x
|
||||
@@ -0,0 +1,2 @@
|
||||
| overloaded.swift:6:5:6:5 | OverloadedDeclRefExpr | 0 | overloaded.swift:3:1:3:13 | foo() |
|
||||
| overloaded.swift:6:5:6:5 | OverloadedDeclRefExpr | 1 | overloaded.swift:4:1:4:19 | foo(_:) |
|
||||
@@ -0,0 +1,7 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from OverloadedDeclRefExpr x, int index
|
||||
where toBeTested(x) and not x.isUnknown()
|
||||
select x, index, x.getPossibleDeclaration(index)
|
||||
@@ -0,0 +1,7 @@
|
||||
// generated by codegen/codegen.py
|
||||
import codeql.swift.elements
|
||||
import TestUtils
|
||||
|
||||
from OverloadedDeclRefExpr x
|
||||
where toBeTested(x) and not x.isUnknown()
|
||||
select x, x.getType()
|
||||
@@ -0,0 +1,6 @@
|
||||
//codeql-extractor-expected-status: 1
|
||||
|
||||
func foo() {}
|
||||
func foo(_: Int) {}
|
||||
|
||||
_ = foo
|
||||
@@ -397,9 +397,6 @@ class OptionalEvaluationExpr(Expr):
|
||||
class OtherConstructorDeclRefExpr(Expr):
|
||||
constructor_decl: ConstructorDecl
|
||||
|
||||
class OverloadSetRefExpr(Expr):
|
||||
pass
|
||||
|
||||
class PropertyWrapperValuePlaceholderExpr(Expr):
|
||||
pass
|
||||
|
||||
@@ -591,8 +588,12 @@ class ObjectLiteralExpr(LiteralExpr):
|
||||
class OptionalTryExpr(AnyTryExpr):
|
||||
pass
|
||||
|
||||
class OverloadedDeclRefExpr(OverloadSetRefExpr):
|
||||
pass
|
||||
class OverloadedDeclRefExpr(Expr):
|
||||
"""
|
||||
An ambiguous expression that might refer to multiple declarations. This will be present only
|
||||
for failing compilations.
|
||||
"""
|
||||
possible_declarations: list[ValueDecl]
|
||||
|
||||
class ParenExpr(IdentityExpr):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user