Skip to content

Commit a3d33e2

Browse files
committed
Swift: ignore IPA classes in dbscheme
1 parent 88a0c40 commit a3d33e2

File tree

3 files changed

+81
-23
lines changed

3 files changed

+81
-23
lines changed

swift/codegen/generators/dbschemegen.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,12 @@ def dbtype(typename: str, add_or_none_except: typing.Optional[str] = None) -> st
3838
return typename
3939

4040

41-
def cls_to_dbscheme(cls: schema.Class, add_or_none_except: typing.Optional[str] = None):
41+
def cls_to_dbscheme(cls: schema.Class, lookup: typing.Dict[str, schema.Class], add_or_none_except: typing.Optional[str] = None):
4242
""" Yield all dbscheme entities needed to model class `cls` """
43+
if cls.ipa:
44+
return
4345
if cls.derived:
44-
yield Union(dbtype(cls.name), (dbtype(c) for c in cls.derived))
46+
yield Union(dbtype(cls.name), (dbtype(c) for c in cls.derived if not lookup[c].ipa))
4547
dir = pathlib.Path(cls.group) if cls.group else None
4648
# output a table specific to a class only if it is a leaf class or it has 1-to-1 properties
4749
# Leaf classes need a table to bind the `@` ids
@@ -96,7 +98,7 @@ def cls_to_dbscheme(cls: schema.Class, add_or_none_except: typing.Optional[str]
9698

9799
def get_declarations(data: schema.Schema):
98100
add_or_none_except = data.root_class.name if data.null else None
99-
declarations = [d for cls in data.classes.values() for d in cls_to_dbscheme(cls, add_or_none_except)]
101+
declarations = [d for cls in data.classes.values() for d in cls_to_dbscheme(cls, data.classes, add_or_none_except)]
100102
if data.null:
101103
property_classes = {
102104
prop.type for cls in data.classes.values() for prop in cls.properties

swift/codegen/test/test_dbschemegen.py

Lines changed: 76 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,9 @@ def test_final_class_with_more_fields(generate, dir_param):
255255

256256
def test_empty_class_with_derived(generate):
257257
assert generate([
258-
schema.Class(
259-
name="Base", derived={"Left", "Right"}),
258+
schema.Class(name="Base", derived={"Left", "Right"}),
259+
schema.Class(name="Left", bases=["Base"]),
260+
schema.Class(name="Right", bases=["Base"]),
260261
]) == dbscheme.Scheme(
261262
src=schema_file,
262263
includes=[],
@@ -265,6 +266,14 @@ def test_empty_class_with_derived(generate):
265266
lhs="@base",
266267
rhs=["@left", "@right"],
267268
),
269+
dbscheme.Table(
270+
name="lefts",
271+
columns=[dbscheme.Column("id", "@left", binding=True)],
272+
),
273+
dbscheme.Table(
274+
name="rights",
275+
columns=[dbscheme.Column("id", "@right", binding=True)],
276+
),
268277
],
269278
)
270279

@@ -278,6 +287,8 @@ def test_class_with_derived_and_single_property(generate, dir_param):
278287
properties=[
279288
schema.SingleProperty("single", "Prop"),
280289
]),
290+
schema.Class(name="Left", bases=["Base"]),
291+
schema.Class(name="Right", bases=["Base"]),
281292
]) == dbscheme.Scheme(
282293
src=schema_file,
283294
includes=[],
@@ -294,7 +305,15 @@ def test_class_with_derived_and_single_property(generate, dir_param):
294305
dbscheme.Column('single', '@prop'),
295306
],
296307
dir=dir_param.expected,
297-
)
308+
),
309+
dbscheme.Table(
310+
name="lefts",
311+
columns=[dbscheme.Column("id", "@left", binding=True)],
312+
),
313+
dbscheme.Table(
314+
name="rights",
315+
columns=[dbscheme.Column("id", "@right", binding=True)],
316+
),
298317
],
299318
)
300319

@@ -308,6 +327,8 @@ def test_class_with_derived_and_optional_property(generate, dir_param):
308327
properties=[
309328
schema.OptionalProperty("opt", "Prop"),
310329
]),
330+
schema.Class(name="Left", bases=["Base"]),
331+
schema.Class(name="Right", bases=["Base"]),
311332
]) == dbscheme.Scheme(
312333
src=schema_file,
313334
includes=[],
@@ -324,7 +345,15 @@ def test_class_with_derived_and_optional_property(generate, dir_param):
324345
dbscheme.Column('opt', '@prop'),
325346
],
326347
dir=dir_param.expected,
327-
)
348+
),
349+
dbscheme.Table(
350+
name="lefts",
351+
columns=[dbscheme.Column("id", "@left", binding=True)],
352+
),
353+
dbscheme.Table(
354+
name="rights",
355+
columns=[dbscheme.Column("id", "@right", binding=True)],
356+
),
328357
],
329358
)
330359

@@ -338,6 +367,8 @@ def test_class_with_derived_and_repeated_property(generate, dir_param):
338367
properties=[
339368
schema.RepeatedProperty("rep", "Prop"),
340369
]),
370+
schema.Class(name="Left", bases=["Base"]),
371+
schema.Class(name="Right", bases=["Base"]),
341372
]) == dbscheme.Scheme(
342373
src=schema_file,
343374
includes=[],
@@ -355,7 +386,15 @@ def test_class_with_derived_and_repeated_property(generate, dir_param):
355386
dbscheme.Column('rep', '@prop'),
356387
],
357388
dir=dir_param.expected,
358-
)
389+
),
390+
dbscheme.Table(
391+
name="lefts",
392+
columns=[dbscheme.Column("id", "@left", binding=True)],
393+
),
394+
dbscheme.Table(
395+
name="rights",
396+
columns=[dbscheme.Column("id", "@right", binding=True)],
397+
),
359398
],
360399
)
361400

@@ -469,5 +508,37 @@ def test_null_class(generate):
469508
)
470509

471510

511+
def test_ipa_classes_ignored(generate):
512+
assert generate([
513+
schema.Class(name="A", ipa=schema.IpaInfo()),
514+
schema.Class(name="B", ipa=schema.IpaInfo(from_class="A")),
515+
schema.Class(name="C", ipa=schema.IpaInfo(on_arguments={"x": "A"})),
516+
]) == dbscheme.Scheme(
517+
src=schema_file,
518+
includes=[],
519+
declarations=[],
520+
)
521+
522+
523+
def test_ipa_derived_classes_ignored(generate):
524+
assert generate([
525+
schema.Class(name="A", derived={"B", "C"}),
526+
schema.Class(name="B", bases=["A"], ipa=schema.IpaInfo()),
527+
schema.Class(name="C", bases=["A"]),
528+
]) == dbscheme.Scheme(
529+
src=schema_file,
530+
includes=[],
531+
declarations=[
532+
dbscheme.Union("@a", ["@c"]),
533+
dbscheme.Table(
534+
name="cs",
535+
columns=[
536+
dbscheme.Column("id", "@c", binding=True),
537+
],
538+
)
539+
],
540+
)
541+
542+
472543
if __name__ == '__main__':
473544
sys.exit(pytest.main([__file__] + sys.argv[1:]))

swift/ql/lib/swift.dbscheme

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ callable_bodies(
5252

5353
@file =
5454
@db_file
55-
| @unknown_file
5655
;
5756

5857
#keyset[id]
@@ -77,7 +76,6 @@ locatable_locations(
7776

7877
@location =
7978
@db_location
80-
| @unknown_location
8179
;
8280

8381
#keyset[id]
@@ -135,14 +133,6 @@ diagnostics(
135133
| @unspecified_element
136134
;
137135

138-
unknown_files(
139-
unique int id: @unknown_file
140-
);
141-
142-
unknown_locations(
143-
unique int id: @unknown_location
144-
);
145-
146136
unspecified_elements(
147137
unique int id: @unspecified_element,
148138
string property: string ref,
@@ -941,7 +931,6 @@ lazy_initializer_exprs( //dir=expr
941931
@lookup_expr =
942932
@dynamic_lookup_expr
943933
| @member_ref_expr
944-
| @method_ref_expr
945934
| @subscript_expr
946935
;
947936

@@ -1334,10 +1323,6 @@ metatype_conversion_exprs( //dir=expr
13341323
unique int id: @metatype_conversion_expr
13351324
);
13361325

1337-
method_ref_exprs( //dir=expr
1338-
unique int id: @method_ref_expr
1339-
);
1340-
13411326
nil_literal_exprs( //dir=expr
13421327
unique int id: @nil_literal_expr
13431328
);

0 commit comments

Comments
 (0)