Swift: move toposort in schema.py

This makes the result of code generation independent of the order
in which classes are defined in the schema, and makes additional
topological sorting not required.

Being independent from schema order will be important for reviewing the
move to a pure python schema, as generated code will be left untouched.
This commit is contained in:
Paolo Tranquilli
2022-09-21 10:44:39 +02:00
parent b49487cf42
commit a50f3f752b
8 changed files with 6413 additions and 6425 deletions

View File

@@ -56,23 +56,6 @@ def test_two_class_hierarchy(generate):
]
def test_complex_hierarchy_topologically_ordered(generate):
a = cpp.Class(name="A")
b = cpp.Class(name="B")
c = cpp.Class(name="C", bases=[a])
d = cpp.Class(name="D", bases=[a])
e = cpp.Class(name="E", bases=[b, c, d], final=True, trap_name="Es")
f = cpp.Class(name="F", bases=[c], final=True, trap_name="Fs")
assert generate([
schema.Class(name="F", bases=["C"]),
schema.Class(name="B", derived={"E"}),
schema.Class(name="D", bases=["A"], derived={"E"}),
schema.Class(name="C", bases=["A"], derived={"E", "F"}),
schema.Class(name="E", bases=["B", "C", "D"]),
schema.Class(name="A", derived={"C", "D"}),
]) == [a, b, c, d, e, f]
@pytest.mark.parametrize("type,expected", [
("a", "a"),
("string", "std::string"),
@@ -154,8 +137,8 @@ def test_classes_with_dirs(generate_grouped):
assert generate_grouped([
schema.Class(name="A"),
schema.Class(name="B", dir=pathlib.Path("foo")),
schema.Class(name="C", bases=["CBase"], dir=pathlib.Path("bar")),
schema.Class(name="CBase", derived={"C"}, dir=pathlib.Path("bar")),
schema.Class(name="C", bases=["CBase"], dir=pathlib.Path("bar")),
schema.Class(name="D", dir=pathlib.Path("foo/bar/baz")),
]) == {
".": [cpp.Class(name="A", trap_name="As", final=True)],

View File

@@ -177,10 +177,10 @@ def test_hierarchy_imports(generate_import_list):
def test_hierarchy_children(generate_children_implementations):
assert generate_children_implementations([
schema.Class("D", bases=["B", "C"]),
schema.Class("C", bases=["A"], derived={"D"}),
schema.Class("B", bases=["A"], derived={"D"}),
schema.Class("A", derived={"B", "C"}),
schema.Class("B", bases=["A"], derived={"D"}),
schema.Class("C", bases=["A"], derived={"D"}),
schema.Class("D", bases=["B", "C"]),
]) == ql.GetParentImplementation(
classes=[ql.Class(name="A"),
ql.Class(name="B", bases=["A"], imports=[