@@ -431,7 +431,7 @@ class Compiler(Grammar, pickleable_obj):
431431 ]
432432
433433 def __init__ (self , * args , ** kwargs ):
434- """Creates a new compiler with the given parsing parameters."""
434+ """Create a new compiler with the given parsing parameters."""
435435 self .setup (* args , ** kwargs )
436436 self .reset ()
437437
@@ -467,7 +467,7 @@ def setup(self, target=None, strict=False, minify=False, line_numbers=True, keep
467467 self .no_wrap = no_wrap
468468
469469 def __reduce__ (self ):
470- """Return pickling information."""
470+ """Get pickling information."""
471471 return (self .__class__ , (self .target , self .strict , self .minify , self .line_numbers , self .keep_lines , self .no_tco , self .no_wrap ))
472472
473473 def get_cli_args (self ):
@@ -644,6 +644,8 @@ def method(original, loc, tokens_or_item):
644644 if trim_arity :
645645 self_method = _trim_arity (self_method )
646646 return self_method (original , loc , tokens_or_item )
647+ if kwargs :
648+ method .__name__ = py_str (method .__name__ + "$(" + ", " .join (str (k ) + "=" + repr (v ) for k , v in kwargs .items ()) + ")" )
647649 internal_assert (
648650 hasattr (cls_method , "ignore_arguments" ) is hasattr (method , "ignore_arguments" )
649651 and hasattr (cls_method , "ignore_no_tokens" ) is hasattr (method , "ignore_no_tokens" )
@@ -1086,18 +1088,20 @@ def wrap_comment(self, text):
10861088 """Wrap a comment."""
10871089 return "#" + self .add_ref ("comment" , text ) + unwrapper
10881090
1089- def wrap_error (self , error ):
1091+ def wrap_error (self , error_maker ):
10901092 """Create a symbol that will raise the given error in postprocessing."""
1091- return errwrapper + self .add_ref ("error " , error ) + unwrapper
1093+ return errwrapper + self .add_ref ("error_maker " , error_maker ) + unwrapper
10921094
1093- def raise_or_wrap_error (self , error ):
1094- """Raise if USE_COMPUTATION_GRAPH else wrap."""
1095+ def raise_or_wrap_error (self , * args , ** kwargs ):
1096+ """Raise or defer if USE_COMPUTATION_GRAPH else wrap."""
1097+ error_maker = partial (self .make_err , * args , ** kwargs )
10951098 if not USE_COMPUTATION_GRAPH :
1096- return self .wrap_error (error )
1099+ return self .wrap_error (error_maker )
1100+ # differently-ordered any ofs can push these errors earlier than they should be, requiring us to defer them
10971101 elif use_adaptive_any_of or reverse_any_of :
1098- return ExceptionNode (error )
1102+ return ExceptionNode (error_maker )
10991103 else :
1100- raise error
1104+ raise error_maker ()
11011105
11021106 def type_ignore_comment (self ):
11031107 """Get a "type: ignore" comment."""
@@ -2742,7 +2746,7 @@ def deferred_code_proc(self, inputstring, add_code_at_start=False, ignore_names=
27422746 pre_err_line , err_line = raw_line .split (errwrapper , 1 )
27432747 err_ref , post_err_line = err_line .split (unwrapper , 1 )
27442748 if not ignore_errors :
2745- raise self .get_ref ("error " , err_ref )
2749+ raise self .get_ref ("error_maker " , err_ref )( )
27462750 raw_line = pre_err_line + " " + post_err_line
27472751
27482752 # look for functions
@@ -4890,6 +4894,7 @@ def where_stmt_handle(self, loc, tokens):
48904894
48914895 where_assigns = self .current_parsing_context ("where" )["assigns" ]
48924896 internal_assert (lambda : where_assigns is not None , "missing where_assigns" )
4897+ print (where_assigns )
48934898
48944899 where_init = "" .join (body_stmts )
48954900 where_final = main_stmt + "\n "
@@ -4989,7 +4994,8 @@ def name_handle(self, original, loc, tokens, assign=False, classname=False, expr
49894994 if self .disable_name_check :
49904995 return name
49914996
4992- if assign :
4997+ # register non-mid-expression variable assignments inside of where statements for later mangling
4998+ if assign and not expr_setname :
49934999 where_context = self .current_parsing_context ("where" )
49945000 if where_context is not None :
49955001 where_assigns = where_context ["assigns" ]
@@ -5020,13 +5026,11 @@ def name_handle(self, original, loc, tokens, assign=False, classname=False, expr
50205026 if typevar_info ["typevar_locs" ].get (name , None ) != loc :
50215027 if assign :
50225028 return self .raise_or_wrap_error (
5023- self .make_err (
5024- CoconutSyntaxError ,
5025- "cannot reassign type variable '{name}'" .format (name = name ),
5026- original ,
5027- loc ,
5028- extra = "use explicit '\\ {name}' syntax if intended" .format (name = name ),
5029- ),
5029+ CoconutSyntaxError ,
5030+ "cannot reassign type variable '{name}'" .format (name = name ),
5031+ original ,
5032+ loc ,
5033+ extra = "use explicit '\\ {name}' syntax if intended" .format (name = name ),
50305034 )
50315035 return typevars [name ]
50325036
@@ -5057,13 +5061,11 @@ def name_handle(self, original, loc, tokens, assign=False, classname=False, expr
50575061 return name
50585062 elif assign :
50595063 return self .raise_or_wrap_error (
5060- self .make_err (
5061- CoconutTargetError ,
5062- "found Python-3-only assignment to 'exec' as a variable name" ,
5063- original ,
5064- loc ,
5065- target = "3" ,
5066- ),
5064+ CoconutTargetError ,
5065+ "found Python-3-only assignment to 'exec' as a variable name" ,
5066+ original ,
5067+ loc ,
5068+ target = "3" ,
50675069 )
50685070 else :
50695071 return "_coconut_exec"
@@ -5076,12 +5078,10 @@ def name_handle(self, original, loc, tokens, assign=False, classname=False, expr
50765078 return name
50775079 elif not escaped and name .startswith (reserved_prefix ) and name not in self .operators :
50785080 return self .raise_or_wrap_error (
5079- self .make_err (
5080- CoconutSyntaxError ,
5081- "variable names cannot start with reserved prefix '{prefix}' (use explicit '\\ {name}' syntax if intending to access Coconut internals)" .format (prefix = reserved_prefix , name = name ),
5082- original ,
5083- loc ,
5084- ),
5081+ CoconutSyntaxError ,
5082+ "variable names cannot start with reserved prefix '{prefix}' (use explicit '\\ {name}' syntax if intending to access Coconut internals)" .format (prefix = reserved_prefix , name = name ),
5083+ original ,
5084+ loc ,
50855085 )
50865086 else :
50875087 return name
@@ -5104,7 +5104,7 @@ def check_strict(self, name, original, loc, tokens=(None,), only_warn=False, alw
51045104 else :
51055105 if always_warn :
51065106 kwargs ["extra" ] = "remove --strict to downgrade to a warning"
5107- return self .raise_or_wrap_error (self . make_err ( CoconutStyleError , message , original , loc , ** kwargs ) )
5107+ return self .raise_or_wrap_error (CoconutStyleError , message , original , loc , ** kwargs )
51085108 elif always_warn :
51095109 self .syntax_warning (message , original , loc )
51105110 return tokens [0 ]
@@ -5145,13 +5145,13 @@ def check_py(self, version, name, original, loc, tokens):
51455145 self .internal_assert (len (tokens ) == 1 , original , loc , "invalid " + name + " tokens" , tokens )
51465146 version_info = get_target_info (version )
51475147 if self .target_info < version_info :
5148- return self .raise_or_wrap_error (self . make_err (
5148+ return self .raise_or_wrap_error (
51495149 CoconutTargetError ,
51505150 "found Python " + "." .join (str (v ) for v in version_info ) + " " + name ,
51515151 original ,
51525152 loc ,
51535153 target = version ,
5154- ))
5154+ )
51555155 else :
51565156 return tokens [0 ]
51575157
0 commit comments