| #!/usr/bin/env python3.8 |
| # 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. |
| |
| ''' |
| Looks for types that are never used or are used only once, as a field within |
| another type. |
| ''' |
| |
| import sys |
| from collections import defaultdict |
| |
| from ir import Libraries, Enum, Struct, DeclState |
| |
| fidl_libraries = Libraries() |
| |
| # count uses of named types |
| type_uses_in_type = defaultdict(lambda: 0) |
| type_uses_in_argument = defaultdict(lambda: 0) |
| |
| def count_type(t, d): |
| if t.kind == 'identifier': |
| d[t['identifier']] += 1 |
| elif t.kind in ('array', 'vector'): |
| count_type(t.element_type, d) |
| elif t.kind == 'request': |
| d[t['subtype']] += 1 |
| |
| for struct in fidl_libraries.structs: |
| for member in struct.members: |
| count_type(member.type, type_uses_in_type) |
| |
| for union in fidl_libraries.unions: |
| for member in union.members: |
| count_type(member.type, type_uses_in_argument) |
| |
| # TODO: tables |
| |
| for method in fidl_libraries.methods: |
| for arg in (method.request() or []) + (method.response() or []): |
| count_type(arg.type, type_uses_in_argument) |
| |
| once = [] |
| never = [] |
| |
| # Look for structs that are only used once |
| for struct in fidl_libraries.structs: |
| if type_uses_in_argument[struct.name] == 0: |
| if type_uses_in_type[struct.name] == 0: |
| never.append(struct.name) |
| if type_uses_in_type[struct.name] == 1: |
| once.append(struct.name) |
| |
| # Look for unions that are only used once |
| for union in fidl_libraries.unions: |
| if type_uses_in_argument[union.name] == 0: |
| if type_uses_in_type[union.name] == 0: |
| never.append(union.name) |
| if type_uses_in_type[union.name] == 1: |
| once.append(union.name) |
| |
| once.sort() |
| never.sort() |
| |
| print('Never:') |
| for t in never: |
| print(' ' + t) |
| |
| print('\nOnce:') |
| for t in once: |
| print(' ' + t) |