@@ -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
8890def _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
118120class 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 )
@@ -237,6 +240,10 @@ def get_ql_class(self, cls: schema.Class) -> ql.Class:
237240 hideable = "ql_hideable" in cls .pragmas ,
238241 internal = "ql_internal" in cls .pragmas ,
239242 cfg = cls .cfg ,
243+ to_string_impl_from_primary_class = bool (
244+ cls .pragmas .get ("ql_to_string_impl_from_primary_class" )
245+ )
246+ and cls .name not in self .custom_to_string_impls ,
240247 )
241248 return self ._class_cache [cache_key ]
242249
@@ -496,7 +503,15 @@ def generate(opts, renderer):
496503
497504 data = schemaloader .load_file (input )
498505
499- 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 )
500515
501516 classes = {
502517 name : resolver .get_ql_class (cls )
@@ -522,7 +537,6 @@ def generate(opts, renderer):
522537 with renderer .manage (
523538 generated = generated , stubs = stubs , registry = registry , force = opts .force
524539 ) as renderer :
525-
526540 db_classes = [
527541 cls for name , cls in classes .items () if not data .classes [name ].synth
528542 ]
0 commit comments