#!/usr/bin/env fuchsia-vendored-python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
Find protocols with [Layout = "Simple"] that pass unions.
"""

from ir import Libraries, Enum, Struct, Union

fidl_libraries = Libraries()


def is_simple(p):
    attrs = p.get("maybe_attributes", [])
    return any(a["name"] == "Layout" and a["value"] == "Simple" for a in attrs)


def has_union(t):
    if t.kind == "identifier":
        declaration = t.library.libraries.find(t["identifier"])
        if isinstance(declaration, Union):
            return True
        if isinstance(declaration, Struct):
            return any(has_union(m.type) for m in declaration.members)
        # Note: there will be no xunions or tables
        return False
    elif "element_type" in t:
        return has_union(t.element_type)
    return False


for library in fidl_libraries:
    for protocol in library.interfaces:
        if not is_simple(protocol):
            continue
        for method in protocol.methods:
            args = []
            args.extend(method.request() or [])
            args.extend(method.response() or [])
            if any(has_union(a.type) for a in args):
                print(
                    "{}.{} has unions".format(protocol["name"], method["name"])
                )
