blob: 0163b480485b476f00726cb89f6667e0dbd6176f [file] [log] [blame]
#!/usr/bin/env python3
# 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']))