Skip to content

Commit ed68b0e

Browse files
committed
Rust: Do not generate toStringImpl when manual definition exists
1 parent 1f05b41 commit ed68b0e

83 files changed

Lines changed: 106 additions & 243 deletions

Some content is hidden

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

misc/codegen/generators/qlgen.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ def _humanize(s: str) -> str:
8383

8484

8585
_format_re = re.compile(r"\{(\w+)\}")
86+
# Regular expression to find manual `toStringImpl`s
87+
_to_string_impl_re = re.compile(r"\bstring\s+toStringImpl\s*\(")
8688

8789

8890
def _get_doc(cls: schema.Class, prop: schema.Property, plural=None):
@@ -117,6 +119,7 @@ def _get_doc(cls: schema.Class, prop: schema.Property, plural=None):
117119
@dataclasses.dataclass
118120
class Resolver:
119121
lookup: typing.Dict[str, schema.ClassBase]
122+
custom_to_string_impls: typing.Set[str] = dataclasses.field(default_factory=set)
120123
_property_cache: typing.Dict[tuple[int, int], ql.Property] = dataclasses.field(
121124
default_factory=dict, init=False
122125
)
@@ -239,7 +242,8 @@ def get_ql_class(self, cls: schema.Class) -> ql.Class:
239242
cfg=cls.cfg,
240243
to_string_impl_from_primary_class=bool(
241244
cls.pragmas.get("ql_to_string_impl_from_primary_class")
242-
),
245+
)
246+
and cls.name not in self.custom_to_string_impls,
243247
)
244248
return self._class_cache[cache_key]
245249

@@ -499,7 +503,15 @@ def generate(opts, renderer):
499503

500504
data = schemaloader.load_file(input)
501505

502-
resolver = Resolver(data.classes)
506+
# Schema class names whose wrapper define a manual `toStringImpl`
507+
custom_to_string_impls = {
508+
cls.name
509+
for cls in data.classes.values()
510+
if not cls.imported
511+
and (stub_out / _get_path_impl(cls)).is_file()
512+
and _to_string_impl_re.search((stub_out / _get_path_impl(cls)).read_text())
513+
}
514+
resolver = Resolver(data.classes, custom_to_string_impls)
503515

504516
classes = {
505517
name: resolver.get_ql_class(cls)
@@ -525,7 +537,6 @@ def generate(opts, renderer):
525537
with renderer.manage(
526538
generated=generated, stubs=stubs, registry=registry, force=opts.force
527539
) as renderer:
528-
529540
db_classes = [
530541
cls for name, cls in classes.items() if not data.classes[name].synth
531542
]

misc/codegen/test/test_qlgen.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,18 @@ def test_to_string_impl_from_primary_class(generate_classes):
237237
}
238238

239239

240+
def test_to_string_impl_from_primary_class_is_not_generated_when_custom():
241+
cls = schema.Class(
242+
"A",
243+
pragmas={"ql_to_string_impl_from_primary_class": True},
244+
)
245+
# Pass `A` as a class with a custom `toStringImpl`
246+
resolver = qlgen.Resolver({"A": cls}, {"A"})
247+
248+
# Resolving `A` gives a class where `to_string_impl_from_primary_class` does not hold.
249+
assert not resolver.get_ql_class(cls).to_string_impl_from_primary_class
250+
251+
240252
def test_one_empty_internal_class(generate_classes):
241253
assert generate_classes([schema.Class("A", pragmas=["ql_internal"])]) == {
242254
"A.qll": (

rust/ql/.generated.list

Lines changed: 80 additions & 80 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/ArrayListExpr.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/ArrayRepeatExpr.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/AwaitExpr.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/BecomeExpr.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/BinaryExpr.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/BoxPat.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

rust/ql/lib/codeql/rust/elements/internal/generated/BreakExpr.qll

Lines changed: 0 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)