@@ -1399,6 +1399,7 @@ class SchemaConverter:
1399
1399
def __init__ (self , prop_order ):
1400
1400
self ._prop_order = prop_order
1401
1401
self ._rules = {"space" : SPACE_RULE }
1402
+ self ._defs = {}
1402
1403
1403
1404
def _format_literal (self , literal ):
1404
1405
escaped = GRAMMAR_LITERAL_ESCAPE_RE .sub (
@@ -1422,6 +1423,11 @@ def visit(self, schema, name):
1422
1423
schema_type = schema .get ("type" )
1423
1424
rule_name = name or "root"
1424
1425
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
+
1425
1431
if "oneOf" in schema or "anyOf" in schema :
1426
1432
rule = " | " .join (
1427
1433
(
@@ -1471,6 +1477,14 @@ def visit(self, schema, name):
1471
1477
)
1472
1478
return self ._add_rule (rule_name , rule )
1473
1479
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
+
1474
1488
else :
1475
1489
assert schema_type in PRIMITIVE_RULES , f"Unrecognized schema: { schema } "
1476
1490
return self ._add_rule (
0 commit comments