@@ -177,19 +177,31 @@ def _parse_arg(mcs, arg):
177177 return Rule .annotate (__origin , * _new_args )
178178
179179 def resolve_forward_refs (cls ):
180- if not cls .combinator :
181- return
180+ # if not cls.combinator:
181+ # return
182+ origin_resolved = False
183+ arg_resolved = False
184+ origin = getattr (cls , "__origin__" , None )
185+
186+ if origin is not None :
187+ origin , origin_resolved = resolve_forward_type (origin )
188+
189+ if origin_resolved :
190+ setattr (cls , "__origin__" , cls ._parse_arg (origin ))
191+
182192 args = []
183- resolved = False
184193 for i , arg in enumerate (cls .args ):
185194 arg , resolved = resolve_forward_type (arg )
186195 if resolved :
187196 arg = cls ._parse_arg (arg )
197+ arg_resolved = True
188198 args .append (arg )
189- if resolved :
199+
200+ if arg_resolved :
190201 # only adjust args if resolved
191202 setattr (cls , "__args__" , tuple (args ))
192- return resolved
203+
204+ return origin_resolved or arg_resolved
193205
194206 def register_forward_refs (
195207 cls ,
@@ -1322,6 +1334,7 @@ def annotate(
13221334 constraints : Dict [str , Any ] = None ,
13231335 global_vars : Dict [str , Any ] = None ,
13241336 forward_refs = None ,
1337+ forward_key = None ,
13251338 force_clear_refs = False ,
13261339 options = None ,
13271340 bound = None ,
@@ -1378,6 +1391,7 @@ def annotate(
13781391 global_vars = global_vars ,
13791392 forward_refs = forward_refs ,
13801393 force_clear_refs = force_clear_refs ,
1394+ forward_key = forward_key ,
13811395 bound = bound
13821396 )
13831397 # this annotation can be a ForwardRef
@@ -1508,6 +1522,7 @@ def parse_annotation(
15081522 forward_refs = forward_refs ,
15091523 global_vars = global_vars ,
15101524 force_clear_refs = force_clear_refs ,
1525+ forward_key = forward_key ,
15111526 bound = bound
15121527 )
15131528 elif annotation :
@@ -1533,6 +1548,7 @@ def parse_annotation(
15331548 forward_refs = forward_refs ,
15341549 global_vars = global_vars ,
15351550 force_clear_refs = force_clear_refs ,
1551+ forward_key = forward_key ,
15361552 bound = bound
15371553 )
15381554 return None
@@ -1845,34 +1861,42 @@ def _parse_contains(cls, value, context: RuntimeContext):
18451861 @classmethod
18461862 def resolve_forward_refs (cls ):
18471863 # an override version of LogicalType.resolve_forward_refs
1848- if not cls .__args__ :
1849- return False
1850- args = []
1851- arg_transformers = []
1852- resolved = False
1853- for arg , trans in zip (cls .__args__ , cls .__arg_transformers__ ):
1854- if isinstance (arg , LogicalType ):
1855- # including the Rule class and LogicalType with combinator
1856- if arg .resolve_forward_refs ():
1857- resolved = True
1858- elif isinstance (arg , ForwardRef ):
1859- if arg .__forward_evaluated__ :
1860- arg = arg .__forward_value__
1861- resolved = True
1862- transformer = cls .transformer_cls .resolver_transformer (arg )
1863- if not transformer :
1864- warning_settings .warn (
1865- f"{ cls } : arg type: { arg } got no transformer resolved, "
1866- f"will just pass { arg } (data) at runtime" ,
1867- warning_settings .rule_no_arg_transformer
1868- )
1869- trans = transformer or trans
1870- args .append (arg )
1871- arg_transformers .append (trans )
1872- if resolved :
1873- cls .__args__ = tuple (args )
1874- cls .__arg_transformers__ = tuple (arg_transformers )
1875- return resolved
1864+ origin_resolved = False
1865+ args_resolved = False
1866+
1867+ if cls .__origin__ :
1868+ origin , origin_resolved = resolve_forward_type (cls .__origin__ )
1869+ if origin_resolved :
1870+ cls .__origin__ = origin
1871+
1872+ if cls .__args__ :
1873+ args = []
1874+ arg_transformers = []
1875+
1876+ for arg , trans in zip (cls .__args__ , cls .__arg_transformers__ ):
1877+ if isinstance (arg , LogicalType ):
1878+ # including the Rule class and LogicalType with combinator
1879+ if arg .resolve_forward_refs ():
1880+ args_resolved = True
1881+ elif isinstance (arg , ForwardRef ):
1882+ if arg .__forward_evaluated__ :
1883+ arg = arg .__forward_value__
1884+ args_resolved = True
1885+ transformer = cls .transformer_cls .resolver_transformer (arg )
1886+ if not transformer :
1887+ warning_settings .warn (
1888+ f"{ cls } : arg type: { arg } got no transformer resolved, "
1889+ f"will just pass { arg } (data) at runtime" ,
1890+ warning_settings .rule_no_arg_transformer
1891+ )
1892+ trans = transformer or trans
1893+ args .append (arg )
1894+ arg_transformers .append (trans )
1895+ if args_resolved :
1896+ cls .__args__ = tuple (args )
1897+ cls .__arg_transformers__ = tuple (arg_transformers )
1898+
1899+ return origin_resolved or args_resolved
18761900
18771901 @classmethod
18781902 def resolve_args_parser (cls ):
@@ -2058,6 +2082,6 @@ def transform_callable(transformer: TypeTransformer, value, t):
20582082 return value
20592083
20602084
2061- @TypeTransformer .registry .register (metaclass = LogicalType )
2085+ @TypeTransformer .registry .register (metaclass = LogicalType , volatile = True )
20622086def transform_rule (transformer : TypeTransformer , value , t : LogicalType ):
20632087 return t (value , context = transformer .context )
0 commit comments