| # Copyright 2020 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. |
| |
| __all__ = ['USES'] |
| |
| from typing import List |
| |
| from generate.types import * |
| |
| # Define places that identifiers may appear in a FIDL library: |
| USES: List[Use] = [] |
| |
| |
| def use(func): |
| USES.append(Use(func.__name__.replace('_', '.'), (func,))) |
| |
| |
| @use |
| def constants(f, idents: List[ScopedIdentifier]): |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f'const uint32 {ident} = 1;\n') |
| |
| |
| @use |
| def using(f, idents: List[ScopedIdentifier]): |
| for ident in idents: |
| # TODO(fxbug.dev/8042): Having a declaration with same same name as what is |
| # aliased causes a cycle. |
| if ident.name == "string": |
| continue |
| f.write(ident.decl_attributes) |
| f.write(f'alias {ident} = string;\n') |
| |
| |
| # TODO(ianloic): Make this test work. It requires N libraries to import for N |
| # identifiers. That doesn't fit well into the model of this test. |
| #@use |
| #def using_as(f, idents): |
| # for ident in idents: |
| # f.write('using fuchsia.mem as %s;\n' % ident) |
| |
| |
| @use |
| def enums(f, idents: List[ScopedIdentifier]): |
| # enums with every dangerous name |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f'enum {ident} {{ MEMBER = 1; }};\n') |
| |
| # enum with every dangerous field name |
| f.write('enum DangerousMembers {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' {ident} = {ident.tag - 1};\n') |
| f.write('};\n') |
| |
| |
| @use |
| def struct_types(f, idents: List[ScopedIdentifier]): |
| # structs with every dangerous name |
| f.write('alias membertype = uint32;\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f'struct {ident} {{ membertype member = 1; }};\n') |
| |
| # a struct with every dangerous name as the field type |
| f.write('struct DangerousMembers {\n') |
| for ident in idents: |
| # dangerous field type |
| f.write(ident.decl_attributes) |
| f.write(f' {ident} f{ident.tag - 1};\n') |
| f.write('};\n') |
| |
| |
| @use |
| def struct_names(f, idents: List[ScopedIdentifier]): |
| # a struct with every dangerous name as the field name |
| f.write('struct DangerousMembers {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' uint32 {ident};\n') |
| f.write('};\n') |
| |
| |
| # TODO(fxbug.dev/8081) |
| # Temporarily disabled due to superlinear compiler time and peak memory usage. |
| # @use |
| # def union_names(f, idents): |
| # # unions with every dangerous name |
| # f.write('alias membertype = uint32;\n') |
| # for ident in idents: |
| # # TODO(fxbug.dev/8042): Having a declaration with same same name as what is |
| # # aliased causes a cycle. |
| # if ident == "uint32": |
| # continue |
| # f.write('union %s { membertype member; };\n' % ident) |
| # |
| # # a union with every dangerous name as the field type |
| # f.write('union DangerousMembers {\n') |
| # for i, ident in enumerate(idents): |
| # # dangerous field type |
| # f.write(' %s f%d;\n' % (ident, i)) |
| # f.write('};\n') |
| # |
| # |
| # @use |
| # def union_types(f, idents): |
| # # a union with every dangerous name as the field name |
| # f.write('union DangerousMembers {\n') |
| # for i, ident in enumerate(idents): |
| # f.write(' uint32 %s;\n' % (ident)) |
| # f.write('};\n') |
| |
| |
| @use |
| def table_names(f, idents: List[ScopedIdentifier]): |
| # tables with every dangerous name |
| f.write('alias membertype = uint32;\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f'table {ident} {{ 1: membertype member; }};\n') |
| # a table with every dangerous name as the field type |
| f.write('table DangerousMembers {\n') |
| next_tag = 1 |
| for ident in sorted(idents, key=lambda ident: ident.tag): |
| # dangerous field type |
| while ident.tag > next_tag: |
| f.write(f' {next_tag}: reserved;\n') |
| next_tag = next_tag + 1 |
| f.write(ident.decl_attributes) |
| f.write(f' {ident.tag}: {ident} f{ident.tag-1};\n') |
| next_tag = ident.tag + 1 |
| f.write('};\n') |
| |
| |
| @use |
| def table_fields(f, idents: List[ScopedIdentifier]): |
| # a table with every dangerous name as the field name |
| f.write('table DangerousMembers {\n') |
| next_tag = 1 |
| for ident in sorted(idents, key=lambda ident: ident.tag): |
| while ident.tag > next_tag: |
| f.write(f' {next_tag}: reserved;\n') |
| next_tag = next_tag + 1 |
| f.write(ident.decl_attributes) |
| f.write(f' {ident.tag}: uint32 {ident};\n') |
| next_tag = ident.tag + 1 |
| f.write('};\n') |
| |
| |
| @use |
| def protocol_names(f, idents: List[ScopedIdentifier]): |
| # a protocols with every dangerous name |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f'protocol {ident} {{ JustOneMethod(); }};\n') |
| |
| |
| @use |
| def method_names(f, idents: List[ScopedIdentifier]): |
| # a protocol with every dangerous name as a method name |
| f.write('protocol DangerousMethods {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' {ident}();\n') |
| f.write('};\n') |
| |
| |
| @use |
| def event_names(f, idents: List[ScopedIdentifier]): |
| # a protocol with every dangerous name as an event name |
| f.write('protocol DangerousEvents {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' -> {ident}();\n') |
| f.write('};\n') |
| |
| |
| @use |
| def method_request_arguments(f, idents: List[ScopedIdentifier]): |
| # a protocol with every dangerous name as a request argument |
| f.write('alias argtype = uint32;\n') |
| f.write('protocol DangerousRequestArguments {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' Method{ident.tag - 1}(argtype {ident});\n') |
| f.write('};\n') |
| |
| |
| @use |
| def method_response_arguments(f, idents: List[ScopedIdentifier]): |
| # a protocol with every dangerous name as a response argument |
| f.write('alias argtype = uint32;\n') |
| f.write('protocol DangerousResponseArguments {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' Method{ident.tag - 1}() -> (argtype {ident});\n') |
| f.write('};\n') |
| |
| |
| @use |
| def method_event_arguments(f, idents: List[ScopedIdentifier]): |
| # a protocol with every dangerous name as a event argument |
| f.write('alias argtype = uint32;\n') |
| f.write('protocol DangerousResponseArguments {\n') |
| for ident in idents: |
| f.write(ident.decl_attributes) |
| f.write(f' -> Event{ident.tag - 1}(argtype {ident});\n') |
| f.write('};\n') |