Skip to content

Commit e17bc6c

Browse files
committed
Swift: add UnspecifiedElement
1 parent 2aa5288 commit e17bc6c

File tree

11 files changed

+482
-168
lines changed

11 files changed

+482
-168
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import codeql.swift.elements.Location
1111
import codeql.swift.elements.UnknownFile
1212
import codeql.swift.elements.UnknownLocation
1313
import codeql.swift.elements.UnresolvedElement
14+
import codeql.swift.elements.UnspecifiedElement
1415
import codeql.swift.elements.decl.AbstractFunctionDecl
1516
import codeql.swift.elements.decl.AbstractStorageDecl
1617
import codeql.swift.elements.decl.AbstractTypeParamDecl
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
2+
private import codeql.swift.generated.UnspecifiedElement
3+
4+
class UnspecifiedElement extends Generated::UnspecifiedElement { }
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
// generated by codegen/codegen.py, remove this comment if you wish to edit this file
2+
private import codeql.swift.generated.Raw
3+
4+
predicate constructUnspecifiedElement(Raw::UnspecifiedElement id) { any() }

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,21 @@ private module Impl {
165165
)
166166
}
167167

168+
private Element getImmediateChildOfUnspecifiedElement(
169+
UnspecifiedElement 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+
168183
private Element getImmediateChildOfDecl(Decl e, int index, string partialPredicateCall) {
169184
exists(int b, int bAstNode, int n |
170185
b = 0 and
@@ -4871,6 +4886,8 @@ private module Impl {
48714886
or
48724887
result = getImmediateChildOfUnknownLocation(e, index, partialAccessor)
48734888
or
4889+
result = getImmediateChildOfUnspecifiedElement(e, index, partialAccessor)
4890+
or
48744891
result = getImmediateChildOfEnumCaseDecl(e, index, partialAccessor)
48754892
or
48764893
result = getImmediateChildOfExtensionDecl(e, index, partialAccessor)

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,18 @@ module Raw {
5151
override string toString() { result = "DbLocation" }
5252
}
5353

54+
class UnspecifiedElement extends @unspecified_element, Locatable {
55+
override string toString() { result = "UnspecifiedElement" }
56+
57+
Element getParent() { unspecified_element_parents(this, result) }
58+
59+
string getProperty() { unspecified_elements(this, result, _) }
60+
61+
int getIndex() { unspecified_element_indices(this, result) }
62+
63+
string getError() { unspecified_elements(this, _, result) }
64+
}
65+
5466
class Decl extends @decl, AstNode {
5567
ModuleDecl getModule() { decls(this, result) }
5668
}

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

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ module Synth {
1010
TDbLocation(Raw::DbLocation id) { constructDbLocation(id) } or
1111
TUnknownFile() or
1212
TUnknownLocation() or
13+
TUnspecifiedElement(Raw::UnspecifiedElement id) { constructUnspecifiedElement(id) } or
1314
TAccessorDecl(Raw::AccessorDecl id) { constructAccessorDecl(id) } or
1415
TAssociatedTypeDecl(Raw::AssociatedTypeDecl id) { constructAssociatedTypeDecl(id) } or
1516
TClassDecl(Raw::ClassDecl id) { constructClassDecl(id) } or
@@ -321,7 +322,7 @@ module Synth {
321322

322323
class TFile = TDbFile or TUnknownFile;
323324

324-
class TLocatable = TArgument or TAstNode or TComment;
325+
class TLocatable = TArgument or TAstNode or TComment or TUnspecifiedElement;
325326

326327
class TLocation = TDbLocation or TUnknownLocation;
327328

@@ -499,6 +500,11 @@ module Synth {
499500
cached
500501
TUnknownLocation convertUnknownLocationFromRaw(Raw::Element e) { none() }
501502

503+
cached
504+
TUnspecifiedElement convertUnspecifiedElementFromRaw(Raw::Element e) {
505+
result = TUnspecifiedElement(e)
506+
}
507+
502508
cached
503509
TAccessorDecl convertAccessorDeclFromRaw(Raw::Element e) { result = TAccessorDecl(e) }
504510

@@ -1464,6 +1470,8 @@ module Synth {
14641470
result = convertAstNodeFromRaw(e)
14651471
or
14661472
result = convertCommentFromRaw(e)
1473+
or
1474+
result = convertUnspecifiedElementFromRaw(e)
14671475
}
14681476

14691477
cached
@@ -2199,6 +2207,11 @@ module Synth {
21992207
cached
22002208
Raw::Element convertUnknownLocationToRaw(TUnknownLocation e) { none() }
22012209

2210+
cached
2211+
Raw::Element convertUnspecifiedElementToRaw(TUnspecifiedElement e) {
2212+
e = TUnspecifiedElement(result)
2213+
}
2214+
22022215
cached
22032216
Raw::Element convertAccessorDeclToRaw(TAccessorDecl e) { e = TAccessorDecl(result) }
22042217

@@ -3162,6 +3175,8 @@ module Synth {
31623175
result = convertAstNodeToRaw(e)
31633176
or
31643177
result = convertCommentToRaw(e)
3178+
or
3179+
result = convertUnspecifiedElementToRaw(e)
31653180
}
31663181

31673182
cached

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import codeql.swift.elements.CommentConstructor
33
import codeql.swift.elements.DbFileConstructor
44
import codeql.swift.elements.DbLocationConstructor
5+
import codeql.swift.elements.UnspecifiedElementConstructor
56
import codeql.swift.elements.decl.AccessorDeclConstructor
67
import codeql.swift.elements.decl.AssociatedTypeDeclConstructor
78
import codeql.swift.elements.decl.ClassDeclConstructor
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// generated by codegen/codegen.py
2+
private import codeql.swift.generated.Synth
3+
private import codeql.swift.generated.Raw
4+
import codeql.swift.elements.Element
5+
import codeql.swift.elements.Locatable
6+
7+
module Generated {
8+
class UnspecifiedElement extends Synth::TUnspecifiedElement, Locatable {
9+
override string getAPrimaryQlClass() { result = "UnspecifiedElement" }
10+
11+
/**
12+
* Gets the parent of this unspecified element, if it exists.
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+
Element getImmediateParent() {
18+
result =
19+
Synth::convertElementFromRaw(Synth::convertUnspecifiedElementToRaw(this)
20+
.(Raw::UnspecifiedElement)
21+
.getParent())
22+
}
23+
24+
/**
25+
* Gets the parent of this unspecified element, if it exists.
26+
*/
27+
final Element getParent() { result = getImmediateParent().resolve() }
28+
29+
/**
30+
* Holds if `getParent()` exists.
31+
*/
32+
final predicate hasParent() { exists(getParent()) }
33+
34+
/**
35+
* Gets the property of this unspecified element.
36+
*/
37+
string getProperty() {
38+
result = Synth::convertUnspecifiedElementToRaw(this).(Raw::UnspecifiedElement).getProperty()
39+
}
40+
41+
/**
42+
* Gets the index of this unspecified element, if it exists.
43+
*/
44+
int getIndex() {
45+
result = Synth::convertUnspecifiedElementToRaw(this).(Raw::UnspecifiedElement).getIndex()
46+
}
47+
48+
/**
49+
* Holds if `getIndex()` exists.
50+
*/
51+
final predicate hasIndex() { exists(getIndex()) }
52+
53+
/**
54+
* Gets the error of this unspecified element.
55+
*/
56+
string getError() {
57+
result = Synth::convertUnspecifiedElementToRaw(this).(Raw::UnspecifiedElement).getError()
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)