@@ -1399,6 +1399,7 @@ class SchemaConverter:
13991399 def __init__ (self , prop_order ):
14001400 self ._prop_order = prop_order
14011401 self ._rules = {"space" : SPACE_RULE }
1402+ self ._defs = {}
14021403
14031404 def _format_literal (self , literal ):
14041405 escaped = GRAMMAR_LITERAL_ESCAPE_RE .sub (
@@ -1422,6 +1423,11 @@ def visit(self, schema, name):
14221423 schema_type = schema .get ("type" )
14231424 rule_name = name or "root"
14241425
1426+ if "$defs" in schema :
1427+ # add defs to self._defs for later inlining
1428+ for def_name , def_schema in schema ["$defs" ].items ():
1429+ self ._defs [def_name ] = def_schema
1430+
14251431 if "oneOf" in schema or "anyOf" in schema :
14261432 rule = " | " .join (
14271433 (
@@ -1471,6 +1477,14 @@ def visit(self, schema, name):
14711477 )
14721478 return self ._add_rule (rule_name , rule )
14731479
1480+ elif "$ref" in schema :
1481+ ref = schema ["$ref" ]
1482+ assert ref .startswith ("#/$defs/" ), f"Unrecognized schema: { schema } "
1483+ # inline $defs
1484+ def_name = ref [len ("#/$defs/" ) :]
1485+ def_schema = self ._defs [def_name ]
1486+ return self .visit (def_schema , f'{ name } { "-" if name else "" } { def_name } ' )
1487+
14741488 else :
14751489 assert schema_type in PRIMITIVE_RULES , f"Unrecognized schema: { schema } "
14761490 return self ._add_rule (
0 commit comments