Skip to content

Commit 1f0ca6b

Browse files
authored
Merge pull request #10237 from github/redsun82/swift-generate-printast
Swift: add generic type parameters to AST children
2 parents 1cb6d78 + 281cd79 commit 1f0ca6b

File tree

16 files changed

+162
-100
lines changed

16 files changed

+162
-100
lines changed

swift/codegen/lib/ql.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,7 @@ class Class:
9696
ipa: bool = False
9797

9898
def __post_init__(self):
99-
bases = sorted(str(b) for b in self.bases)
100-
self.bases = [Base(str(b), prev) for b, prev in zip(bases, itertools.chain([""], bases))]
99+
self.bases = [Base(str(b), str(prev)) for b, prev in zip(self.bases, itertools.chain([""], self.bases))]
101100
if self.properties:
102101
self.properties[0].first = True
103102

swift/codegen/lib/schema.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ class IpaInfo:
6565
@dataclass
6666
class Class:
6767
name: str
68-
bases: Set[str] = field(default_factory=set)
68+
bases: List[str] = field(default_factory=set)
6969
derived: Set[str] = field(default_factory=set)
7070
properties: List[Property] = field(default_factory=list)
7171
dir: pathlib.Path = pathlib.Path()
@@ -150,9 +150,8 @@ def load(path):
150150
if not k.startswith("_"):
151151
cls.properties.append(_parse_property(k, v))
152152
elif k == "_extends":
153-
v = _auto_list(v)
154-
for base in v:
155-
cls.bases.add(base)
153+
cls.bases = _auto_list(v)
154+
for base in cls.bases:
156155
classes[base].derived.add(name)
157156
elif k == "_dir":
158157
cls.dir = pathlib.Path(v)
@@ -165,7 +164,7 @@ def load(path):
165164
else:
166165
raise Error(f"unknown metadata {k} for class {name}")
167166
if not cls.bases and cls.name != root_class_name:
168-
cls.bases.add(root_class_name)
167+
cls.bases = [root_class_name]
169168
classes[root_class_name].derived.add(name)
170169

171170
return Schema(classes=classes, includes=set(data.get("_includes", [])))

swift/codegen/schema.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ ExtensionDecl:
7272

7373
NominalTypeDecl:
7474
_extends:
75-
- IterableDeclContext
7675
- GenericTypeDecl
76+
- IterableDeclContext
7777
type: Type
7878

7979
AstNode:
@@ -1109,7 +1109,8 @@ AbstractTypeParamDecl:
11091109
_extends: TypeDecl
11101110

11111111
GenericContext:
1112-
generic_type_params: GenericTypeParamDecl*
1112+
_children:
1113+
generic_type_params: GenericTypeParamDecl*
11131114

11141115
GenericTypeDecl:
11151116
_extends:

swift/codegen/test/test_cppgen.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ def test_two_class_hierarchy(generate):
4949
base = cpp.Class(name="A")
5050
assert generate([
5151
schema.Class(name="A", derived={"B"}),
52-
schema.Class(name="B", bases={"A"}),
52+
schema.Class(name="B", bases=["A"]),
5353
]) == [
5454
base,
5555
cpp.Class(name="B", bases=[base], final=True, trap_name="Bs"),
@@ -64,11 +64,11 @@ def test_complex_hierarchy_topologically_ordered(generate):
6464
e = cpp.Class(name="E", bases=[b, c, d], final=True, trap_name="Es")
6565
f = cpp.Class(name="F", bases=[c], final=True, trap_name="Fs")
6666
assert generate([
67-
schema.Class(name="F", bases={"C"}),
67+
schema.Class(name="F", bases=["C"]),
6868
schema.Class(name="B", derived={"E"}),
69-
schema.Class(name="D", bases={"A"}, derived={"E"}),
70-
schema.Class(name="C", bases={"A"}, derived={"E", "F"}),
71-
schema.Class(name="E", bases={"B", "C", "D"}),
69+
schema.Class(name="D", bases=["A"], derived={"E"}),
70+
schema.Class(name="C", bases=["A"], derived={"E", "F"}),
71+
schema.Class(name="E", bases=["B", "C", "D"]),
7272
schema.Class(name="A", derived={"C", "D"}),
7373
]) == [a, b, c, d, e, f]
7474

@@ -154,7 +154,7 @@ def test_classes_with_dirs(generate_grouped):
154154
assert generate_grouped([
155155
schema.Class(name="A"),
156156
schema.Class(name="B", dir=pathlib.Path("foo")),
157-
schema.Class(name="C", bases={"CBase"}, dir=pathlib.Path("bar")),
157+
schema.Class(name="C", bases=["CBase"], dir=pathlib.Path("bar")),
158158
schema.Class(name="CBase", derived={"C"}, dir=pathlib.Path("bar")),
159159
schema.Class(name="D", dir=pathlib.Path("foo/bar/baz")),
160160
]) == {

swift/codegen/test/test_ql.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def test_property_predicate_getter():
8080

8181
def test_class_processes_bases():
8282
bases = ["B", "Ab", "C", "Aa"]
83-
expected = [ql.Base("Aa"), ql.Base("Ab", prev="Aa"), ql.Base("B", prev="Ab"), ql.Base("C", prev="B")]
83+
expected = [ql.Base("B"), ql.Base("Ab", prev="B"), ql.Base("C", prev="Ab"), ql.Base("Aa", prev="C")]
8484
cls = ql.Class("Foo", bases=bases)
8585
assert cls.bases == expected
8686

swift/codegen/test/test_qlgen.py

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -149,9 +149,9 @@ def test_one_empty_class(generate_classes):
149149

150150
def test_hierarchy(generate_classes):
151151
assert generate_classes([
152-
schema.Class("D", bases={"B", "C"}),
153-
schema.Class("C", bases={"A"}, derived={"D"}),
154-
schema.Class("B", bases={"A"}, derived={"D"}),
152+
schema.Class("D", bases=["B", "C"]),
153+
schema.Class("C", bases=["A"], derived={"D"}),
154+
schema.Class("B", bases=["A"], derived={"D"}),
155155
schema.Class("A", derived={"B", "C"}),
156156
]) == {
157157
"A.qll": (ql.Stub(name="A", base_import=gen_import_prefix + "A"),
@@ -168,18 +168,18 @@ def test_hierarchy(generate_classes):
168168

169169
def test_hierarchy_imports(generate_import_list):
170170
assert generate_import_list([
171-
schema.Class("D", bases={"B", "C"}),
172-
schema.Class("C", bases={"A"}, derived={"D"}),
173-
schema.Class("B", bases={"A"}, derived={"D"}),
171+
schema.Class("D", bases=["B", "C"]),
172+
schema.Class("C", bases=["A"], derived={"D"}),
173+
schema.Class("B", bases=["A"], derived={"D"}),
174174
schema.Class("A", derived={"B", "C"}),
175175
]) == ql.ImportList([stub_import_prefix + cls for cls in "ABCD"])
176176

177177

178178
def test_hierarchy_children(generate_children_implementations):
179179
assert generate_children_implementations([
180-
schema.Class("D", bases={"B", "C"}),
181-
schema.Class("C", bases={"A"}, derived={"D"}),
182-
schema.Class("B", bases={"A"}, derived={"D"}),
180+
schema.Class("D", bases=["B", "C"]),
181+
schema.Class("C", bases=["A"], derived={"D"}),
182+
schema.Class("B", bases=["A"], derived={"D"}),
183183
schema.Class("A", derived={"B", "C"}),
184184
]) == ql.GetParentImplementation(
185185
classes=[ql.Class(name="A"),
@@ -347,7 +347,7 @@ def test_class_dir(generate_classes):
347347
dir = pathlib.Path("another/rel/path")
348348
assert generate_classes([
349349
schema.Class("A", derived={"B"}, dir=dir),
350-
schema.Class("B", bases={"A"}),
350+
schema.Class("B", bases=["A"]),
351351
]) == {
352352
f"{dir}/A.qll": (ql.Stub(name="A", base_import=gen_import_prefix + "another.rel.path.A"),
353353
ql.Class(name="A", dir=dir)),
@@ -368,7 +368,7 @@ def test_class_dir_imports(generate_import_list):
368368
dir = pathlib.Path("another/rel/path")
369369
assert generate_import_list([
370370
schema.Class("A", derived={"B"}, dir=dir),
371-
schema.Class("B", bases={"A"}),
371+
schema.Class("B", bases=["A"]),
372372
]) == ql.ImportList([
373373
stub_import_prefix + "B",
374374
stub_import_prefix + "another.rel.path.A",
@@ -475,7 +475,7 @@ def test_test_total_properties(opts, generate_tests):
475475
schema.Class("A", derived={"B"}, properties=[
476476
schema.SingleProperty("x", "string"),
477477
]),
478-
schema.Class("B", bases={"A"}, properties=[
478+
schema.Class("B", bases=["A"], properties=[
479479
schema.PredicateProperty("y", "int"),
480480
]),
481481
]) == {
@@ -494,7 +494,7 @@ def test_test_partial_properties(opts, generate_tests):
494494
schema.Class("A", derived={"B"}, properties=[
495495
schema.OptionalProperty("x", "string"),
496496
]),
497-
schema.Class("B", bases={"A"}, properties=[
497+
schema.Class("B", bases=["A"], properties=[
498498
schema.RepeatedProperty("y", "int"),
499499
]),
500500
]) == {
@@ -514,9 +514,9 @@ def test_test_properties_deduplicated(opts, generate_tests):
514514
schema.SingleProperty("x", "string"),
515515
schema.RepeatedProperty("y", "int"),
516516
]),
517-
schema.Class("A", bases={"Base"}, derived={"Final"}),
518-
schema.Class("B", bases={"Base"}, derived={"Final"}),
519-
schema.Class("Final", bases={"A", "B"}),
517+
schema.Class("A", bases=["Base"], derived={"Final"}),
518+
schema.Class("B", bases=["Base"], derived={"Final"}),
519+
schema.Class("Final", bases=["A", "B"]),
520520
]) == {
521521
"Final/Final.ql": ql.ClassTester(class_name="Final", properties=[
522522
ql.PropertyForTest(
@@ -535,7 +535,7 @@ def test_test_properties_skipped(opts, generate_tests):
535535
schema.SingleProperty("x", "string", pragmas=["qltest_skip", "foo"]),
536536
schema.RepeatedProperty("y", "int", pragmas=["bar", "qltest_skip"]),
537537
]),
538-
schema.Class("Derived", bases={"Base"}, properties=[
538+
schema.Class("Derived", bases=["Base"], properties=[
539539
schema.PredicateProperty("a", pragmas=["qltest_skip"]),
540540
schema.OptionalProperty(
541541
"b", "int", pragmas=["bar", "qltest_skip", "baz"]),
@@ -552,7 +552,7 @@ def test_test_base_class_skipped(opts, generate_tests):
552552
schema.SingleProperty("x", "string"),
553553
schema.RepeatedProperty("y", "int"),
554554
]),
555-
schema.Class("Derived", bases={"Base"}),
555+
schema.Class("Derived", bases=["Base"]),
556556
]) == {
557557
"Derived/Derived.ql": ql.ClassTester(class_name="Derived"),
558558
}
@@ -562,7 +562,7 @@ def test_test_final_class_skipped(opts, generate_tests):
562562
write(opts.ql_test_output / "Derived" / "test.swift")
563563
assert generate_tests([
564564
schema.Class("Base", derived={"Derived"}),
565-
schema.Class("Derived", bases={"Base"}, pragmas=["qltest_skip", "foo"], properties=[
565+
schema.Class("Derived", bases=["Base"], pragmas=["qltest_skip", "foo"], properties=[
566566
schema.SingleProperty("x", "string"),
567567
schema.RepeatedProperty("y", "int"),
568568
]),
@@ -573,9 +573,9 @@ def test_test_class_hierarchy_collapse(opts, generate_tests):
573573
write(opts.ql_test_output / "Base" / "test.swift")
574574
assert generate_tests([
575575
schema.Class("Base", derived={"D1", "D2"}, pragmas=["foo", "qltest_collapse_hierarchy"]),
576-
schema.Class("D1", bases={"Base"}, properties=[schema.SingleProperty("x", "string")]),
577-
schema.Class("D2", bases={"Base"}, derived={"D3"}, properties=[schema.SingleProperty("y", "string")]),
578-
schema.Class("D3", bases={"D2"}, properties=[schema.SingleProperty("z", "string")]),
576+
schema.Class("D1", bases=["Base"], properties=[schema.SingleProperty("x", "string")]),
577+
schema.Class("D2", bases=["Base"], derived={"D3"}, properties=[schema.SingleProperty("y", "string")]),
578+
schema.Class("D3", bases=["D2"], properties=[schema.SingleProperty("z", "string")]),
579579
]) == {
580580
"Base/Base.ql": ql.ClassTester(class_name="Base"),
581581
}
@@ -586,10 +586,10 @@ def test_test_class_hierarchy_uncollapse(opts, generate_tests):
586586
write(opts.ql_test_output / d / "test.swift")
587587
assert generate_tests([
588588
schema.Class("Base", derived={"D1", "D2"}, pragmas=["foo", "qltest_collapse_hierarchy"]),
589-
schema.Class("D1", bases={"Base"}, properties=[schema.SingleProperty("x", "string")]),
590-
schema.Class("D2", bases={"Base"}, derived={"D3", "D4"}, pragmas=["qltest_uncollapse_hierarchy", "bar"]),
591-
schema.Class("D3", bases={"D2"}),
592-
schema.Class("D4", bases={"D2"}),
589+
schema.Class("D1", bases=["Base"], properties=[schema.SingleProperty("x", "string")]),
590+
schema.Class("D2", bases=["Base"], derived={"D3", "D4"}, pragmas=["qltest_uncollapse_hierarchy", "bar"]),
591+
schema.Class("D3", bases=["D2"]),
592+
schema.Class("D4", bases=["D2"]),
593593
]) == {
594594
"Base/Base.ql": ql.ClassTester(class_name="Base"),
595595
"D3/D3.ql": ql.ClassTester(class_name="D3"),
@@ -602,9 +602,9 @@ def test_test_class_hierarchy_uncollapse_at_final(opts, generate_tests):
602602
write(opts.ql_test_output / d / "test.swift")
603603
assert generate_tests([
604604
schema.Class("Base", derived={"D1", "D2"}, pragmas=["foo", "qltest_collapse_hierarchy"]),
605-
schema.Class("D1", bases={"Base"}, properties=[schema.SingleProperty("x", "string")]),
606-
schema.Class("D2", bases={"Base"}, derived={"D3"}),
607-
schema.Class("D3", bases={"D2"}, pragmas=["qltest_uncollapse_hierarchy", "bar"]),
605+
schema.Class("D1", bases=["Base"], properties=[schema.SingleProperty("x", "string")]),
606+
schema.Class("D2", bases=["Base"], derived={"D3"}),
607+
schema.Class("D3", bases=["D2"], pragmas=["qltest_uncollapse_hierarchy", "bar"]),
608608
]) == {
609609
"Base/Base.ql": ql.ClassTester(class_name="Base"),
610610
"D3/D3.ql": ql.ClassTester(class_name="D3"),

0 commit comments

Comments
 (0)