Skip to content

Commit 0ccf81e

Browse files
committed
Swift: extract UnresolvedSpecializeExpr
1 parent 1a06282 commit 0ccf81e

File tree

12 files changed

+89
-44
lines changed

12 files changed

+89
-44
lines changed

swift/extractor/translators/ExprTranslator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,5 +557,11 @@ codeql::DynamicSubscriptExpr ExprTranslator::translateDynamicSubscriptExpr(
557557
fillLookupExpr(expr, entry);
558558
return entry;
559559
}
560+
codeql::UnresolvedSpecializeExpr ExprTranslator::translateUnresolvedSpecializeExpr(
561+
const swift::UnresolvedSpecializeExpr& expr) {
562+
auto entry = createExprEntry(expr);
563+
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
564+
return entry;
565+
}
560566

561567
} // namespace codeql

swift/extractor/translators/ExprTranslator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
109109
const swift::DynamicMemberRefExpr& expr);
110110
codeql::DynamicSubscriptExpr translateDynamicSubscriptExpr(
111111
const swift::DynamicSubscriptExpr& expr);
112+
codeql::UnresolvedSpecializeExpr translateUnresolvedSpecializeExpr(
113+
const swift::UnresolvedSpecializeExpr& expr);
112114

113115
private:
114116
void fillAbstractClosureExpr(const swift::AbstractClosureExpr& expr,

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

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,21 +68,6 @@ private module Impl {
6868
)
6969
}
7070

71-
private Element getImmediateChildOfUnresolvedElement(
72-
UnresolvedElement e, int index, string partialPredicateCall
73-
) {
74-
exists(int b, int bElement, int n |
75-
b = 0 and
76-
bElement = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfElement(e, i, _)) | i) and
77-
n = bElement and
78-
(
79-
none()
80-
or
81-
result = getImmediateChildOfElement(e, index - b, partialPredicateCall)
82-
)
83-
)
84-
}
85-
8671
private Element getImmediateChildOfAstNode(AstNode e, int index, string partialPredicateCall) {
8772
exists(int b, int bLocatable, int n |
8873
b = 0 and
@@ -180,6 +165,21 @@ private module Impl {
180165
)
181166
}
182167

168+
private Element getImmediateChildOfUnresolvedElement(
169+
UnresolvedElement e, int index, string partialPredicateCall
170+
) {
171+
exists(int b, int bLocatable, int n |
172+
b = 0 and
173+
bLocatable = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfLocatable(e, i, _)) | i) and
174+
n = bLocatable and
175+
(
176+
none()
177+
or
178+
result = getImmediateChildOfLocatable(e, index - b, partialPredicateCall)
179+
)
180+
)
181+
}
182+
183183
private Element getImmediateChildOfUnspecifiedElement(
184184
UnspecifiedElement e, int index, string partialPredicateCall
185185
) {
@@ -1842,18 +1842,21 @@ private module Impl {
18421842
private Element getImmediateChildOfUnresolvedSpecializeExpr(
18431843
UnresolvedSpecializeExpr e, int index, string partialPredicateCall
18441844
) {
1845-
exists(int b, int bExpr, int bUnresolvedElement, int n |
1845+
exists(int b, int bExpr, int bUnresolvedElement, int n, int nSubExpr |
18461846
b = 0 and
18471847
bExpr = b + 1 + max(int i | i = -1 or exists(getImmediateChildOfExpr(e, i, _)) | i) and
18481848
bUnresolvedElement =
18491849
bExpr + 1 + max(int i | i = -1 or exists(getImmediateChildOfUnresolvedElement(e, i, _)) | i) and
18501850
n = bUnresolvedElement and
1851+
nSubExpr = n + 1 and
18511852
(
18521853
none()
18531854
or
18541855
result = getImmediateChildOfExpr(e, index - b, partialPredicateCall)
18551856
or
18561857
result = getImmediateChildOfUnresolvedElement(e, index - bExpr, partialPredicateCall)
1858+
or
1859+
index = n and result = e.getImmediateSubExpr() and partialPredicateCall = "SubExpr()"
18571860
)
18581861
)
18591862
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,6 @@ module Raw {
3333
int getEndColumn() { locations(this, _, _, _, _, result) }
3434
}
3535

36-
class UnresolvedElement extends @unresolved_element, Element { }
37-
3836
class AstNode extends @ast_node, Locatable { }
3937

4038
class Comment extends @comment, Locatable {
@@ -59,6 +57,8 @@ module Raw {
5957
int getKind() { diagnostics(this, _, result) }
6058
}
6159

60+
class UnresolvedElement extends @unresolved_element, Locatable { }
61+
6262
class UnspecifiedElement extends @unspecified_element, Locatable {
6363
override string toString() { result = "UnspecifiedElement" }
6464

@@ -641,6 +641,8 @@ module Raw {
641641

642642
class UnresolvedSpecializeExpr extends @unresolved_specialize_expr, Expr, UnresolvedElement {
643643
override string toString() { result = "UnresolvedSpecializeExpr" }
644+
645+
Expr getSubExpr() { unresolved_specialize_exprs(this, result) }
644646
}
645647

646648
class VarargExpansionExpr extends @vararg_expansion_expr, Expr {

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,8 @@ module Synth {
323323

324324
class TFile = TDbFile or TUnknownFile;
325325

326-
class TLocatable = TArgument or TAstNode or TComment or TDiagnostics or TUnspecifiedElement;
326+
class TLocatable =
327+
TArgument or TAstNode or TComment or TDiagnostics or TUnresolvedElement or TUnspecifiedElement;
327328

328329
class TLocation = TDbLocation or TUnknownLocation;
329330

@@ -1454,8 +1455,6 @@ module Synth {
14541455
result = convertLocationFromRaw(e)
14551456
or
14561457
result = convertTypeFromRaw(e)
1457-
or
1458-
result = convertUnresolvedElementFromRaw(e)
14591458
}
14601459

14611460
cached
@@ -1475,6 +1474,8 @@ module Synth {
14751474
or
14761475
result = convertDiagnosticsFromRaw(e)
14771476
or
1477+
result = convertUnresolvedElementFromRaw(e)
1478+
or
14781479
result = convertUnspecifiedElementFromRaw(e)
14791480
}
14801481

@@ -3159,8 +3160,6 @@ module Synth {
31593160
result = convertLocationToRaw(e)
31603161
or
31613162
result = convertTypeToRaw(e)
3162-
or
3163-
result = convertUnresolvedElementToRaw(e)
31643163
}
31653164

31663165
cached
@@ -3180,6 +3179,8 @@ module Synth {
31803179
or
31813180
result = convertDiagnosticsToRaw(e)
31823181
or
3182+
result = convertUnresolvedElementToRaw(e)
3183+
or
31833184
result = convertUnspecifiedElementToRaw(e)
31843185
}
31853186

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
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.Element
4+
import codeql.swift.elements.Locatable
55

66
module Generated {
7-
class UnresolvedElement extends Synth::TUnresolvedElement, Element { }
7+
class UnresolvedElement extends Synth::TUnresolvedElement, Locatable { }
88
}

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,23 @@ import codeql.swift.elements.UnresolvedElement
77
module Generated {
88
class UnresolvedSpecializeExpr extends Synth::TUnresolvedSpecializeExpr, Expr, UnresolvedElement {
99
override string getAPrimaryQlClass() { result = "UnresolvedSpecializeExpr" }
10+
11+
/**
12+
* Gets the sub expression of this unresolved specialize expression.
13+
*
14+
* This includes nodes from the "hidden" AST. It can be overridden in subclasses to change the
15+
* behavior of both the `Immediate` and non-`Immediate` versions.
16+
*/
17+
Expr getImmediateSubExpr() {
18+
result =
19+
Synth::convertExprFromRaw(Synth::convertUnresolvedSpecializeExprToRaw(this)
20+
.(Raw::UnresolvedSpecializeExpr)
21+
.getSubExpr())
22+
}
23+
24+
/**
25+
* Gets the sub expression of this unresolved specialize expression.
26+
*/
27+
final Expr getSubExpr() { result = getImmediateSubExpr().resolve() }
1028
}
1129
}

swift/ql/lib/swift.dbscheme

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ sourceLocationPrefix(
1919
| @locatable
2020
| @location
2121
| @type
22-
| @unresolved_element
2322
;
2423

2524
#keyset[id]
@@ -67,6 +66,7 @@ files(
6766
| @ast_node
6867
| @comment
6968
| @diagnostics
69+
| @unresolved_element
7070
| @unspecified_element
7171
;
7272

@@ -91,17 +91,6 @@ locations(
9191
int end_column: int ref
9292
);
9393

94-
@unresolved_element =
95-
@unresolved_decl_ref_expr
96-
| @unresolved_dot_expr
97-
| @unresolved_member_chain_result_expr
98-
| @unresolved_member_expr
99-
| @unresolved_pattern_expr
100-
| @unresolved_specialize_expr
101-
| @unresolved_type
102-
| @unresolved_type_conversion_expr
103-
;
104-
10594
@ast_node =
10695
@case_label_item
10796
| @condition_element
@@ -140,6 +129,17 @@ unknown_locations(
140129
unique int id: @unknown_location
141130
);
142131

132+
@unresolved_element =
133+
@unresolved_decl_ref_expr
134+
| @unresolved_dot_expr
135+
| @unresolved_member_chain_result_expr
136+
| @unresolved_member_expr
137+
| @unresolved_pattern_expr
138+
| @unresolved_specialize_expr
139+
| @unresolved_type
140+
| @unresolved_type_conversion_expr
141+
;
142+
143143
unspecified_elements(
144144
unique int id: @unspecified_element,
145145
string property: string ref,
@@ -1078,7 +1078,8 @@ unresolved_pattern_exprs( //dir=expr
10781078
);
10791079

10801080
unresolved_specialize_exprs( //dir=expr
1081-
unique int id: @unresolved_specialize_expr
1081+
unique int id: @unresolved_specialize_expr,
1082+
int sub_expr: @expr_or_none ref
10821083
);
10831084

10841085
vararg_expansion_exprs( //dir=expr
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| unresolved.swift:5:1:5:14 | UnresolvedSpecializeExpr | UnresolvedSpecializeExpr |
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
// generated by codegen/codegen.py
2+
import codeql.swift.elements
3+
import TestUtils
4+
5+
from UnresolvedElement x
6+
where toBeTested(x) and not x.isUnknown()
7+
select x, x.getPrimaryQlClasses()

0 commit comments

Comments
 (0)