def GetDependencyGraph(protocols):
    """Determine the dependencies between interfaces and their messages.

  Args:
    protocols: the list of wayland xml protocols you want the dependencies of.

  Returns:
    A bipartite graph where messages (i, m) depend on interfaces (i) and
    vice-versa. An edge from (i,m) to (i') indicates an i' instance is needed to
    invoke m, whereas (i) to (i',m') indicates m' is a constructor for i
    instances.
  """
    dep_graph = {}
    constructed_interfaces = set()
    for _, i, m in wlu.AllMessages(protocols):
        dep_graph[ToNode(i, m)] = [('receiver', i.attrib['name'])] + [
            (a.attrib['name'], a.get('interface', '?'))
            for a in m.findall('arg') if a.attrib['type'] == 'object'
        ]
        constructed = wlu.GetConstructedInterface(m)
        if constructed:
            constructed_interfaces.add(constructed)
            dep_graph[constructed] = ToNode(i, m)
    for _, i in wlu.AllInterfaces(protocols):
        if i.attrib['name'] not in constructed_interfaces:
            dep_graph[i.attrib['name']] = ('wl_registry', 'bind')
    return dep_graph
Example #2
0
 def __init__(self, protocols):
     self.non_global_names = {
         wlu.GetConstructedInterface(m)
         for _, _, m in wlu.AllMessages(protocols)
     } - {None}
     self.interfaces_with_listeners = {
         i.attrib['name']
         for p, i in wlu.AllInterfaces(protocols) if wlu.NeedsListener(i)
     }
     self.counts = {}
Example #3
0
def GetMessage(message, context):
    name = message.attrib['name']
    constructed = wlu.GetConstructedInterface(message)
    return {
        'name': name,
        'tag': message.tag,
        'idx': context.GetAndIncrementCount('message_index'),
        'args': [GetArg(a) for a in message.findall('arg')],
        'is_constructor': wlu.IsConstructor(message),
        'is_destructor': wlu.IsDestructor(message),
        'constructed': constructed,
        'constructed_has_listener': constructed
        in context.interfaces_with_listeners,
        'doc': wlu.GetDocumentation(message),
    }