Swift: extract OverloadedDeclRefExpr

This commit is contained in:
Paolo Tranquilli
2022-11-09 16:06:23 +01:00
parent 5f8e7e67b4
commit 4770ad3177
20 changed files with 109 additions and 72 deletions

View File

@@ -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> { \

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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 { }

View File

@@ -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)

View File

@@ -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" }
}

View File

@@ -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)

View File

@@ -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 { }
}

View File

@@ -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()) }
}
}

View File

@@ -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
);

View File

@@ -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

View File

@@ -0,0 +1 @@
| overloaded.swift:6:5:6:5 | OverloadedDeclRefExpr |

View File

@@ -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

View File

@@ -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(_:) |

View File

@@ -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)

View File

@@ -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()

View File

@@ -0,0 +1,6 @@
//codeql-extractor-expected-status: 1
func foo() {}
func foo(_: Int) {}
_ = foo

View File

@@ -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