c_client.py: Extract get_expr_field_names()

Signed-off-by: Povilas Kanapickas <povilas@radix.lt>
This commit is contained in:
Povilas Kanapickas 2021-07-30 22:58:44 +03:00
parent 21414e7c44
commit 4d678b162b

View File

@ -649,23 +649,22 @@ def _c_helper_resolve_field_names (prefix):
return all_fields
def get_expr_fields(self):
"""
get the Fields referenced by switch or list expression
"""
def get_expr_field_names(expr):
"""
returns a list of field names referenced in an expression
"""
if expr.op is None or expr.op == 'calculate_len':
if expr.lenfield_name is not None:
return [expr.lenfield_name]
else:
# constant value expr
return []
else:
if expr.op == '~':
return get_expr_field_names(expr.rhs)
elif expr.op == 'popcount':
if expr.op == 'popcount':
return get_expr_field_names(expr.rhs)
elif expr.op == 'sumof':
if expr.op == 'sumof':
# sumof expr references another list,
# we need that list's length field here
field = None
@ -677,11 +676,15 @@ def get_expr_fields(self):
raise Exception("list field '%s' referenced by sumof not found" % expr.lenfield_name)
# referenced list + its length field
return [expr.lenfield_name] + get_expr_field_names(field.type.expr)
elif expr.op == 'enumref':
if expr.op == 'enumref':
return []
else:
return get_expr_field_names(expr.lhs) + get_expr_field_names(expr.rhs)
# get_expr_field_names()
def get_expr_fields(self):
"""
get the Fields referenced by switch or list expression
"""
# resolve the field names with the parent structure(s)
unresolved_fields_names = get_expr_field_names(self.expr)