[fid] Improve dangerous_identifiers generation

Makes a new Python module with both the logic from generate.py and
configuration from dangerous_identifiers.txt. Using a higher-level
langauge to specify configuration makes it simpler to extend so now the
uint32 handling specified in the configuration rather than in ad-hoc
code.

The only changes to the generated code are a comment change reflecting
the new name of the generation script, a couple of cases where uint32
was accidentally included before, and some places where table members
were being generated out of order.

Change-Id: I363266fbf35ae5af81c60064c496f7b267934318
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/438057
Commit-Queue: Ian McKellar <ianloic@google.com>
Reviewed-by: Benjamin Prosnitz <bprosnitz@google.com>
Reviewed-by: Pascal Perez <pascallouis@google.com>
Testability-Review: Benjamin Prosnitz <bprosnitz@google.com>
Testability-Review: Pascal Perez <pascallouis@google.com>
diff --git a/docs/contribute/contributing-to-fidl/README.md b/docs/contribute/contributing-to-fidl/README.md
index dc2607a..43ae787 100644
--- a/docs/contribute/contributing-to-fidl/README.md
+++ b/docs/contribute/contributing-to-fidl/README.md
@@ -470,7 +470,7 @@
 | fidlc goldens         | fx exec $FUCHSIA_DIR/zircon/tools/fidl/testdata/regen.sh                    | zircon/tools/fidl/testdata                                        | zircon/tools/fidl/goldens                                                                  |
 | fidlgen goldens       | fx exec $FUCHSIA_DIR/garnet/go/src/fidl/compiler/backend/typestest/regen.sh | zircon/tools/fidl/goldens                                         | garnet/go/src/fidl/compiler/backend/goldens                                                |
 | dart fidlgen goldens  | fx exec $FUCHSIA_DIR/topaz/bin/fidlgen_dart/regen.sh                        | zircon/tools/fidl/goldens                                         | topaz/bin/fidlgen_dart/goldens                                                             |
-| dangerous identifiers | fx exec src/tests/fidl/dangerous_identifiers/generate.py                    | src/tests/fidl/dangerous_identifiers/dangerous_identifiers.txt | src/tests/fidl/dangerous_identifiers/{cpp, fidl} |
+| dangerous identifiers | fx exec src/tests/fidl/dangerous_identifiers/generate.sh                    | src/tests/fidl/dangerous_identifiers/generate/*.py                | src/tests/fidl/dangerous_identifiers/{cpp, fidl}                                           |
 | regen third party go  | fx exec $FUCHSIA_DIR/third_party/go/regen-fidl                              |                                                                   |                                                                                            |
 | fidldoc goldens       | REGENERATE_GOLDENS_FOLDER=$FUCHSIA_DIR/tools/fidl/fidldoc/src/templates/markdown/testdata fx test host_x64/fidldoc_bin_test -- golden_test | zircon/tools/fidl/goldens | tools/fidl/fidldoc/src/templates/markdown/testdata |
 
diff --git a/src/tests/fidl/dangerous_identifiers/README.md b/src/tests/fidl/dangerous_identifiers/README.md
index 869cbd1..85e4bd6 100644
--- a/src/tests/fidl/dangerous_identifiers/README.md
+++ b/src/tests/fidl/dangerous_identifiers/README.md
@@ -1,10 +1,13 @@
 # FIDL Dangerous Identifiers Tests
 
-The script `generate.py` reads a list of lower\_camel\_case formatted list of
-identifiers from `dangerous_identifiers.txt`. Those are identifiers that we
-suspect could trigger edge cases in the FIDL compilers, binding generators and
-libraries.
+The script in `generate` takes a list of lower\_camel\_case identifiers
+(in [generate/identifiers.py](generate/identifiers.py)) formats them in a
+variety of styles (from [generate/styles.py](generate/styles.py)) and then
+uses them in a variety of FIDL contexts (defined in 
+[generate/uses.py](generate/uses.py)).
 
-The `generate.py` tool generates FIDL libraries that use various forms of each
-identifier in various places that identifiers can appear. It generates a C++
-program that compiles (though does not use) every generated FIDL library.
+This results in FIDL [libraries](fidl) using these identifiers in many
+different ways and build rules for Rust and C++ that build them. These are
+used to verify that FIDL generators generate valid source even when presented
+with problematic identifiers from FIDL.
+
diff --git a/src/tests/fidl/dangerous_identifiers/cpp/BUILD.gn b/src/tests/fidl/dangerous_identifiers/cpp/BUILD.gn
index 1cafbf0..d684c8a 100644
--- a/src/tests/fidl/dangerous_identifiers/cpp/BUILD.gn
+++ b/src/tests/fidl/dangerous_identifiers/cpp/BUILD.gn
@@ -1,7 +1,7 @@
 # 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.
-# Generated by generate.py.
+# Generated by //src/tests/fidl/dangerous_identifiers/generate.
 source_set("fidl.test.dangerous.constants.lower_cpp") {
   output_name =
       "cpp_fidl_dangerous_identifiers_test_fidl.test.dangerous.constants.lower"
diff --git a/src/tests/fidl/dangerous_identifiers/dangerous_identifiers.txt b/src/tests/fidl/dangerous_identifiers/dangerous_identifiers.txt
deleted file mode 100644
index 297ed30..0000000
--- a/src/tests/fidl/dangerous_identifiers/dangerous_identifiers.txt
+++ /dev/null
@@ -1,233 +0,0 @@
-# These are keywords used in languages we support and in generated bindings.
-# This list is maintained by hand and should be expanded to cover as many cases
-# as we can think of.
-#
-# Each line is either:
-# - a comment prefixed with # or
-# - a lower_camel_case identifier, a colon, and a unique numerical tag
-#   optionally, a BindingsDenylist mention can be added
-#
-# Examples:
-#    coding_traits:32
-#    unknown_data:218 BindingsDenylist=dart
-#
-# Note: last tag used is 218
-abstract:1
-alignas:2
-alignof:3
-and:4
-and_eq:5
-as:6
-asm:7
-assert:8
-async:9
-atomic_cancel:10
-atomic_commit:11
-atomic_noexcept:12
-auto:13
-await:14
-become:15
-bitand:16
-bitor:17
-bool:18
-box:19
-break:20
-byte:21
-bytes:215
-case:22
-catch:23
-chan:24
-char:25
-char16_t:26
-char32_t:27
-class:28
-co_await:29
-co_return:30
-co_yield:31
-coding_traits:32
-compl:33
-concept:34
-const:35
-const_cast:36
-constexpr:37
-continue:38
-controller:39
-covariant:40
-crate:41
-decltype:42
-decoder:43
-default:44
-defer:45
-deferred:46
-delete:47
-do:48
-double:49
-dynamic:50
-dynamic_cast:51
-else:52
-encoder:53
-ensure_values_instantiated:54
-enum:55
-empty:56
-err:57
-explicit:58
-export:59
-extends:60
-extern:61
-external:62
-factory:63
-fallthrough:64
-false:65
-fidl:66
-fidl_type:67
-final:68
-finally:69
-float:70
-fn:71
-for:72
-friend:73
-func:74
-future:75
-futures:76
-get:77
-go:78
-goto:79
-has_invalid_tag:80
-hash_code:81
-if:82
-impl:83
-implements:84
-import:85
-in:86
-index:87
-inline:88
-int:89
-int16:90
-int32:91
-int64:92
-int8:93
-interface:94
-internal_tag:95
-is:96
-let:97
-lhs:98
-library:99
-list:100
-long:101
-loop:102
-macro:103
-map:104
-match:105
-mixin:106
-mod:107
-module:108
-move:109
-mut:110
-mutable:111
-namespace:112
-never:113
-new:114
-no_such_method:115
-noexcept:116
-none:117
-not:118
-not_eq:119
-null:120
-nullptr:121
-num:122
-object:123
-offset:124
-offsetof:125
-ok:126
-on_open:127
-operator:128
-option:129
-or:130
-or_eq:131
-override:132
-package:133
-part:134
-priv:135
-private:136
-proc:137
-protected:138
-proxy:139
-pub:140
-public:141
-pure:142
-range:143
-ref:144
-register:145
-reinterpret_cast:146
-requires:147
-result:148
-rethrow:149
-return:150
-rhs:151
-rune:152
-runtime_type:153
-select:154
-self:155
-send:156
-set:157
-set_controller:158
-short:159
-signed:160
-sizeof:161
-some:162
-static:163
-static_assert:164
-static_cast:165
-stream:166
-string:167
-struct:168
-stub:169
-super:170
-switch:171
-synchronized:172
-template:173
-this:174
-thread_local:175
-throw:176
-to_string:177
-trait:178
-true:179
-try:180
-type:181
-typedef:182
-typeid:183
-typename:184
-typeof:185
-uint16:186
-uint32:187
-uint64:188
-uint8:189
-union:190
-unknown:216
-unknown_bytes:217
-# TODO(fxb/60495): Remedy identifier clashes.
-unknown_data:218 BindingsDenylist=dart
-unsafe:191
-unsigned:192
-unsized:193
-use:194
-using:195
-value:196
-value_of:197
-value_union:198
-values_map:199
-var:200
-vec:201
-virtual:202
-void:203
-volatile:204
-wchar_t:205
-where:206
-which:207
-while:208
-with:209
-xor:210
-xor_eq:211
-xunion:212
-yield:213
-zx:214
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/BUILD.gn b/src/tests/fidl/dangerous_identifiers/fidl/BUILD.gn
index fc90520..3c77667 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/BUILD.gn
+++ b/src/tests/fidl/dangerous_identifiers/fidl/BUILD.gn
@@ -1,7 +1,7 @@
 # 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.
-# Generated by generate.py.
+# Generated by //src/tests/fidl/dangerous_identifiers/generate.
 import("//build/fidl/fidl.gni")
 
 group("fidl") {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.camel.test.fidl
index 7115d74..247486e 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.constants.camel;
 const uint32 Abstract = 1;
 const uint32 Alignas = 1;
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.lower.test.fidl
index 5993016..29370c0 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.constants.lower;
 const uint32 abstract = 1;
 const uint32 alignas = 1;
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.upper.test.fidl
index 52717ae..e7d4fe5 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.constants.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.constants.upper;
 const uint32 ABSTRACT = 1;
 const uint32 ALIGNAS = 1;
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.camel.test.fidl
index 9d56061..1f501d9 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.enums.camel;
 
 enum Abstract {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.lower.test.fidl
index f4ff223..bf9d816 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.enums.lower;
 
 enum abstract {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.upper.test.fidl
index ec0bd9d..10ee5ba 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.enums.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.enums.upper;
 
 enum ABSTRACT {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.camel.test.fidl
index c14e3fd..7b624bc 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.event.names.camel;
 
 protocol DangerousEvents {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.lower.test.fidl
index 9e6eaa5..d7382ad 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.event.names.lower;
 
 protocol DangerousEvents {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.upper.test.fidl
index 7580b99..351c7e6 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.event.names.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.event.names.upper;
 
 protocol DangerousEvents {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.camel.test.fidl
index e60093a..35ea3c7 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.event.arguments.camel;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.lower.test.fidl
index bfeae3b..2394b47 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.event.arguments.lower;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.upper.test.fidl
index 108babc..91ee00e 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.event.arguments.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.event.arguments.upper;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.camel.test.fidl
index 0a8522174..00e1c4a 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.names.camel;
 
 protocol DangerousMethods {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.lower.test.fidl
index 4228d91..ec93e92 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.names.lower;
 
 protocol DangerousMethods {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.upper.test.fidl
index 7c04b16..e1dfccf 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.names.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.names.upper;
 
 protocol DangerousMethods {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.camel.test.fidl
index 988a616..345b602 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.request.arguments.camel;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.lower.test.fidl
index a6c305a..892f569 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.request.arguments.lower;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.upper.test.fidl
index 625ae83e1..e9a924ad 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.request.arguments.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.request.arguments.upper;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.camel.test.fidl
index 927a04c..5b9096e 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.response.arguments.camel;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.lower.test.fidl
index 86673fc..ea9a37e 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.response.arguments.lower;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.upper.test.fidl
index 5653fbbd..422173c 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.method.response.arguments.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.method.response.arguments.upper;
 using argtype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.camel.test.fidl
index e735a11..be6b211 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.protocol.names.camel;
 
 protocol Abstract {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.lower.test.fidl
index c2bdb889..618810d 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.protocol.names.lower;
 
 protocol abstract {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.upper.test.fidl
index f7a5763..c310165 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.protocol.names.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.protocol.names.upper;
 
 protocol ABSTRACT {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.camel.test.fidl
index f0b6c62..7cd0319 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.struct.names.camel;
 
 struct DangerousMembers {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.lower.test.fidl
index ca791ab..38fe0fc 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.struct.names.lower;
 
 struct DangerousMembers {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.upper.test.fidl
index 324ce9e..ddd1f1d 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.names.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.struct.names.upper;
 
 struct DangerousMembers {
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.camel.test.fidl
index 0efa68c..ed7a53a 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.struct.types.camel;
 using membertype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.lower.test.fidl
index 7106f35..edf4408 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.struct.types.lower;
 using membertype = uint32;
 
@@ -1062,7 +1062,6 @@
     typename f183;
     typeof f184;
     uint16 f185;
-    uint32 f186;
     uint64 f187;
     uint8 f188;
     union f189;
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.upper.test.fidl
index 80fd050..25d2a9f58 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.struct.types.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.struct.types.upper;
 using membertype = uint32;
 
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.camel.test.fidl
index 05c4262..8a226d0 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.table.fields.camel;
 
 table DangerousMembers {
@@ -26,7 +26,6 @@
     19: uint32 Box;
     20: uint32 Break;
     21: uint32 Byte;
-    215: uint32 Bytes;
     22: uint32 Case;
     23: uint32 Catch;
     24: uint32 Chan;
@@ -196,10 +195,6 @@
     188: uint32 Uint64;
     189: uint32 Uint8;
     190: uint32 Union;
-    216: uint32 Unknown;
-    217: uint32 UnknownBytes;
-    [BindingsDenylist = "dart"]
-    218: uint32 UnknownData;
     191: uint32 Unsafe;
     192: uint32 Unsigned;
     193: uint32 Unsized;
@@ -224,4 +219,9 @@
     212: uint32 Xunion;
     213: uint32 Yield;
     214: uint32 Zx;
+    215: uint32 Bytes;
+    216: uint32 Unknown;
+    217: uint32 UnknownBytes;
+    [BindingsDenylist = "dart"]
+    218: uint32 UnknownData;
 };
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.lower.test.fidl
index a865d4a..7c11e04 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.table.fields.lower;
 
 table DangerousMembers {
@@ -26,7 +26,6 @@
     19: uint32 box;
     20: uint32 break;
     21: uint32 byte;
-    215: uint32 bytes;
     22: uint32 case;
     23: uint32 catch;
     24: uint32 chan;
@@ -196,10 +195,6 @@
     188: uint32 uint64;
     189: uint32 uint8;
     190: uint32 union;
-    216: uint32 unknown;
-    217: uint32 unknown_bytes;
-    [BindingsDenylist = "dart"]
-    218: uint32 unknown_data;
     191: uint32 unsafe;
     192: uint32 unsigned;
     193: uint32 unsized;
@@ -224,4 +219,9 @@
     212: uint32 xunion;
     213: uint32 yield;
     214: uint32 zx;
+    215: uint32 bytes;
+    216: uint32 unknown;
+    217: uint32 unknown_bytes;
+    [BindingsDenylist = "dart"]
+    218: uint32 unknown_data;
 };
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.upper.test.fidl
index b96c9d1..875feb9 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.fields.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.table.fields.upper;
 
 table DangerousMembers {
@@ -26,7 +26,6 @@
     19: uint32 BOX;
     20: uint32 BREAK;
     21: uint32 BYTE;
-    215: uint32 BYTES;
     22: uint32 CASE;
     23: uint32 CATCH;
     24: uint32 CHAN;
@@ -196,10 +195,6 @@
     188: uint32 UINT64;
     189: uint32 UINT8;
     190: uint32 UNION;
-    216: uint32 UNKNOWN;
-    217: uint32 UNKNOWN_BYTES;
-    [BindingsDenylist = "dart"]
-    218: uint32 UNKNOWN_DATA;
     191: uint32 UNSAFE;
     192: uint32 UNSIGNED;
     193: uint32 UNSIZED;
@@ -224,4 +219,9 @@
     212: uint32 XUNION;
     213: uint32 YIELD;
     214: uint32 ZX;
+    215: uint32 BYTES;
+    216: uint32 UNKNOWN;
+    217: uint32 UNKNOWN_BYTES;
+    [BindingsDenylist = "dart"]
+    218: uint32 UNKNOWN_DATA;
 };
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.camel.test.fidl
index 5ca3fc7..95d1734 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.table.names.camel;
 using membertype = uint32;
 
@@ -900,7 +900,6 @@
     19: Box f18;
     20: Break f19;
     21: Byte f20;
-    215: Bytes f214;
     22: Case f21;
     23: Catch f22;
     24: Chan f23;
@@ -1070,10 +1069,6 @@
     188: Uint64 f187;
     189: Uint8 f188;
     190: Union f189;
-    216: Unknown f215;
-    217: UnknownBytes f216;
-    [BindingsDenylist = "dart"]
-    218: UnknownData f217;
     191: Unsafe f190;
     192: Unsigned f191;
     193: Unsized f192;
@@ -1098,4 +1093,9 @@
     212: Xunion f211;
     213: Yield f212;
     214: Zx f213;
+    215: Bytes f214;
+    216: Unknown f215;
+    217: UnknownBytes f216;
+    [BindingsDenylist = "dart"]
+    218: UnknownData f217;
 };
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.lower.test.fidl
index 6e6ef77..691e48f 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.table.names.lower;
 using membertype = uint32;
 
@@ -896,7 +896,6 @@
     19: box f18;
     20: break f19;
     21: byte f20;
-    215: bytes f214;
     22: case f21;
     23: catch f22;
     24: chan f23;
@@ -1062,14 +1061,10 @@
     184: typename f183;
     185: typeof f184;
     186: uint16 f185;
-    187: uint32 f186;
+    187: reserved;
     188: uint64 f187;
     189: uint8 f188;
     190: union f189;
-    216: unknown f215;
-    217: unknown_bytes f216;
-    [BindingsDenylist = "dart"]
-    218: unknown_data f217;
     191: unsafe f190;
     192: unsigned f191;
     193: unsized f192;
@@ -1094,4 +1089,9 @@
     212: xunion f211;
     213: yield f212;
     214: zx f213;
+    215: bytes f214;
+    216: unknown f215;
+    217: unknown_bytes f216;
+    [BindingsDenylist = "dart"]
+    218: unknown_data f217;
 };
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.upper.test.fidl
index 6d834dd..730e76f 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.table.names.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.table.names.upper;
 using membertype = uint32;
 
@@ -900,7 +900,6 @@
     19: BOX f18;
     20: BREAK f19;
     21: BYTE f20;
-    215: BYTES f214;
     22: CASE f21;
     23: CATCH f22;
     24: CHAN f23;
@@ -1070,10 +1069,6 @@
     188: UINT64 f187;
     189: UINT8 f188;
     190: UNION f189;
-    216: UNKNOWN f215;
-    217: UNKNOWN_BYTES f216;
-    [BindingsDenylist = "dart"]
-    218: UNKNOWN_DATA f217;
     191: UNSAFE f190;
     192: UNSIGNED f191;
     193: UNSIZED f192;
@@ -1098,4 +1093,9 @@
     212: XUNION f211;
     213: YIELD f212;
     214: ZX f213;
+    215: BYTES f214;
+    216: UNKNOWN f215;
+    217: UNKNOWN_BYTES f216;
+    [BindingsDenylist = "dart"]
+    218: UNKNOWN_DATA f217;
 };
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.camel.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.camel.test.fidl
index ceea199..c3b821e 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.camel.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.camel.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.using.camel;
 using Abstract = vector;
 using Alignas = vector;
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.lower.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.lower.test.fidl
index 8604f351..f4fd1b9 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.lower.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.lower.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.using.lower;
 using abstract = vector;
 using alignas = vector;
diff --git a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.upper.test.fidl b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.upper.test.fidl
index be47c75..cf5b183 100644
--- a/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.upper.test.fidl
+++ b/src/tests/fidl/dangerous_identifiers/fidl/fidl.test.dangerous.using.upper.test.fidl
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 library fidl.test.dangerous.using.upper;
 using ABSTRACT = vector;
 using ALIGNAS = vector;
diff --git a/src/tests/fidl/dangerous_identifiers/generate.py b/src/tests/fidl/dangerous_identifiers/generate.py
deleted file mode 100755
index 680ebcc..0000000
--- a/src/tests/fidl/dangerous_identifiers/generate.py
+++ /dev/null
@@ -1,494 +0,0 @@
-#!/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.
-
-import datetime
-import os
-import platform
-import re
-import subprocess
-import sys
-
-from typing import List
-
-# Where is this script?
-DIR = os.path.dirname(os.path.realpath(__file__))
-
-# What platform are we on?
-HOST_PLARFORM = "{}-{}".format(
-    platform.system().lower().replace("darwin", "mac"),
-    {
-        "x86_64": "x64",
-        "aarch64": "arm64",
-    }[platform.machine()],
-)
-
-# Where is gn?
-GN = os.path.realpath(
-    os.path.join(
-        DIR, '../../../../prebuilt/third_party/gn', HOST_PLARFORM, 'gn'))
-FUCHSIA_DIR = os.environ.get('FUCHSIA_DIR')
-FUCHSIA_BUILD_DIR = os.environ.get('FUCHSIA_BUILD_DIR')
-if FUCHSIA_BUILD_DIR is None:
-    print('Run "fx exec %s".' % sys.argv[0])
-    sys.exit(1)
-FIDL_FORMAT = os.path.join(FUCHSIA_BUILD_DIR, 'host_x64', 'fidl-format')
-RUST_FORMAT = os.path.join(FUCHSIA_DIR, 'prebuilt', 'third_party', 'rust_tools', 'linux-x64', 'bin', 'rustfmt')
-
-
-# IdentifierDef represents individual parts of an identifier, along with a tag.
-# An identifier definition produces an `Identifier` when styled.
-#
-# For instance, the defintion
-#
-#     my_super_identifier:8
-#
-# has three parts [my, super, identifer] and tag 8.
-class IdentifierDef:
-
-    def __init__(self, parts: List[str], tag: int, bindings_denylist: str):
-        self.parts = parts
-        self.tag = tag
-        self.bindings_denylist = bindings_denylist
-
-
-class Identifier:
-
-    def __init__(self, ident: str, tag: int, bindings_denylist: str):
-        self.ident = ident
-        self.tag = tag
-        self.bindings_denylist = bindings_denylist
-
-
-# Define ways that identifiers may be rendered
-STYLES = []
-
-
-def style(func):
-    STYLES.append((func.__name__, func))
-
-
-@style
-def lower(ident):
-    return '_'.join(w.lower() for w in ident)
-
-
-@style
-def upper(ident):
-    return '_'.join(w.upper() for w in ident)
-
-
-@style
-def camel(ident):
-    return ''.join(w.capitalize() for w in ident)
-
-
-# Define places that identifiers may appear in a FIDL library:
-USES = []
-
-
-def use(func):
-    USES.append((func.__name__.replace('_', '.'), func))
-
-
-@use
-def constants(f, idents: List[Identifier]):
-    for ident in idents:
-        # TODO(fxbug.dev/38124): Enable this case once we've clarified these edge cases
-        # and chosen a way to unambiguously reference the root library. Currently,
-        # "const uint32 uint32 = 1;" will fail with an includes-cycle fidlc error.
-        if ident.ident == "uint32":
-            continue
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('const uint32 %s = 1;\n' % ident.ident)
-
-
-@use
-def using(f, idents: List[Identifier]):
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('using %s = vector;\n' % ident.ident)
-
-
-# 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[Identifier]):
-    # enums with every dangerous name
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('enum %s { MEMBER = 1; };\n' % ident.ident)
-
-    # enum with every dangerous field name
-    f.write('enum DangerousMembers {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  %s = %d;\n' % (ident.ident, ident.tag - 1))
-    f.write('};\n')
-
-
-@use
-def struct_types(f, idents: List[Identifier]):
-    # structs with every dangerous name
-    f.write('using 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.ident == "uint32":
-            continue
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('struct %s { membertype member = 1; };\n' % ident.ident)
-
-    # a struct with every dangerous name as the field type
-    f.write('struct DangerousMembers {\n')
-    for ident in idents:
-        # dangerous field type
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  %s f%d;\n' % (ident.ident, ident.tag - 1))
-    f.write('};\n')
-
-
-@use
-def struct_names(f, idents: List[Identifier]):
-    # a struct with every dangerous name as the field name
-    f.write('struct DangerousMembers {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  uint32 %s;\n' % ident.ident)
-    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('using 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[Identifier]):
-    # tables with every dangerous name
-    f.write('using 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.ident == "uint32":
-            continue
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('table %s { 1: membertype member; };\n' % ident.ident)
-    # a table with every dangerous name as the field type
-    f.write('table DangerousMembers {\n')
-    for ident in idents:
-        # dangerous field type
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  %s: %s f%s;\n' % (ident.tag, ident.ident, ident.tag - 1))
-    f.write('};\n')
-
-
-@use
-def table_fields(f, idents: List[Identifier]):
-    # a table with every dangerous name as the field name
-    f.write('table DangerousMembers {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  %d: uint32 %s;\n' % (ident.tag, ident.ident))
-    f.write('};\n')
-
-
-@use
-def protocol_names(f, idents: List[Identifier]):
-    # a protocols with every dangerous name
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('protocol %s { JustOneMethod(); };\n' % ident.ident)
-
-
-@use
-def method_names(f, idents: List[Identifier]):
-    # a protocol with every dangerous name as a method name
-    f.write('protocol DangerousMethods {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  %s();\n' % ident.ident)
-    f.write('};\n')
-
-
-@use
-def event_names(f, idents: List[Identifier]):
-    # a protocol with every dangerous name as an event name
-    f.write('protocol DangerousEvents {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  -> %s();\n' % ident.ident)
-    f.write('};\n')
-
-
-@use
-def method_request_arguments(f, idents: List[Identifier]):
-    # a protocol with every dangerous name as a request argument
-    f.write('using argtype = uint32;\n')
-    f.write('protocol DangerousRequestArguments {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  Method%d(argtype %s);\n' % (ident.tag - 1, ident.ident))
-    f.write('};\n')
-
-
-@use
-def method_response_arguments(f, idents: List[Identifier]):
-    # a protocol with every dangerous name as a response argument
-    f.write('using argtype = uint32;\n')
-    f.write('protocol DangerousResponseArguments {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write(
-            '  Method%d() -> (argtype %s);\n' % (ident.tag - 1, ident.ident))
-    f.write('};\n')
-
-
-@use
-def method_event_arguments(f, idents: List[Identifier]):
-    # a protocol with every dangerous name as a event argument
-    f.write('using argtype = uint32;\n')
-    f.write('protocol DangerousResponseArguments {\n')
-    for ident in idents:
-        if ident.bindings_denylist:
-            f.write('[BindingsDenylist="%s"]\n' % ident.bindings_denylist)
-        f.write('  -> Event%d(argtype %s);\n' % (ident.tag - 1, ident.ident))
-    f.write('};\n')
-
-
-def generated(prefix):
-    """Return a header line indicating that this is a generated file."""
-    return """{prefix} Copyright 2019 The Fuchsia Authors. All rights reserved.
-{prefix} Use of this source code is governed by a BSD-style license that can be
-{prefix} found in the LICENSE file.
-{prefix} Generated by {generator}.
-""".format(
-        prefix=prefix,
-        year=datetime.datetime.now().year,
-        generator=os.path.basename(__file__))
-
-
-def library_target(library_name):
-    return '//src/tests/fidl/dangerous_identifiers/fidl:%s' % library_name
-
-
-def dangerous_identifiers() -> List[IdentifierDef]:
-    """Load a list of dangerous identifiers definitions from the source tree.
-
-  Verifies that all definitions are well formed, and that their tags are unique.
-  """
-    file_path = os.path.join(DIR, 'dangerous_identifiers.txt')
-    lines = (
-        line.strip()
-        for line in open(file_path).readlines()
-        if not line.startswith('#'))
-
-    failed = False
-    idents = []
-    tags_seen = set()
-    for line in lines:
-        line_search = re.match(
-            r'^([a-z0-9_]+):([0-9]+)(\s+BindingsDenylist=(.+))?$', line)
-        if line_search:
-            parts = line_search.group(1).split('_')
-            tag = int(line_search.group(2))
-            bindings_denylist = ""
-            if line_search.group(4):
-                bindings_denylist = line_search.group(4)
-            if tag not in tags_seen:
-                tags_seen.add(tag)
-                idents.append(IdentifierDef(parts, tag, bindings_denylist))
-            else:
-                failed = True
-                print("line '%s' has duplicate tag" % line)
-        else:
-            failed = True
-            print("line '%s' is malformed" % line)
-
-    if failed:
-        exit(1)
-    return idents
-
-
-def generate_fidl(identifier_defs: List[IdentifierDef]) -> List[str]:
-    """Generate FIDL libraries for the specified identifier definitions.
-
-  Return the list of library names.
-  """
-    directory = os.path.join(DIR, 'fidl')
-    os.makedirs(directory, exist_ok=True)
-    prefix = 'fidl.test.dangerous'
-    # generate FIDL libraries
-    library_names = []
-    for style_name, style_func in STYLES:
-        for use_name, use_func in USES:
-            library_name = '%s.%s.%s' % (prefix, use_name, style_name)
-            fidl_file = os.path.join(directory, '%s.test.fidl' % library_name)
-            with open(fidl_file, 'w') as f:
-                f.write(generated('//'))
-                f.write('library %s;\n' % library_name)
-                use_func(
-                    f, [
-                        Identifier(
-                            style_func(r.parts), r.tag, r.bindings_denylist)
-                        for r in identifier_defs
-                    ])
-            subprocess.check_output([FIDL_FORMAT, '-i', fidl_file])
-            library_names.append(library_name)
-
-    # generate BUILD.gn for FIDL libraries
-    build_file = os.path.join(directory, 'BUILD.gn')
-    with open(build_file, 'w') as build_gn:
-        build_gn.write(generated('#'))
-        build_gn.write('import("//build/fidl/fidl.gni")\n\n')
-        build_gn.write('group("fidl") {\ndeps=[\n')
-        for library_name in library_names:
-            build_gn.write('  ":%s",\n' % library_name)
-        build_gn.write(']}\n')
-        for library_name in library_names:
-            build_gn.write(
-                'fidl("%s") {\n  sources = [ "%s.test.fidl" ] }\n\n' %
-                (library_name, library_name))
-    subprocess.check_output([GN, 'format', build_file])
-
-    return library_names
-
-
-def generate_cpp(libraries: List[str]) -> None:
-    directory = os.path.join(DIR, 'cpp')
-    os.makedirs(directory, exist_ok=True)
-
-    # generate BUILD.gn for C++ test
-    build_file = os.path.join(directory, 'BUILD.gn')
-    with open(build_file, 'w') as build_gn:
-        build_gn.write(generated('#'))
-        for library_name in libraries:
-            build_gn.write(
-                """source_set("%s_cpp") {
-    output_name = "cpp_fidl_dangerous_identifiers_test_%s"
-    sources = [ "%s_test.cc" ]
-    deps = [
-""" % (library_name, library_name, library_name))
-            build_gn.write('    "%s",\n' % library_target(library_name))
-            build_gn.write('  ]\n}\n')
-        build_gn.write("""group("cpp") {
-    deps = [""")
-        for library_name in libraries:
-            build_gn.write("""
-        ":%s_cpp",
-""" % (library_name))
-        build_gn.write("""
-    ]
-  }""")
-
-    subprocess.check_output([GN, 'format', build_file])
-
-
-def generate_rust(libraries: List[str]) -> None:
-    os.makedirs(os.path.join(DIR, 'rust', 'src'), exist_ok=True)
-
-    # Allowlist of libraries we can compile in Rust
-    # TODO(fxbug.dev/60219): Make all libraries pass.
-    allowed_libraries = {
-            'fidl.test.dangerous.constants.lower',
-            'fidl.test.dangerous.constants.camel',
-            'fidl.test.dangerous.constants.upper',
-            'fidl.test.dangerous.using.lower',
-            'fidl.test.dangerous.using.camel',
-            'fidl.test.dangerous.using.upper',
-            'fidl.test.dangerous.enums.lower',
-            'fidl.test.dangerous.struct.types.lower',
-            'fidl.test.dangerous.struct.types.upper',
-            'fidl.test.dangerous.table.names.lower',
-            'fidl.test.dangerous.table.names.camel',
-            'fidl.test.dangerous.table.names.upper',
-    }
-
-    # BUILD.gn
-    build_file = os.path.join(DIR, 'rust', 'BUILD.gn')
-    with open(build_file, 'w') as f:
-        f.write(generated('#'))
-        f.write('\n')
-        f.write('import("//build/rust/rustc_test.gni")\n')
-        f.write('import("//tools/fidl/measure-tape/measure_tape.gni")\n')
-        f.write('\n')
-        f.write('rustc_test("rust") {\n')
-        f.write('  sources = [ "src/lib.rs" ]\n')
-        f.write('  deps = [\n')
-        for library_name in libraries:
-            f.write('    ')
-            if library_name not in allowed_libraries:
-                f.write('# ')
-            f.write('"%s-rustc",\n' % library_target(library_name))
-        f.write('  ]\n')
-        f.write('}\n')
-    subprocess.check_output([GN, 'format', build_file])
-
-    # lib.rs
-    lib_rs = os.path.join(DIR, 'rust', 'src', 'lib.rs')
-    with open(lib_rs, 'w') as f:
-        f.write(generated('//'))
-        f.write('#![cfg(test)]\n')
-        f.write('#![allow(unused_imports)]\n')
-        f.write('use {\n')
-        for library_name in libraries:
-            f.write('  ')
-            if library_name not in allowed_libraries:
-                f.write('// ')
-            f.write('fidl_%s,\n' % library_name.replace('.', '_'))
-        f.write('};\n')
-    subprocess.check_output([RUST_FORMAT, lib_rs])
-
-
-if __name__ == '__main__':
-    identifier_defs = dangerous_identifiers()
-    library_names = generate_fidl(identifier_defs)
-    generate_cpp(library_names)
-    generate_rust(library_names)
diff --git a/src/tests/fidl/dangerous_identifiers/generate.sh b/src/tests/fidl/dangerous_identifiers/generate.sh
new file mode 100755
index 0000000..f97e0de
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate.sh
@@ -0,0 +1,11 @@
+#!/bin/bash
+# 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.
+
+set -euo pipefail
+
+# Go to the source directory
+cd "$(dirname ${BASH_SOURCE[0]})"
+
+exec python3 -m generate $*
\ No newline at end of file
diff --git a/src/tests/fidl/dangerous_identifiers/generate/__init__.py b/src/tests/fidl/dangerous_identifiers/generate/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate/__init__.py
diff --git a/src/tests/fidl/dangerous_identifiers/generate/__main__.py b/src/tests/fidl/dangerous_identifiers/generate/__main__.py
new file mode 100644
index 0000000..d72ac03
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate/__main__.py
@@ -0,0 +1,212 @@
+#!/usr/bin/env python3
+# 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.
+
+import datetime
+import os
+import platform
+import re
+import subprocess
+import sys
+
+from typing import List, Callable
+
+from generate.types import *
+from generate.identifiers import IDENTIFIERS
+from generate.styles import STYLES
+from generate.uses import USES
+
+# Where is this script?
+MODULE = os.path.dirname(os.path.realpath(__file__))
+
+# Where is the directory containing the module?
+DIR = os.path.dirname(MODULE)
+
+# What platform are we on?
+HOST_PLARFORM = "{}-{}".format(
+    platform.system().lower().replace("darwin", "mac"),
+    {
+        "x86_64": "x64",
+        "aarch64": "arm64",
+    }[platform.machine()],
+)
+
+# Where is gn?
+GN = os.path.realpath(
+    os.path.join(
+        DIR, '../../../../prebuilt/third_party/gn', HOST_PLARFORM, 'gn'))
+FUCHSIA_DIR = os.environ.get('FUCHSIA_DIR')
+FUCHSIA_BUILD_DIR = os.environ.get('FUCHSIA_BUILD_DIR')
+if FUCHSIA_BUILD_DIR is None or FUCHSIA_DIR is None:
+    print(f'Run "fx exec {DIR}/generate.sh".')
+    sys.exit(1)
+FIDL_FORMAT = os.path.join(FUCHSIA_BUILD_DIR, 'host_x64', 'fidl-format')
+RUST_FORMAT = os.path.join(
+    FUCHSIA_DIR, 'prebuilt', 'third_party', 'rust_tools', 'linux-x64', 'bin',
+    'rustfmt')
+
+# Validate IDENTIFIERS
+# check that the style & use names in deny rules are valid
+style_names = frozenset(style.name for style in STYLES)
+use_names = frozenset(use.name for use in USES)
+for ident in IDENTIFIERS:
+    for deny in ident.deny:
+        for style in deny.styles:
+            if style not in style_names:
+                print(
+                    f'Unknown style name "{style}" in deny list for "{ident.name}"'
+                )
+                sys.exit(1)
+        for use in deny.uses:
+            if use not in use_names:
+                print(
+                    f'Unknown use name "{use}" in deny list for "{ident.name}"')
+                sys.exit(1)
+
+
+def generated(prefix: str) -> str:
+    """Return a header line indicating that this is a generated file."""
+    return """{prefix} Copyright 2019 The Fuchsia Authors. All rights reserved.
+{prefix} Use of this source code is governed by a BSD-style license that can be
+{prefix} found in the LICENSE file.
+{prefix} Generated by {generator}.
+""".format(
+        prefix=prefix,
+        generator='//src/tests/fidl/dangerous_identifiers/generate')
+
+
+def library_target(library_name: str) -> str:
+    return '//src/tests/fidl/dangerous_identifiers/fidl:%s' % library_name
+
+
+def generate_fidl(identifier_defs: List[Identifier]) -> List[str]:
+    """Generate FIDL libraries for the specified identifier definitions.
+
+  Return the list of library names.
+  """
+    directory = os.path.join(DIR, 'fidl')
+    os.makedirs(directory, exist_ok=True)
+    prefix = 'fidl.test.dangerous'
+    # generate FIDL libraries
+    library_names = []
+    for style in STYLES:
+        for use in USES:
+            library_name = '%s.%s.%s' % (prefix, use.name, style.name)
+            fidl_file = os.path.join(directory, '%s.test.fidl' % library_name)
+            idents = [ident.scoped(style, use) for ident in identifier_defs]
+            with open(fidl_file, 'w') as f:
+                f.write(generated('//'))
+                f.write('library %s;\n' % library_name)
+                use(f, [ident for ident in idents if not ident.denied])
+            subprocess.check_output([FIDL_FORMAT, '-i', fidl_file])
+            library_names.append(library_name)
+
+    # generate BUILD.gn for FIDL libraries
+    build_file = os.path.join(directory, 'BUILD.gn')
+    with open(build_file, 'w') as build_gn:
+        build_gn.write(generated('#'))
+        build_gn.write('import("//build/fidl/fidl.gni")\n\n')
+        build_gn.write('group("fidl") {\ndeps=[\n')
+        for library_name in library_names:
+            build_gn.write('  ":%s",\n' % library_name)
+        build_gn.write(']}\n')
+        for library_name in library_names:
+            build_gn.write(
+                'fidl("%s") {\n  sources = [ "%s.test.fidl" ] }\n\n' %
+                (library_name, library_name))
+    subprocess.check_output([GN, 'format', build_file])
+
+    return library_names
+
+
+def generate_cpp(libraries: List[str]) -> None:
+    directory = os.path.join(DIR, 'cpp')
+    os.makedirs(directory, exist_ok=True)
+
+    # generate BUILD.gn for C++ test
+    build_file = os.path.join(directory, 'BUILD.gn')
+    with open(build_file, 'w') as build_gn:
+        build_gn.write(generated('#'))
+        for library_name in libraries:
+            build_gn.write(
+                """source_set("%s_cpp") {
+    output_name = "cpp_fidl_dangerous_identifiers_test_%s"
+    sources = [ "%s_test.cc" ]
+    deps = [
+""" % (library_name, library_name, library_name))
+            build_gn.write('    "%s",\n' % library_target(library_name))
+            build_gn.write('  ]\n}\n')
+        build_gn.write("""group("cpp") {
+    deps = [""")
+        for library_name in libraries:
+            build_gn.write("""
+        ":%s_cpp",
+""" % (library_name))
+        build_gn.write("""
+    ]
+  }""")
+
+    subprocess.check_output([GN, 'format', build_file])
+
+
+def generate_rust(libraries: List[str]) -> None:
+    os.makedirs(os.path.join(DIR, 'rust', 'src'), exist_ok=True)
+
+    # Allowlist of libraries we can compile in Rust
+    # TODO(fxbug.dev/60219): Make all libraries pass.
+    allowed_libraries = {
+        'fidl.test.dangerous.constants.lower',
+        'fidl.test.dangerous.constants.camel',
+        'fidl.test.dangerous.constants.upper',
+        'fidl.test.dangerous.using.lower',
+        'fidl.test.dangerous.using.camel',
+        'fidl.test.dangerous.using.upper',
+        'fidl.test.dangerous.enums.lower',
+        'fidl.test.dangerous.struct.types.lower',
+        'fidl.test.dangerous.struct.types.upper',
+        'fidl.test.dangerous.table.names.lower',
+        'fidl.test.dangerous.table.names.camel',
+        'fidl.test.dangerous.table.names.upper',
+    }
+
+    # BUILD.gn
+    build_file = os.path.join(DIR, 'rust', 'BUILD.gn')
+    with open(build_file, 'w') as f:
+        f.write(generated('#'))
+        f.write('\n')
+        f.write('import("//build/rust/rustc_test.gni")\n')
+        f.write('import("//tools/fidl/measure-tape/measure_tape.gni")\n')
+        f.write('\n')
+        f.write('rustc_test("rust") {\n')
+        f.write('  sources = [ "src/lib.rs" ]\n')
+        f.write('  deps = [\n')
+        for library_name in libraries:
+            f.write('    ')
+            if library_name not in allowed_libraries:
+                f.write('# ')
+            f.write('"%s-rustc",\n' % library_target(library_name))
+        f.write('  ]\n')
+        f.write('}\n')
+    subprocess.check_output([GN, 'format', build_file])
+
+    # lib.rs
+    lib_rs = os.path.join(DIR, 'rust', 'src', 'lib.rs')
+    with open(lib_rs, 'w') as f:
+        f.write(generated('//'))
+        f.write('#![cfg(test)]\n')
+        f.write('#![allow(unused_imports)]\n')
+        f.write('use {\n')
+        for library_name in libraries:
+            f.write('  ')
+            if library_name not in allowed_libraries:
+                f.write('// ')
+            f.write('fidl_%s,\n' % library_name.replace('.', '_'))
+        f.write('};\n')
+    subprocess.check_output([RUST_FORMAT, lib_rs])
+
+
+if __name__ == '__main__':
+    library_names = generate_fidl(IDENTIFIERS)
+    generate_cpp(library_names)
+    generate_rust(library_names)
diff --git a/src/tests/fidl/dangerous_identifiers/generate/identifiers.py b/src/tests/fidl/dangerous_identifiers/generate/identifiers.py
new file mode 100644
index 0000000..708920f
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate/identifiers.py
@@ -0,0 +1,249 @@
+# 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__ = ['IDENTIFIERS']
+
+from generate.types import Identifier, Deny
+
+# These are keywords and identifiers used in languages we support and in
+# generated bindings. This list is maintained by hand and should be expanded
+# to cover as many cases as we can think of.
+#
+# Each identifier has lower_camel_case name, a tag (used to maintain source
+# stability when adding identifiers) and optionally a deny list.
+#
+# The deny list members specify a list of styles, uses and bindings to deny.
+# The bindings list is used to decide whether to include certain identifiers
+# in the generated fidl files. If a bindings list is included then a
+# [BindingsDenyList] attribute will be used, if not then the identifier will
+# be entirely ommitted from the affected contexts.
+
+IDENTIFIERS = [
+    Identifier('abstract', 1),
+    Identifier('alignas', 2),
+    Identifier('alignof', 3),
+    Identifier('and', 4),
+    Identifier('and_eq', 5),
+    Identifier('as', 6),
+    Identifier('asm', 7),
+    Identifier('assert', 8),
+    Identifier('async', 9),
+    Identifier('atomic_cancel', 10),
+    Identifier('atomic_commit', 11),
+    Identifier('atomic_noexcept', 12),
+    Identifier('auto', 13),
+    Identifier('await', 14),
+    Identifier('become', 15),
+    Identifier('bitand', 16),
+    Identifier('bitor', 17),
+    Identifier('bool', 18),
+    Identifier('box', 19),
+    Identifier('break', 20),
+    Identifier('byte', 21),
+    Identifier('bytes', 215),
+    Identifier('case', 22),
+    Identifier('catch', 23),
+    Identifier('chan', 24),
+    Identifier('char', 25),
+    Identifier('char16_t', 26),
+    Identifier('char32_t', 27),
+    Identifier('class', 28),
+    Identifier('co_await', 29),
+    Identifier('co_return', 30),
+    Identifier('co_yield', 31),
+    Identifier('coding_traits', 32),
+    Identifier('compl', 33),
+    Identifier('concept', 34),
+    Identifier('const', 35),
+    Identifier('const_cast', 36),
+    Identifier('constexpr', 37),
+    Identifier('continue', 38),
+    Identifier('controller', 39),
+    Identifier('covariant', 40),
+    Identifier('crate', 41),
+    Identifier('decltype', 42),
+    Identifier('decoder', 43),
+    Identifier('default', 44),
+    Identifier('defer', 45),
+    Identifier('deferred', 46),
+    Identifier('delete', 47),
+    Identifier('do', 48),
+    Identifier('double', 49),
+    Identifier('dynamic', 50),
+    Identifier('dynamic_cast', 51),
+    Identifier('else', 52),
+    Identifier('encoder', 53),
+    Identifier('ensure_values_instantiated', 54),
+    Identifier('enum', 55),
+    Identifier('empty', 56),
+    Identifier('err', 57),
+    Identifier('explicit', 58),
+    Identifier('export', 59),
+    Identifier('extends', 60),
+    Identifier('extern', 61),
+    Identifier('external', 62),
+    Identifier('factory', 63),
+    Identifier('fallthrough', 64),
+    Identifier('false', 65),
+    Identifier('fidl', 66),
+    Identifier('fidl_type', 67),
+    Identifier('final', 68),
+    Identifier('finally', 69),
+    Identifier('float', 70),
+    Identifier('fn', 71),
+    Identifier('for', 72),
+    Identifier('friend', 73),
+    Identifier('func', 74),
+    Identifier('future', 75),
+    Identifier('futures', 76),
+    Identifier('get', 77),
+    Identifier('go', 78),
+    Identifier('goto', 79),
+    Identifier('has_invalid_tag', 80),
+    Identifier('hash_code', 81),
+    Identifier('if', 82),
+    Identifier('impl', 83),
+    Identifier('implements', 84),
+    Identifier('import', 85),
+    Identifier('in', 86),
+    Identifier('index', 87),
+    Identifier('inline', 88),
+    Identifier('int', 89),
+    Identifier('int16', 90),
+    Identifier('int32', 91),
+    Identifier('int64', 92),
+    Identifier('int8', 93),
+    Identifier('interface', 94),
+    Identifier('internal_tag', 95),
+    Identifier('is', 96),
+    Identifier('let', 97),
+    Identifier('lhs', 98),
+    Identifier('library', 99),
+    Identifier('list', 100),
+    Identifier('long', 101),
+    Identifier('loop', 102),
+    Identifier('macro', 103),
+    Identifier('map', 104),
+    Identifier('match', 105),
+    Identifier('mixin', 106),
+    Identifier('mod', 107),
+    Identifier('module', 108),
+    Identifier('move', 109),
+    Identifier('mut', 110),
+    Identifier('mutable', 111),
+    Identifier('namespace', 112),
+    Identifier('never', 113),
+    Identifier('new', 114),
+    Identifier('no_such_method', 115),
+    Identifier('noexcept', 116),
+    Identifier('none', 117),
+    Identifier('not', 118),
+    Identifier('not_eq', 119),
+    Identifier('null', 120),
+    Identifier('nullptr', 121),
+    Identifier('num', 122),
+    Identifier('object', 123),
+    Identifier('offset', 124),
+    Identifier('offsetof', 125),
+    Identifier('ok', 126),
+    Identifier('on_open', 127),
+    Identifier('operator', 128),
+    Identifier('option', 129),
+    Identifier('or', 130),
+    Identifier('or_eq', 131),
+    Identifier('override', 132),
+    Identifier('package', 133),
+    Identifier('part', 134),
+    Identifier('priv', 135),
+    Identifier('private', 136),
+    Identifier('proc', 137),
+    Identifier('protected', 138),
+    Identifier('proxy', 139),
+    Identifier('pub', 140),
+    Identifier('public', 141),
+    Identifier('pure', 142),
+    Identifier('range', 143),
+    Identifier('ref', 144),
+    Identifier('register', 145),
+    Identifier('reinterpret_cast', 146),
+    Identifier('requires', 147),
+    Identifier('result', 148),
+    Identifier('rethrow', 149),
+    Identifier('return', 150),
+    Identifier('rhs', 151),
+    Identifier('rune', 152),
+    Identifier('runtime_type', 153),
+    Identifier('select', 154),
+    Identifier('self', 155),
+    Identifier('send', 156),
+    Identifier('set', 157),
+    Identifier('set_controller', 158),
+    Identifier('short', 159),
+    Identifier('signed', 160),
+    Identifier('sizeof', 161),
+    Identifier('some', 162),
+    Identifier('static', 163),
+    Identifier('static_assert', 164),
+    Identifier('static_cast', 165),
+    Identifier('stream', 166),
+    Identifier('string', 167),
+    Identifier('struct', 168),
+    Identifier('stub', 169),
+    Identifier('super', 170),
+    Identifier('switch', 171),
+    Identifier('synchronized', 172),
+    Identifier('template', 173),
+    Identifier('this', 174),
+    Identifier('thread_local', 175),
+    Identifier('throw', 176),
+    Identifier('to_string', 177),
+    Identifier('trait', 178),
+    Identifier('true', 179),
+    Identifier('try', 180),
+    Identifier('type', 181),
+    Identifier('typedef', 182),
+    Identifier('typeid', 183),
+    Identifier('typename', 184),
+    Identifier('typeof', 185),
+    Identifier('uint16', 186),
+    # We use uint32 as a type in some tests which makes it conflict.
+    # See also: fxbug.dev/38124 fxbug.dev/8042)
+    Identifier(
+        'uint32', 187, [
+            Deny(
+                styles=['lower'],
+                uses=['constants', 'struct.types', 'table.names'])
+        ]),
+    Identifier('uint64', 188),
+    Identifier('uint8', 189),
+    Identifier('union', 190),
+    Identifier('unknown', 216),
+    Identifier('unknown_bytes', 217),
+    # TODO(fxb/60495):  Remedy identifier clashes.
+    Identifier('unknown_data', 218, [Deny(bindings=['dart'])]),
+    Identifier('unsafe', 191),
+    Identifier('unsigned', 192),
+    Identifier('unsized', 193),
+    Identifier('use', 194),
+    Identifier('using', 195),
+    Identifier('value', 196),
+    Identifier('value_of', 197),
+    Identifier('value_union', 198),
+    Identifier('values_map', 199),
+    Identifier('var', 200),
+    Identifier('vec', 201),
+    Identifier('virtual', 202),
+    Identifier('void', 203),
+    Identifier('volatile', 204),
+    Identifier('wchar_t', 205),
+    Identifier('where', 206),
+    Identifier('which', 207),
+    Identifier('while', 208),
+    Identifier('with', 209),
+    Identifier('xor', 210),
+    Identifier('xor_eq', 211),
+    Identifier('xunion', 212),
+    Identifier('yield', 213),
+    Identifier('zx', 214),
+]
\ No newline at end of file
diff --git a/src/tests/fidl/dangerous_identifiers/generate/styles.py b/src/tests/fidl/dangerous_identifiers/generate/styles.py
new file mode 100644
index 0000000..c2d2727
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate/styles.py
@@ -0,0 +1,32 @@
+# 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__ = ['STYLES']
+
+from dataclasses import dataclass
+from typing import List, Callable, Tuple
+
+from generate.types import *
+
+# Define ways that identifiers may be rendered
+STYLES: List[Style] = []
+
+
+def style(func):
+    STYLES.append(Style(func.__name__, (func,)))
+
+
+@style
+def lower(ident):
+    return '_'.join(w.lower() for w in ident)
+
+
+@style
+def upper(ident):
+    return '_'.join(w.upper() for w in ident)
+
+
+@style
+def camel(ident):
+    return ''.join(w.capitalize() for w in ident)
\ No newline at end of file
diff --git a/src/tests/fidl/dangerous_identifiers/generate/types.py b/src/tests/fidl/dangerous_identifiers/generate/types.py
new file mode 100644
index 0000000..6a43193
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate/types.py
@@ -0,0 +1,84 @@
+# 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__ = ['Deny', 'Identifier', 'ScopedIdentifier', 'Style', 'Use']
+
+from dataclasses import dataclass, field
+from typing import List, Callable, IO, Optional, Tuple
+from functools import reduce
+
+
+@dataclass
+class Deny:
+    styles: List[str] = field(default_factory=list)
+    uses: List[str] = field(default_factory=list)
+    bindings: List[str] = field(default_factory=list)
+
+    def matches(self, style: 'Style', use: 'Use') -> bool:
+        return not (
+            self.styles and style.name not in self.styles or
+            self.uses and use.name not in self.uses)
+
+
+@dataclass
+class Identifier:
+    name: str
+    tag: int
+    deny: List[Deny] = field(default_factory=list)
+
+    @property
+    def parts(self) -> List[str]:
+        return self.name.split('_')
+
+    def scoped(self, style: 'Style', use: 'Use') -> 'ScopedIdentifier':
+        # All the deny rules for this style & use
+        denies = [deny for deny in self.deny if deny.matches(style, use)]
+        # Bindings deny list
+        bindings_denylist = [
+            binding for deny in denies for binding in deny.bindings
+        ]
+
+        return ScopedIdentifier(
+            style(self.parts), self.tag, style, use,
+            any(d.bindings == [] for d in denies),
+            ','.join(sorted(set(bindings_denylist))))
+
+
+@dataclass
+class ScopedIdentifier:
+    name: str
+    tag: int
+    style: 'Style'
+    use: 'Use'
+    denied: bool
+    bindings_denylist: str
+
+    def __str__(self):
+        return self.name
+
+    @property
+    def decl_attributes(self) -> str:
+        '''Attributes to put on a declaration with this name.'''
+        if self.bindings_denylist:
+            return f'[BindingsDenylist="{self.bindings_denylist}"]\n'
+        else:
+            return ''
+
+
+@dataclass
+class Style:
+    name: str
+    func: Tuple[Callable[[List[str]], str]]
+
+    def __call__(self, parts: List[str]) -> str:
+        return self.func[0](parts)
+
+
+@dataclass
+class Use:
+    name: str
+    func: Tuple[Callable[[IO, List[ScopedIdentifier]], None]]
+
+    def __call__(self, f: IO, idents: List[ScopedIdentifier]):
+        return self.func[0](f, idents)
diff --git a/src/tests/fidl/dangerous_identifiers/generate/uses.py b/src/tests/fidl/dangerous_identifiers/generate/uses.py
new file mode 100644
index 0000000..49a71df
--- /dev/null
+++ b/src/tests/fidl/dangerous_identifiers/generate/uses.py
@@ -0,0 +1,207 @@
+# 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:
+        f.write(ident.decl_attributes)
+        f.write(f'using {ident} = vector;\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('using 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('using 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('using 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('using 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('using 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('using 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')
diff --git a/src/tests/fidl/dangerous_identifiers/rust/BUILD.gn b/src/tests/fidl/dangerous_identifiers/rust/BUILD.gn
index bf2cf78..63a5055 100644
--- a/src/tests/fidl/dangerous_identifiers/rust/BUILD.gn
+++ b/src/tests/fidl/dangerous_identifiers/rust/BUILD.gn
@@ -1,7 +1,7 @@
 # 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.
-# Generated by generate.py.
+# Generated by //src/tests/fidl/dangerous_identifiers/generate.
 
 import("//build/rust/rustc_test.gni")
 import("//tools/fidl/measure-tape/measure_tape.gni")
diff --git a/src/tests/fidl/dangerous_identifiers/rust/src/lib.rs b/src/tests/fidl/dangerous_identifiers/rust/src/lib.rs
index dce5353..b167ce1 100644
--- a/src/tests/fidl/dangerous_identifiers/rust/src/lib.rs
+++ b/src/tests/fidl/dangerous_identifiers/rust/src/lib.rs
@@ -1,7 +1,7 @@
 // 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.
-// Generated by generate.py.
+// Generated by //src/tests/fidl/dangerous_identifiers/generate.
 #![cfg(test)]
 #![allow(unused_imports)]
 use {