Skip to content

Commit 4770ad3

Browse files
committed
Swift: extract OverloadedDeclRefExpr
1 parent 5f8e7e6 commit 4770ad3

20 files changed

+109
-72
lines changed

swift/extractor/infra/SwiftTagTraits.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ using SILBoxTypeTag = SilBoxTypeTag;
1616
using SILFunctionTypeTag = SilFunctionTypeTag;
1717
using SILTokenTypeTag = SilTokenTypeTag;
1818

19+
// OverloadSetRefExpr is collapsed with its only derived class OverloadedDeclRefExpr
20+
using OverloadSetRefExprTag = OverloadedDeclRefExprTag;
21+
1922
#define MAP_TYPE_TO_TAG(TYPE, TAG) \
2023
template <> \
2124
struct detail::ToTagFunctor<TYPE> { \

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -537,5 +537,11 @@ codeql::ObjectLiteralExpr ExprTranslator::translateObjectLiteralExpr(
537537
}
538538
return entry;
539539
}
540+
codeql::OverloadedDeclRefExpr ExprTranslator::translateOverloadedDeclRefExpr(
541+
const swift::OverloadedDeclRefExpr& expr) {
542+
auto entry = createExprEntry(expr);
543+
entry.possible_declarations = dispatcher.fetchRepeatedLabels(expr.getDecls());
544+
return entry;
545+
}
540546

541547
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
103103
codeql::UnresolvedPatternExpr translateUnresolvedPatternExpr(
104104
const swift::UnresolvedPatternExpr& expr);
105105
codeql::ObjectLiteralExpr translateObjectLiteralExpr(const swift::ObjectLiteralExpr& expr);
106+
codeql::OverloadedDeclRefExpr translateOverloadedDeclRefExpr(
107+
const swift::OverloadedDeclRefExpr& expr);
106108

107109
private:
108110
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

swift/ql/lib/codeql/swift/elements.qll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ import codeql.swift.elements.expr.OpenExistentialExpr
150150
import codeql.swift.elements.expr.OptionalEvaluationExpr
151151
import codeql.swift.elements.expr.OptionalTryExpr
152152
import codeql.swift.elements.expr.OtherConstructorDeclRefExpr
153-
import codeql.swift.elements.expr.OverloadSetRefExpr
154153
import codeql.swift.elements.expr.OverloadedDeclRefExpr
155154
import codeql.swift.elements.expr.PackExpr
156155
import codeql.swift.elements.expr.ParenExpr

swift/ql/lib/codeql/swift/elements/expr/OverloadSetRefExpr.qll

Lines changed: 0 additions & 4 deletions
This file was deleted.

swift/ql/lib/codeql/swift/generated/ParentChild.qll

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1592,8 +1592,8 @@ private module Impl {
15921592
)
15931593
}
15941594

1595-
private Element getImmediateChildOfOverloadSetRefExpr(
1596-
OverloadSetRefExpr e, int index, string partialPredicateCall
1595+
private Element getImmediateChildOfOverloadedDeclRefExpr(
1596+
OverloadedDeclRefExpr e, int index, string partialPredicateCall
15971597
) {
15981598
exists(int b, int bExpr, int n |
15991599
b = 0 and
@@ -2621,22 +2621,6 @@ private module Impl {
26212621
)
26222622
}
26232623

2624-
private Element getImmediateChildOfOverloadedDeclRefExpr(
2625-
OverloadedDeclRefExpr e, int index, string partialPredicateCall
2626-
) {
2627-
exists(int b, int bOverloadSetRefExpr, int n |
2628-
b = 0 and
2629-
bOverloadSetRefExpr =
2630-
b + 1 + max(int i | i = -1 or exists(getImmediateChildOfOverloadSetRefExpr(e, i, _)) | i) and
2631-
n = bOverloadSetRefExpr and
2632-
(
2633-
none()
2634-
or
2635-
result = getImmediateChildOfOverloadSetRefExpr(e, index - b, partialPredicateCall)
2636-
)
2637-
)
2638-
}
2639-
26402624
private Element getImmediateChildOfParenExpr(ParenExpr e, int index, string partialPredicateCall) {
26412625
exists(int b, int bIdentityExpr, int n |
26422626
b = 0 and
@@ -5028,6 +5012,8 @@ private module Impl {
50285012
or
50295013
result = getImmediateChildOfOtherConstructorDeclRefExpr(e, index, partialAccessor)
50305014
or
5015+
result = getImmediateChildOfOverloadedDeclRefExpr(e, index, partialAccessor)
5016+
or
50315017
result = getImmediateChildOfPackExpr(e, index, partialAccessor)
50325018
or
50335019
result = getImmediateChildOfPropertyWrapperValuePlaceholderExpr(e, index, partialAccessor)
@@ -5140,8 +5126,6 @@ private module Impl {
51405126
or
51415127
result = getImmediateChildOfOptionalTryExpr(e, index, partialAccessor)
51425128
or
5143-
result = getImmediateChildOfOverloadedDeclRefExpr(e, index, partialAccessor)
5144-
or
51455129
result = getImmediateChildOfParenExpr(e, index, partialAccessor)
51465130
or
51475131
result = getImmediateChildOfPointerToPointerExpr(e, index, partialAccessor)

swift/ql/lib/codeql/swift/generated/Raw.qll

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,13 @@ module Raw {
547547
ConstructorDecl getConstructorDecl() { other_constructor_decl_ref_exprs(this, result) }
548548
}
549549

550-
class OverloadSetRefExpr extends @overload_set_ref_expr, Expr { }
550+
class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, Expr {
551+
override string toString() { result = "OverloadedDeclRefExpr" }
552+
553+
ValueDecl getPossibleDeclaration(int index) {
554+
overloaded_decl_ref_expr_possible_declarations(this, index, result)
555+
}
556+
}
551557

552558
class PackExpr extends @pack_expr, Expr {
553559
override string toString() { result = "PackExpr" }
@@ -849,10 +855,6 @@ module Raw {
849855
override string toString() { result = "OptionalTryExpr" }
850856
}
851857

852-
class OverloadedDeclRefExpr extends @overloaded_decl_ref_expr, OverloadSetRefExpr {
853-
override string toString() { result = "OverloadedDeclRefExpr" }
854-
}
855-
856858
class ParenExpr extends @paren_expr, IdentityExpr {
857859
override string toString() { result = "ParenExpr" }
858860
}

swift/ql/lib/codeql/swift/generated/Synth.qll

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ module Synth {
390390
TKeyPathDotExpr or TKeyPathExpr or TLazyInitializerExpr or TLiteralExpr or TLookupExpr or
391391
TMakeTemporarilyEscapableExpr or TObjCSelectorExpr or TOneWayExpr or TOpaqueValueExpr or
392392
TOpenExistentialExpr or TOptionalEvaluationExpr or TOtherConstructorDeclRefExpr or
393-
TOverloadSetRefExpr or TPackExpr or TPropertyWrapperValuePlaceholderExpr or
393+
TOverloadedDeclRefExpr or TPackExpr or TPropertyWrapperValuePlaceholderExpr or
394394
TRebindSelfInConstructorExpr or TSequenceExpr or TSuperRefExpr or TTapExpr or
395395
TTupleElementExpr or TTupleExpr or TTypeExpr or TUnresolvedDeclRefExpr or
396396
TUnresolvedDotExpr or TUnresolvedMemberExpr or TUnresolvedPatternExpr or
@@ -422,8 +422,6 @@ module Synth {
422422

423423
class TNumberLiteralExpr = TFloatLiteralExpr or TIntegerLiteralExpr;
424424

425-
class TOverloadSetRefExpr = TOverloadedDeclRefExpr;
426-
427425
class TSelfApplyExpr = TConstructorRefCallExpr or TDotSyntaxCallExpr;
428426

429427
class TPattern =
@@ -1781,7 +1779,7 @@ module Synth {
17811779
or
17821780
result = convertOtherConstructorDeclRefExprFromRaw(e)
17831781
or
1784-
result = convertOverloadSetRefExprFromRaw(e)
1782+
result = convertOverloadedDeclRefExprFromRaw(e)
17851783
or
17861784
result = convertPackExprFromRaw(e)
17871785
or
@@ -1923,11 +1921,6 @@ module Synth {
19231921
result = convertIntegerLiteralExprFromRaw(e)
19241922
}
19251923

1926-
cached
1927-
TOverloadSetRefExpr convertOverloadSetRefExprFromRaw(Raw::Element e) {
1928-
result = convertOverloadedDeclRefExprFromRaw(e)
1929-
}
1930-
19311924
cached
19321925
TSelfApplyExpr convertSelfApplyExprFromRaw(Raw::Element e) {
19331926
result = convertConstructorRefCallExprFromRaw(e)
@@ -3491,7 +3484,7 @@ module Synth {
34913484
or
34923485
result = convertOtherConstructorDeclRefExprToRaw(e)
34933486
or
3494-
result = convertOverloadSetRefExprToRaw(e)
3487+
result = convertOverloadedDeclRefExprToRaw(e)
34953488
or
34963489
result = convertPackExprToRaw(e)
34973490
or
@@ -3633,11 +3626,6 @@ module Synth {
36333626
result = convertIntegerLiteralExprToRaw(e)
36343627
}
36353628

3636-
cached
3637-
Raw::Element convertOverloadSetRefExprToRaw(TOverloadSetRefExpr e) {
3638-
result = convertOverloadedDeclRefExprToRaw(e)
3639-
}
3640-
36413629
cached
36423630
Raw::Element convertSelfApplyExprToRaw(TSelfApplyExpr e) {
36433631
result = convertConstructorRefCallExprToRaw(e)

swift/ql/lib/codeql/swift/generated/expr/OverloadSetRefExpr.qll

Lines changed: 0 additions & 8 deletions
This file was deleted.
Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,45 @@
11
// generated by codegen/codegen.py
22
private import codeql.swift.generated.Synth
33
private import codeql.swift.generated.Raw
4-
import codeql.swift.elements.expr.OverloadSetRefExpr
4+
import codeql.swift.elements.expr.Expr
5+
import codeql.swift.elements.decl.ValueDecl
56

67
module Generated {
7-
class OverloadedDeclRefExpr extends Synth::TOverloadedDeclRefExpr, OverloadSetRefExpr {
8+
/**
9+
* An ambiguous expression that might refer to multiple declarations. This will be present only
10+
* for failing compilations.
11+
*/
12+
class OverloadedDeclRefExpr extends Synth::TOverloadedDeclRefExpr, Expr {
813
override string getAPrimaryQlClass() { result = "OverloadedDeclRefExpr" }
14+
15+
/**
16+
* Gets the `index`th possible declaration of this overloaded declaration ref expression (0-based).
17+
*
18+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
19+
* behavior of both the `Immediate` and non-`Immediate` versions.
20+
*/
21+
ValueDecl getImmediatePossibleDeclaration(int index) {
22+
result =
23+
Synth::convertValueDeclFromRaw(Synth::convertOverloadedDeclRefExprToRaw(this)
24+
.(Raw::OverloadedDeclRefExpr)
25+
.getPossibleDeclaration(index))
26+
}
27+
28+
/**
29+
* Gets the `index`th possible declaration of this overloaded declaration ref expression (0-based).
30+
*/
31+
final ValueDecl getPossibleDeclaration(int index) {
32+
result = getImmediatePossibleDeclaration(index).resolve()
33+
}
34+
35+
/**
36+
* Gets any of the possible declarations of this overloaded declaration ref expression.
37+
*/
38+
final ValueDecl getAPossibleDeclaration() { result = getPossibleDeclaration(_) }
39+
40+
/**
41+
* Gets the number of possible declarations of this overloaded declaration ref expression.
42+
*/
43+
final int getNumberOfPossibleDeclarations() { result = count(getAPossibleDeclaration()) }
944
}
1045
}

0 commit comments

Comments
 (0)