Skip to content

Commit c578505

Browse files
committed
Swift: specialize Ipa <-> Db conversions
1 parent a16d5f7 commit c578505

File tree

137 files changed

+3599
-463
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+3599
-463
lines changed

swift/codegen/generators/qlgen.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def _to_db_type(x: str) -> str:
9393

9494
def get_ql_ipa_class(cls: schema.Class):
9595
if cls.derived:
96-
return ql.Ipa.NonFinalClass(name=cls.name, derived=sorted(cls.derived))
96+
return ql.Ipa.NonFinalClass(name=cls.name, derived=sorted(cls.derived), root=(cls.name == schema.root_class_name))
9797
if cls.ipa and cls.ipa.from_class is not None:
9898
source = cls.ipa.from_class
9999
_final_db_class_lookup.setdefault(source, ql.Ipa.FinalClassDb(source)).subtract_type(cls.name)
@@ -276,7 +276,7 @@ def generate(opts, renderer):
276276
if not stub_file.is_file() or _is_generated_stub(stub_file):
277277
renderer.render(ql.Ipa.ConstructorStub(ipa_type), stub_file)
278278
constructor_imports.append(get_import(stub_file, opts.swift_dir))
279-
elif cls.name != schema.root_class_name:
279+
else:
280280
non_final_ipa_types.append(ipa_type)
281281

282282
renderer.render(ql.Ipa.Types(schema.root_class_name, final_ipa_types, non_final_ipa_types), out / "IpaTypes.qll")

swift/codegen/lib/ql.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ def db_id(self):
229229
@dataclass
230230
class NonFinalClass(Class):
231231
derived: List["Ipa.Class"] = field(default_factory=list)
232+
root: bool = False
232233

233234
def __post_init__(self):
234235
self.derived = [Ipa.Class(c) for c in self.derived]

swift/codegen/templates/ql_class.mustache

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class {{name}}Base extends Ipa::T{{name}}{{#bases}}, {{.}}{{/bases}} {
2929
{{#type_is_class}}
3030
{{type}} getImmediate{{singular}}({{#is_repeated}}int index{{/is_repeated}}) {
3131
{{#has_db_id}}
32-
result = Ipa::fromDbInstance(Ipa::toDbInstance(this).(Db::{{name}}).{{getter}}({{#is_repeated}}index{{/is_repeated}}))
32+
result = Ipa::convert{{type}}FromDb(Ipa::convert{{name}}ToDb(this).(Db::{{name}}).{{getter}}({{#is_repeated}}index{{/is_repeated}}))
3333
{{/has_db_id}}
3434
{{^has_db_id}}
3535
none()
@@ -44,7 +44,7 @@ class {{name}}Base extends Ipa::T{{name}}{{#bases}}, {{.}}{{/bases}} {
4444
{{^type_is_class}}
4545
{{type}} {{getter}}({{#is_repeated}}int index{{/is_repeated}}) {
4646
{{#has_db_id}}
47-
{{^is_predicate}}result = {{/is_predicate}}Ipa::toDbInstance(this).(Db::{{name}}).{{getter}}({{#is_repeated}}index{{/is_repeated}})
47+
{{^is_predicate}}result = {{/is_predicate}}Ipa::convert{{name}}ToDb(this).(Db::{{name}}).{{getter}}({{#is_repeated}}index{{/is_repeated}})
4848
{{/has_db_id}}
4949
{{^has_db_id}}
5050
none()

swift/codegen/templates/ql_ipa_types.mustache

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ cached module Ipa {
88
or
99
{{/first}}
1010
{{#is_ipa_from}}
11-
T{{name}}({{type}} id) { construct{{name}}(id) }
11+
T{{name}}(Db::{{type}} id) { construct{{name}}(id) }
1212
{{/is_ipa_from}}
1313
{{#is_ipa_on}}
1414
T{{name}}({{#params}}{{^first}}, {{/first}}{{type}} {{param}}{{/params}}){{#has_params}} { construct{{name}}({{#params}}{{^first}}, {{/first}}{{param}}{{/params}}) }{{/has_params}}
@@ -19,20 +19,52 @@ cached module Ipa {
1919
{{/final_classes}}
2020

2121
{{#non_final_classes}}
22+
{{^root}}
2223
class T{{name}} = {{#derived}}{{^first}} or {{/first}}T{{name}}{{/derived}};
24+
{{/root}}
2325
{{/non_final_classes}}
2426

25-
cached TElement fromDbInstance(Db::Element e) {
26-
none()
27-
{{#final_classes}}
27+
{{#final_classes}}
28+
cached T{{name}} convert{{name}}FromDb(Db::Element e) {
2829
{{^is_ipa_on}}
29-
or
3030
result = T{{name}}(e)
3131
{{/is_ipa_on}}
32-
{{/final_classes}}
32+
{{#is_ipa_on}}
33+
none()
34+
{{/is_ipa_on}}
35+
}
36+
{{/final_classes}}
37+
38+
{{#non_final_classes}}
39+
cached T{{name}} convert{{name}}FromDb(Db::Element e) {
40+
{{#derived}}
41+
{{^first}}
42+
or
43+
{{/first}}
44+
result = convert{{name}}FromDb(e)
45+
{{/derived}}
3346
}
47+
{{/non_final_classes}}
3448

35-
cached Db::Element toDbInstance(TElement e) {
36-
e = fromDbInstance(result)
49+
{{#final_classes}}
50+
cached Db::Element convert{{name}}ToDb(T{{name}} e) {
51+
{{^is_ipa_on}}
52+
e = T{{name}}(result)
53+
{{/is_ipa_on}}
54+
{{#is_ipa_on}}
55+
none()
56+
{{/is_ipa_on}}
3757
}
58+
{{/final_classes}}
59+
60+
{{#non_final_classes}}
61+
cached Db::Element convert{{name}}ToDb(T{{name}} e) {
62+
{{#derived}}
63+
{{^first}}
64+
or
65+
{{/first}}
66+
result = convert{{name}}ToDb(e)
67+
{{/derived}}
68+
}
69+
{{/non_final_classes}}
3870
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import codeql.swift.elements.decl.ParamDecl
77

88
class CallableBase extends Ipa::TCallable, Element {
99
ParamDecl getImmediateParam(int index) {
10-
result = Ipa::fromDbInstance(Ipa::toDbInstance(this).(Db::Callable).getParam(index))
10+
result =
11+
Ipa::convertParamDeclFromDb(Ipa::convertCallableToDb(this).(Db::Callable).getParam(index))
1112
}
1213

1314
final ParamDecl getParam(int index) { result = getImmediateParam(index).resolve() }
@@ -17,7 +18,7 @@ class CallableBase extends Ipa::TCallable, Element {
1718
final int getNumberOfParams() { result = count(getAParam()) }
1819

1920
BraceStmt getImmediateBody() {
20-
result = Ipa::fromDbInstance(Ipa::toDbInstance(this).(Db::Callable).getBody())
21+
result = Ipa::convertBraceStmtFromDb(Ipa::convertCallableToDb(this).(Db::Callable).getBody())
2122
}
2223

2324
final BraceStmt getBody() { result = getImmediateBody().resolve() }

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,5 @@ class ElementBase extends Ipa::TElement {
1717
result = getResolveStep().resolve()
1818
}
1919

20-
predicate isUnknown() { Ipa::toDbInstance(this).(Db::Element).isUnknown() }
20+
predicate isUnknown() { Ipa::convertElementToDb(this).(Db::Element).isUnknown() }
2121
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ private import codeql.swift.generated.Db
44
import codeql.swift.elements.Element
55

66
class FileBase extends Ipa::TFile, Element {
7-
string getName() { result = Ipa::toDbInstance(this).(Db::File).getName() }
7+
string getName() { result = Ipa::convertFileToDb(this).(Db::File).getName() }
88
}

0 commit comments

Comments
 (0)