parser: simplify other node constructors

pull/12152/head
Charles Brunet 2 years ago
parent 13ddf8bd02
commit 5b29eff8ad
  1. 6
      mesonbuild/cargo/builder.py
  2. 6
      mesonbuild/cmake/interpreter.py
  3. 35
      mesonbuild/mparser.py
  4. 10
      mesonbuild/rewriter.py

@ -71,7 +71,7 @@ def array(value: T.List[mparser.BaseNode], filename: str) -> mparser.ArrayNode:
""" """
args = mparser.ArgumentNode(_token('array', filename, 'unused')) args = mparser.ArgumentNode(_token('array', filename, 'unused'))
args.arguments = value args.arguments = value
return mparser.ArrayNode(_symbol(filename, '['), args, _symbol(filename, ']'), -1, -1, -1, -1) return mparser.ArrayNode(_symbol(filename, '['), args, _symbol(filename, ']'))
def identifier(value: str, filename: str) -> mparser.IdNode: def identifier(value: str, filename: str) -> mparser.IdNode:
@ -101,7 +101,7 @@ def method(name: str, id_: mparser.IdNode,
args.arguments = pos args.arguments = pos
if kw is not None: if kw is not None:
args.kwargs = {identifier(k, id_.filename): v for k, v in kw.items()} args.kwargs = {identifier(k, id_.filename): v for k, v in kw.items()}
return mparser.MethodNode(id_.filename, -1, -1, id_, _symbol(id_.filename, '.'), identifier(name, id_.filename), _symbol(id_.filename, '('), args, _symbol(id_.filename, ')')) return mparser.MethodNode(id_, _symbol(id_.filename, '.'), identifier(name, id_.filename), _symbol(id_.filename, '('), args, _symbol(id_.filename, ')'))
def function(name: str, filename: str, def function(name: str, filename: str,
@ -121,7 +121,7 @@ def function(name: str, filename: str,
args.arguments = pos args.arguments = pos
if kw is not None: if kw is not None:
args.kwargs = {identifier(k, filename): v for k, v in kw.items()} args.kwargs = {identifier(k, filename): v for k, v in kw.items()}
return mparser.FunctionNode(filename, -1, -1, -1, -1, identifier(name, filename), _symbol(filename, '('), args, _symbol(filename, ')')) return mparser.FunctionNode(identifier(name, filename), _symbol(filename, '('), args, _symbol(filename, ')'))
def equal(lhs: mparser.BaseNode, rhs: mparser.BaseNode) -> mparser.ComparisonNode: def equal(lhs: mparser.BaseNode, rhs: mparser.BaseNode) -> mparser.ComparisonNode:

@ -995,7 +995,7 @@ class CMakeInterpreter:
if not isinstance(elements, list): if not isinstance(elements, list):
elements = [args] elements = [args]
args.arguments += [nodeify(x) for x in elements if x is not None] args.arguments += [nodeify(x) for x in elements if x is not None]
return ArrayNode(symbol('['), args, symbol(']'), 0, 0, 0, 0) return ArrayNode(symbol('['), args, symbol(']'))
def function(name: str, args: T.Optional[TYPE_mixed_list] = None, kwargs: T.Optional[TYPE_mixed_kwargs] = None) -> FunctionNode: def function(name: str, args: T.Optional[TYPE_mixed_list] = None, kwargs: T.Optional[TYPE_mixed_kwargs] = None) -> FunctionNode:
args = [] if args is None else args args = [] if args is None else args
@ -1006,7 +1006,7 @@ class CMakeInterpreter:
args = [args] args = [args]
args_n.arguments = [nodeify(x) for x in args if x is not None] args_n.arguments = [nodeify(x) for x in args if x is not None]
args_n.kwargs = {id_node(k): nodeify(v) for k, v in kwargs.items() if v is not None} args_n.kwargs = {id_node(k): nodeify(v) for k, v in kwargs.items() if v is not None}
func_n = FunctionNode(self.subdir.as_posix(), 0, 0, 0, 0, id_node(name), symbol('('), args_n, symbol(')')) func_n = FunctionNode(id_node(name), symbol('('), args_n, symbol(')'))
return func_n return func_n
def method(obj: BaseNode, name: str, args: T.Optional[TYPE_mixed_list] = None, kwargs: T.Optional[TYPE_mixed_kwargs] = None) -> MethodNode: def method(obj: BaseNode, name: str, args: T.Optional[TYPE_mixed_list] = None, kwargs: T.Optional[TYPE_mixed_kwargs] = None) -> MethodNode:
@ -1018,7 +1018,7 @@ class CMakeInterpreter:
args = [args] args = [args]
args_n.arguments = [nodeify(x) for x in args if x is not None] args_n.arguments = [nodeify(x) for x in args if x is not None]
args_n.kwargs = {id_node(k): nodeify(v) for k, v in kwargs.items() if v is not None} args_n.kwargs = {id_node(k): nodeify(v) for k, v in kwargs.items() if v is not None}
return MethodNode(self.subdir.as_posix(), 0, 0, obj, symbol('.'), id_node(name), symbol('('), args_n, symbol(')')) return MethodNode(obj, symbol('.'), id_node(name), symbol('('), args_n, symbol(')'))
def assign(var_name: str, value: BaseNode) -> AssignmentNode: def assign(var_name: str, value: BaseNode) -> AssignmentNode:
return AssignmentNode(id_node(var_name), symbol('='), value) return AssignmentNode(id_node(var_name), symbol('='), value)

@ -376,9 +376,8 @@ class ArrayNode(BaseNode):
args: ArgumentNode args: ArgumentNode
rbracket: SymbolNode rbracket: SymbolNode
def __init__(self, lbracket: SymbolNode, args: ArgumentNode, rbracket: SymbolNode, def __init__(self, lbracket: SymbolNode, args: ArgumentNode, rbracket: SymbolNode):
lineno: int, colno: int, end_lineno: int, end_colno: int): super().__init__(lbracket.lineno, lbracket.colno, args.filename, end_lineno=rbracket.lineno, end_colno=rbracket.colno+1)
super().__init__(lineno, colno, args.filename, end_lineno=end_lineno, end_colno=end_colno)
self.lbracket = lbracket self.lbracket = lbracket
self.args = args self.args = args
self.rbracket = rbracket self.rbracket = rbracket
@ -390,9 +389,8 @@ class DictNode(BaseNode):
args: ArgumentNode args: ArgumentNode
rcurl: SymbolNode rcurl: SymbolNode
def __init__(self, lcurl: SymbolNode, args: ArgumentNode, rcurl: SymbolNode, def __init__(self, lcurl: SymbolNode, args: ArgumentNode, rcurl: SymbolNode):
lineno: int, colno: int, end_lineno: int, end_colno: int): super().__init__(lcurl.lineno, lcurl.colno, args.filename, end_lineno=rcurl.lineno, end_colno=rcurl.colno+1)
super().__init__(lineno, colno, args.filename, end_lineno=end_lineno, end_colno=end_colno)
self.lcurl = lcurl self.lcurl = lcurl
self.args = args self.args = args
self.rcurl = rcurl self.rcurl = rcurl
@ -490,9 +488,8 @@ class MethodNode(BaseNode):
args: ArgumentNode args: ArgumentNode
rpar: SymbolNode rpar: SymbolNode
def __init__(self, filename: str, lineno: int, colno: int, def __init__(self, source_object: BaseNode, dot: SymbolNode, name: IdNode, lpar: SymbolNode, args: ArgumentNode, rpar: SymbolNode):
source_object: BaseNode, dot: SymbolNode, name: IdNode, lpar: SymbolNode, args: ArgumentNode, rpar: SymbolNode): super().__init__(name.lineno, name.colno, name.filename, end_lineno=rpar.lineno, end_colno=rpar.colno+1)
super().__init__(lineno, colno, filename)
self.source_object = source_object self.source_object = source_object
self.dot = dot self.dot = dot
self.name = name self.name = name
@ -508,9 +505,8 @@ class FunctionNode(BaseNode):
args: ArgumentNode args: ArgumentNode
rpar: SymbolNode rpar: SymbolNode
def __init__(self, filename: str, lineno: int, colno: int, end_lineno: int, end_colno: int, def __init__(self, func_name: IdNode, lpar: SymbolNode, args: ArgumentNode, rpar: SymbolNode):
func_name: IdNode, lpar: SymbolNode, args: ArgumentNode, rpar: SymbolNode): super().__init__(func_name.lineno, func_name.colno, func_name.filename, end_lineno=rpar.end_lineno, end_colno=rpar.end_colno+1)
super().__init__(lineno, colno, filename, end_lineno=end_lineno, end_colno=end_colno)
self.func_name = func_name self.func_name = func_name
self.lpar = lpar self.lpar = lpar
self.args = args self.args = args
@ -631,8 +627,8 @@ class ParenthesizedNode(BaseNode):
inner: BaseNode inner: BaseNode
rpar: SymbolNode = field(hash=False) rpar: SymbolNode = field(hash=False)
def __init__(self, lpar: SymbolNode, inner: BaseNode, rpar: SymbolNode, lineno: int, colno: int, end_lineno: int, end_colno: int): def __init__(self, lpar: SymbolNode, inner: BaseNode, rpar: SymbolNode):
super().__init__(lineno, colno, inner.filename, end_lineno=end_lineno, end_colno=end_colno) super().__init__(lpar.lineno, lpar.colno, inner.filename, end_lineno=rpar.lineno, end_colno=rpar.colno+1)
self.lpar = lpar self.lpar = lpar
self.inner = inner self.inner = inner
self.rpar = rpar self.rpar = rpar
@ -850,7 +846,7 @@ class Parser:
raise ParseException('Function call must be applied to plain id', raise ParseException('Function call must be applied to plain id',
self.getline(), left.lineno, left.colno) self.getline(), left.lineno, left.colno)
assert isinstance(left.value, str) assert isinstance(left.value, str)
left = self.create_node(FunctionNode, left.filename, left.lineno, left.colno, self.current.lineno, self.current.colno, left, lpar, args, rpar) left = self.create_node(FunctionNode, left, lpar, args, rpar)
go_again = True go_again = True
while go_again: while go_again:
go_again = False go_again = False
@ -869,19 +865,19 @@ class Parser:
e = self.statement() e = self.statement()
self.block_expect('rparen', block_start) self.block_expect('rparen', block_start)
rpar = self.create_node(SymbolNode, self.previous) rpar = self.create_node(SymbolNode, self.previous)
return ParenthesizedNode(lpar, e, rpar, block_start.lineno, block_start.colno, self.current.lineno, self.current.colno) return ParenthesizedNode(lpar, e, rpar)
elif self.accept('lbracket'): elif self.accept('lbracket'):
lbracket = self.create_node(SymbolNode, block_start) lbracket = self.create_node(SymbolNode, block_start)
args = self.args() args = self.args()
self.block_expect('rbracket', block_start) self.block_expect('rbracket', block_start)
rbracket = self.create_node(SymbolNode, self.previous) rbracket = self.create_node(SymbolNode, self.previous)
return self.create_node(ArrayNode, lbracket, args, rbracket, block_start.lineno, block_start.colno, self.current.lineno, self.current.colno) return self.create_node(ArrayNode, lbracket, args, rbracket)
elif self.accept('lcurl'): elif self.accept('lcurl'):
lcurl = self.create_node(SymbolNode, block_start) lcurl = self.create_node(SymbolNode, block_start)
key_values = self.key_values() key_values = self.key_values()
self.block_expect('rcurl', block_start) self.block_expect('rcurl', block_start)
rcurl = self.create_node(SymbolNode, self.previous) rcurl = self.create_node(SymbolNode, self.previous)
return self.create_node(DictNode, lcurl, key_values, rcurl, block_start.lineno, block_start.colno, self.current.lineno, self.current.colno) return self.create_node(DictNode, lcurl, key_values, rcurl)
else: else:
return self.e9() return self.e9()
@ -962,8 +958,7 @@ class Parser:
args = self.args() args = self.args()
rpar = self.create_node(SymbolNode, self.current) rpar = self.create_node(SymbolNode, self.current)
self.expect('rparen') self.expect('rparen')
method = self.create_node(MethodNode, methodname.filename, methodname.lineno, methodname.colno, method = self.create_node(MethodNode, source_object, dot, methodname, lpar, args, rpar)
source_object, dot, methodname, lpar, args, rpar)
if self.accept('dot'): if self.accept('dot'):
return self.method_call(method) return self.method_call(method)
return method return method

@ -192,7 +192,7 @@ class MTypeList(MTypeBase):
super().__init__(node) super().__init__(node)
def _new_node(self): def _new_node(self):
return ArrayNode(_symbol('['), ArgumentNode(Token('', '', 0, 0, 0, None, '')), _symbol(']'), 0, 0, 0, 0) return ArrayNode(_symbol('['), ArgumentNode(Token('', '', 0, 0, 0, None, '')), _symbol(']'))
def _new_element_node(self, value): def _new_element_node(self, value):
# Overwrite in derived class # Overwrite in derived class
@ -731,7 +731,7 @@ class Rewriter:
node = tgt_function.args.kwargs[extra_files_key] node = tgt_function.args.kwargs[extra_files_key]
except StopIteration: except StopIteration:
# Target has no extra_files kwarg, create one # Target has no extra_files kwarg, create one
node = ArrayNode(_symbol('['), ArgumentNode(Token('', tgt_function.filename, 0, 0, 0, None, '[]')), _symbol(']'), tgt_function.end_lineno, tgt_function.end_colno, tgt_function.end_lineno, tgt_function.end_colno) node = ArrayNode(_symbol('['), ArgumentNode(Token('', tgt_function.filename, 0, 0, 0, None, '[]')), _symbol(']'))
tgt_function.args.kwargs[IdNode(Token('string', tgt_function.filename, 0, 0, 0, None, 'extra_files'))] = node tgt_function.args.kwargs[IdNode(Token('string', tgt_function.filename, 0, 0, 0, None, 'extra_files'))] = node
mark_array = False mark_array = False
if tgt_function not in self.modified_nodes: if tgt_function not in self.modified_nodes:
@ -815,16 +815,16 @@ class Rewriter:
# Build src list # Build src list
src_arg_node = ArgumentNode(Token('string', filename, 0, 0, 0, None, '')) src_arg_node = ArgumentNode(Token('string', filename, 0, 0, 0, None, ''))
src_arr_node = ArrayNode(_symbol('['), src_arg_node, _symbol(']'), 0, 0, 0, 0) src_arr_node = ArrayNode(_symbol('['), src_arg_node, _symbol(']'))
src_far_node = ArgumentNode(Token('string', filename, 0, 0, 0, None, '')) src_far_node = ArgumentNode(Token('string', filename, 0, 0, 0, None, ''))
src_fun_node = FunctionNode(filename, 0, 0, 0, 0, IdNode(Token('id', filename, 0, 0, 0, (0, 0), 'files')), _symbol('('), src_far_node, _symbol(')')) src_fun_node = FunctionNode(IdNode(Token('id', filename, 0, 0, 0, (0, 0), 'files')), _symbol('('), src_far_node, _symbol(')'))
src_ass_node = AssignmentNode(IdNode(Token('id', filename, 0, 0, 0, (0, 0), source_id)), _symbol('='), src_fun_node) src_ass_node = AssignmentNode(IdNode(Token('id', filename, 0, 0, 0, (0, 0), source_id)), _symbol('='), src_fun_node)
src_arg_node.arguments = [StringNode(Token('string', filename, 0, 0, 0, None, x)) for x in cmd['sources']] src_arg_node.arguments = [StringNode(Token('string', filename, 0, 0, 0, None, x)) for x in cmd['sources']]
src_far_node.arguments = [src_arr_node] src_far_node.arguments = [src_arr_node]
# Build target # Build target
tgt_arg_node = ArgumentNode(Token('string', filename, 0, 0, 0, None, '')) tgt_arg_node = ArgumentNode(Token('string', filename, 0, 0, 0, None, ''))
tgt_fun_node = FunctionNode(filename, 0, 0, 0, 0, IdNode(Token('id', filename, 0, 0, 0, (0, 0), cmd['target_type'])), _symbol('('), tgt_arg_node, _symbol(')')) tgt_fun_node = FunctionNode(IdNode(Token('id', filename, 0, 0, 0, (0, 0), cmd['target_type'])), _symbol('('), tgt_arg_node, _symbol(')'))
tgt_ass_node = AssignmentNode(IdNode(Token('id', filename, 0, 0, 0, (0, 0), target_id)), _symbol('='), tgt_fun_node) tgt_ass_node = AssignmentNode(IdNode(Token('id', filename, 0, 0, 0, (0, 0), target_id)), _symbol('='), tgt_fun_node)
tgt_arg_node.arguments = [ tgt_arg_node.arguments = [
StringNode(Token('string', filename, 0, 0, 0, None, cmd['target'])), StringNode(Token('string', filename, 0, 0, 0, None, cmd['target'])),

Loading…
Cancel
Save