Browse Source

Fixed v_args handling of staticmethod and classmethod (Issue #246, #249)

tags/gm/2021-09-23T00Z/github.com--lark-parser-lark/0.6.5
Erez Shinan 7 years ago
parent
commit
216c341b06
2 changed files with 26 additions and 2 deletions
  1. +7
    -2
      lark/visitors.py
  2. +19
    -0
      tests/test_trees.py

+ 7
- 2
lark/visitors.py View File

@@ -69,6 +69,8 @@ class Transformer:
if name.startswith('_') or name in libmembers:
continue

if isinstance(cls.__dict__[name], (staticmethod, classmethod)):
kwargs['static'] = True
setattr(cls, name, decorator(value, **kwargs))
return cls

@@ -225,7 +227,7 @@ def inline_args(obj): # XXX Deprecated



def _visitor_args_func_dec(func, inline=False, meta=False, whole_tree=False):
def _visitor_args_func_dec(func, inline=False, meta=False, whole_tree=False, static=False):
assert [whole_tree, meta, inline].count(True) <= 1
def create_decorator(_f, with_self):
if with_self:
@@ -236,7 +238,10 @@ def _visitor_args_func_dec(func, inline=False, meta=False, whole_tree=False):
return _f(*args, **kwargs)
return f

f = smart_decorator(func, create_decorator)
if static:
f = wraps(func)(create_decorator(func, False))
else:
f = smart_decorator(func, create_decorator)
f.inline = inline
f.meta = meta
f.whole_tree = whole_tree


+ 19
- 0
tests/test_trees.py View File

@@ -97,6 +97,25 @@ class TestTrees(TestCase):
res = T().transform(t)
self.assertEqual(res, 2.9)

def test_vargs(self):
@v_args()
class MyTransformer(Transformer):
@staticmethod
def integer(args):
return 1 # some code here

@classmethod
def integer2(cls, args):
return 2 # some code here

hello = staticmethod(lambda args: 'hello')

x = MyTransformer().transform( Tree('integer', [2]))
self.assertEqual(x, 1)
x = MyTransformer().transform( Tree('integer2', [2]))
self.assertEqual(x, 2)
x = MyTransformer().transform( Tree('hello', [2]))
self.assertEqual(x, 'hello')


if __name__ == '__main__':


Loading…
Cancel
Save