def nodes_iter(n) -> Generator[Any, None, None]: """ Iterate all nodes of :obj:`n`, including :obj:`n`. Nodes are returned only once. """ if n == nodes.Null_Iir: return # print 'nodes_iter for {0}'.format(n) yield n for f in fields_iter(n): typ = nodes_meta.get_field_type(f) # print ' {0}: field {1} (type: {2})'.format( # n, fields_image(f), types_image(typ)) if typ == nodes_meta.types.Iir: attr = nodes_meta.get_field_attribute(f) if attr == nodes_meta.Attr.ANone: for n1 in nodes_iter(nodes_meta.Get_Iir(n, f)): yield n1 elif attr == nodes_meta.Attr.Chain: n2 = nodes_meta.Get_Iir(n, f) while n2 != nodes.Null_Iir: for n1 in nodes_iter(n2): yield n1 n2 = nodes.Get_Chain(n2) elif attr == nodes_meta.Attr.Maybe_Ref: if not nodes.Get_Is_Ref(n, f): for n1 in nodes_iter(nodes_meta.Get_Iir(n, f)): yield n1 elif typ == nodes_meta.types.Iir_List: attr = nodes_meta.get_field_attribute(f) if attr == nodes_meta.Attr.ANone: for n1 in list_iter(nodes_meta.Get_Iir_List(n, f)): for n2 in nodes_iter(n1): yield n2 elif typ == nodes_meta.types.Iir_Flist: attr = nodes_meta.get_field_attribute(f) if attr == nodes_meta.Attr.ANone: for n1 in flist_iter(nodes_meta.Get_Iir_Flist(n, f)): for n2 in nodes_iter(n1): yield n2
def find_def(n, loc): "Return the node at location :param loc:, or None if not under :param n:" if n == nodes.Null_Iir: return None k = nodes.Get_Kind(n) if k in [ nodes.Iir_Kind.Simple_Name, nodes.Iir_Kind.Character_Literal, nodes.Iir_Kind.Operator_Symbol, nodes.Iir_Kind.Selected_Name, nodes.Iir_Kind.Attribute_Name, nodes.Iir_Kind.Selected_Element, ]: n_loc = nodes.Get_Location(n) if loc >= n_loc: ident = nodes.Get_Identifier(n) id_len = name_table.Get_Name_Length(ident) if loc < n_loc + id_len: return n if k == nodes.Iir_Kind.Simple_Name: return None elif k == nodes.Iir_Kind.Design_File: return find_def_chain(nodes.Get_First_Design_Unit(n), loc) elif k == nodes.Iir_Kind.Design_Unit: # if loc > elocations.Get_End_Location(unit): # return None res = find_def_chain(nodes.Get_Context_Items(n), loc) if res is not None: return res unit = nodes.Get_Library_Unit(n) return find_def(unit, loc) # This is *much* faster than using node_iter! for f in pyutils.fields_iter(n): typ = nodes_meta.get_field_type(f) if typ == nodes_meta.types.Iir: attr = nodes_meta.get_field_attribute(f) if attr == nodes_meta.Attr.ANone: res = find_def(nodes_meta.Get_Iir(n, f), loc) if res is not None: return res elif attr == nodes_meta.Attr.Chain: res = find_def_chain(nodes_meta.Get_Iir(n, f), loc) if res is not None: return res elif attr == nodes_meta.Attr.Maybe_Ref: if not nodes.Get_Is_Ref(n): res = find_def(nodes_meta.Get_Iir(n, f), loc) if res is not None: return res elif typ == nodes_meta.types.Iir_List: attr = nodes_meta.get_field_attribute(f) if attr == nodes_meta.Attr.ANone: for n1 in pyutils.list_iter(nodes_meta.Get_Iir_List(n, f)): res = find_def(n1, loc) if res is not None: return res elif typ == nodes_meta.types.Iir_Flist: attr = nodes_meta.get_field_attribute(f) if attr == nodes_meta.Attr.ANone: for n1 in pyutils.flist_iter(nodes_meta.Get_Iir_Flist(n, f)): res = find_def(n1, loc) if res is not None: return res return None