diff options
author | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-04-20 20:38:59 +0200 |
---|---|---|
committer | Daniel Mensinger <daniel@mensinger-ka.de> | 2019-04-23 09:10:42 +0200 |
commit | 2bb4ec19f2ce290a348d54185cf5931c6d37aa58 (patch) | |
tree | e08ae4c28c844d5b64edbd51a143b67063b31df9 /mesonbuild/ast/interpreter.py | |
parent | add821db64b3c1fd7568736aaa67de53ad382eb4 (diff) | |
download | meson-2bb4ec19f2ce290a348d54185cf5931c6d37aa58.zip meson-2bb4ec19f2ce290a348d54185cf5931c6d37aa58.tar.gz meson-2bb4ec19f2ce290a348d54185cf5931c6d37aa58.tar.bz2 |
ast: resolve ID nodes in flatten_args
Diffstat (limited to 'mesonbuild/ast/interpreter.py')
-rw-r--r-- | mesonbuild/ast/interpreter.py | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/mesonbuild/ast/interpreter.py b/mesonbuild/ast/interpreter.py index a75c0b7..33271b9 100644 --- a/mesonbuild/ast/interpreter.py +++ b/mesonbuild/ast/interpreter.py @@ -20,9 +20,10 @@ from .. import interpreterbase, mparser, mesonlib from .. import environment from ..interpreterbase import InvalidArguments, BreakRequest, ContinueRequest +from ..mparser import BaseNode, ElementaryNode, IdNode, ArgumentNode, ArrayNode, AssignmentNode, PlusAssignmentNode, TernaryNode, EmptyNode import os, sys -from typing import List, Optional +from typing import List, Any, Optional class DontCareObject(interpreterbase.InterpreterObject): pass @@ -162,13 +163,13 @@ class AstInterpreter(interpreterbase.InterpreterBase): return 0 def evaluate_ternary(self, node): - assert(isinstance(node, mparser.TernaryNode)) + assert(isinstance(node, TernaryNode)) self.evaluate_statement(node.condition) self.evaluate_statement(node.trueblock) self.evaluate_statement(node.falseblock) def evaluate_plusassign(self, node): - assert(isinstance(node, mparser.PlusAssignmentNode)) + assert(isinstance(node, PlusAssignmentNode)) if node.var_name not in self.assignments: self.assignments[node.var_name] = [] self.assign_vals[node.var_name] = [] @@ -184,7 +185,7 @@ class AstInterpreter(interpreterbase.InterpreterBase): pass def reduce_arguments(self, args): - assert(isinstance(args, mparser.ArgumentNode)) + assert(isinstance(args, ArgumentNode)) if args.incorrect_order(): raise InvalidArguments('All keyword arguments must be after positional arguments.') return args.arguments, args.kwargs @@ -215,45 +216,47 @@ class AstInterpreter(interpreterbase.InterpreterBase): def evaluate_if(self, node): for i in node.ifs: self.evaluate_codeblock(i.block) - if not isinstance(node.elseblock, mparser.EmptyNode): + if not isinstance(node.elseblock, EmptyNode): self.evaluate_codeblock(node.elseblock) def get_variable(self, varname): return 0 def assignment(self, node): - assert(isinstance(node, mparser.AssignmentNode)) + assert(isinstance(node, AssignmentNode)) self.assignments[node.var_name] = [node.value] # Save a reference to the value node if hasattr(node.value, 'ast_id'): self.reverse_assignment[node.value.ast_id] = node self.assign_vals[node.var_name] = [self.evaluate_statement(node.value)] # Evaluate the value just in case - def flatten_args(self, args, include_unknown_args: bool = False): - # Resolve mparser.ArrayNode if needed + def flatten_args(self, args: Any, include_unknown_args: bool = False) -> List[str]: + # Resolve ArrayNode if needed flattend_args = [] - temp_args = [] - if isinstance(args, mparser.ArrayNode): + if isinstance(args, ArrayNode): args = [x for x in args.args.arguments] - elif isinstance(args, mparser.ArgumentNode): + elif isinstance(args, ArgumentNode): args = [x for x in args.arguments] + if not isinstance(args, list): + args = [args] for i in args: - if isinstance(i, mparser.ArrayNode): - temp_args += [x for x in i.args.arguments] - else: - temp_args += [i] - for i in temp_args: - if isinstance(i, mparser.ElementaryNode) and not isinstance(i, mparser.IdNode): + if isinstance(i, IdNode): + flattend_args += self.flatten_args(self.assignments.get(i.value, []), include_unknown_args) + elif isinstance(i, (ArrayNode, ArgumentNode)): + flattend_args += self.flatten_args(i, include_unknown_args) + elif isinstance(i, mparser.ElementaryNode): flattend_args += [i.value] - elif isinstance(i, (str, bool, int, float)) or include_unknown_args: + elif isinstance(i, (str, bool, int, float)): + flattend_args += [i] + elif include_unknown_args: flattend_args += [i] return flattend_args def flatten_kwargs(self, kwargs: object, include_unknown_args: bool = False): flattend_kwargs = {} for key, val in kwargs.items(): - if isinstance(val, mparser.ElementaryNode): + if isinstance(val, ElementaryNode): flattend_kwargs[key] = val.value - elif isinstance(val, (mparser.ArrayNode, mparser.ArgumentNode)): + elif isinstance(val, (ArrayNode, ArgumentNode)): flattend_kwargs[key] = self.flatten_args(val, include_unknown_args) elif isinstance(val, (str, bool, int, float)) or include_unknown_args: flattend_kwargs[key] = val |