rn-leveldb 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +92 -0
  3. package/android/.project +34 -0
  4. package/android/.settings/org.eclipse.buildship.core.prefs +13 -0
  5. package/android/CMakeLists.txt +69 -0
  6. package/android/build.gradle +125 -0
  7. package/android/cpp-adapter.cpp +19 -0
  8. package/android/gradle.properties +6 -0
  9. package/android/src/main/AndroidManifest.xml +4 -0
  10. package/android/src/main/java/com/reactnativeleveldb/LeveldbModule.java +57 -0
  11. package/android/src/main/java/com/reactnativeleveldb/LeveldbPackage.java +28 -0
  12. package/cpp/leveldb/.appveyor.yml +36 -0
  13. package/cpp/leveldb/.clang-format +18 -0
  14. package/cpp/leveldb/.travis.yml +88 -0
  15. package/cpp/leveldb/AUTHORS +12 -0
  16. package/cpp/leveldb/CMakeLists.txt +495 -0
  17. package/cpp/leveldb/CONTRIBUTING.md +36 -0
  18. package/cpp/leveldb/LICENSE +27 -0
  19. package/cpp/leveldb/NEWS +17 -0
  20. package/cpp/leveldb/README.md +231 -0
  21. package/cpp/leveldb/TODO +14 -0
  22. package/cpp/leveldb/benchmarks/db_bench.cc +990 -0
  23. package/cpp/leveldb/benchmarks/db_bench_sqlite3.cc +726 -0
  24. package/cpp/leveldb/benchmarks/db_bench_tree_db.cc +531 -0
  25. package/cpp/leveldb/cmake/leveldbConfig.cmake.in +9 -0
  26. package/cpp/leveldb/db/autocompact_test.cc +115 -0
  27. package/cpp/leveldb/db/builder.cc +82 -0
  28. package/cpp/leveldb/db/builder.h +30 -0
  29. package/cpp/leveldb/db/c.cc +562 -0
  30. package/cpp/leveldb/db/c_test.c +384 -0
  31. package/cpp/leveldb/db/corruption_test.cc +367 -0
  32. package/cpp/leveldb/db/db_impl.cc +1554 -0
  33. package/cpp/leveldb/db/db_impl.h +217 -0
  34. package/cpp/leveldb/db/db_iter.cc +318 -0
  35. package/cpp/leveldb/db/db_iter.h +26 -0
  36. package/cpp/leveldb/db/db_test.cc +2305 -0
  37. package/cpp/leveldb/db/dbformat.cc +136 -0
  38. package/cpp/leveldb/db/dbformat.h +224 -0
  39. package/cpp/leveldb/db/dbformat_test.cc +133 -0
  40. package/cpp/leveldb/db/dumpfile.cc +232 -0
  41. package/cpp/leveldb/db/fault_injection_test.cc +555 -0
  42. package/cpp/leveldb/db/filename.cc +141 -0
  43. package/cpp/leveldb/db/filename.h +83 -0
  44. package/cpp/leveldb/db/filename_test.cc +132 -0
  45. package/cpp/leveldb/db/leveldbutil.cc +64 -0
  46. package/cpp/leveldb/db/log_format.h +35 -0
  47. package/cpp/leveldb/db/log_reader.cc +274 -0
  48. package/cpp/leveldb/db/log_reader.h +112 -0
  49. package/cpp/leveldb/db/log_test.cc +563 -0
  50. package/cpp/leveldb/db/log_writer.cc +111 -0
  51. package/cpp/leveldb/db/log_writer.h +54 -0
  52. package/cpp/leveldb/db/memtable.cc +137 -0
  53. package/cpp/leveldb/db/memtable.h +87 -0
  54. package/cpp/leveldb/db/recovery_test.cc +339 -0
  55. package/cpp/leveldb/db/repair.cc +451 -0
  56. package/cpp/leveldb/db/skiplist.h +382 -0
  57. package/cpp/leveldb/db/skiplist_test.cc +373 -0
  58. package/cpp/leveldb/db/snapshot.h +95 -0
  59. package/cpp/leveldb/db/table_cache.cc +120 -0
  60. package/cpp/leveldb/db/table_cache.h +57 -0
  61. package/cpp/leveldb/db/version_edit.cc +257 -0
  62. package/cpp/leveldb/db/version_edit.h +106 -0
  63. package/cpp/leveldb/db/version_edit_test.cc +46 -0
  64. package/cpp/leveldb/db/version_set.cc +1562 -0
  65. package/cpp/leveldb/db/version_set.h +393 -0
  66. package/cpp/leveldb/db/version_set_test.cc +336 -0
  67. package/cpp/leveldb/db/write_batch.cc +150 -0
  68. package/cpp/leveldb/db/write_batch_internal.h +45 -0
  69. package/cpp/leveldb/db/write_batch_test.cc +137 -0
  70. package/cpp/leveldb/doc/benchmark.html +459 -0
  71. package/cpp/leveldb/doc/impl.md +172 -0
  72. package/cpp/leveldb/doc/index.md +523 -0
  73. package/cpp/leveldb/doc/log_format.md +75 -0
  74. package/cpp/leveldb/doc/table_format.md +107 -0
  75. package/cpp/leveldb/helpers/memenv/memenv.cc +390 -0
  76. package/cpp/leveldb/helpers/memenv/memenv.h +22 -0
  77. package/cpp/leveldb/helpers/memenv/memenv_test.cc +264 -0
  78. package/cpp/leveldb/include/leveldb/c.h +270 -0
  79. package/cpp/leveldb/include/leveldb/cache.h +111 -0
  80. package/cpp/leveldb/include/leveldb/comparator.h +64 -0
  81. package/cpp/leveldb/include/leveldb/db.h +167 -0
  82. package/cpp/leveldb/include/leveldb/dumpfile.h +28 -0
  83. package/cpp/leveldb/include/leveldb/env.h +417 -0
  84. package/cpp/leveldb/include/leveldb/export.h +33 -0
  85. package/cpp/leveldb/include/leveldb/filter_policy.h +72 -0
  86. package/cpp/leveldb/include/leveldb/iterator.h +112 -0
  87. package/cpp/leveldb/include/leveldb/options.h +187 -0
  88. package/cpp/leveldb/include/leveldb/slice.h +114 -0
  89. package/cpp/leveldb/include/leveldb/status.h +122 -0
  90. package/cpp/leveldb/include/leveldb/table.h +84 -0
  91. package/cpp/leveldb/include/leveldb/table_builder.h +93 -0
  92. package/cpp/leveldb/include/leveldb/write_batch.h +83 -0
  93. package/cpp/leveldb/issues/issue178_test.cc +90 -0
  94. package/cpp/leveldb/issues/issue200_test.cc +59 -0
  95. package/cpp/leveldb/issues/issue320_test.cc +131 -0
  96. package/cpp/leveldb/port/README.md +10 -0
  97. package/cpp/leveldb/port/port.h +19 -0
  98. package/cpp/leveldb/port/port_config.h.in +33 -0
  99. package/cpp/leveldb/port/port_example.h +100 -0
  100. package/cpp/leveldb/port/port_stdcxx.h +151 -0
  101. package/cpp/leveldb/port/thread_annotations.h +108 -0
  102. package/cpp/leveldb/table/block.cc +267 -0
  103. package/cpp/leveldb/table/block.h +44 -0
  104. package/cpp/leveldb/table/block_builder.cc +107 -0
  105. package/cpp/leveldb/table/block_builder.h +54 -0
  106. package/cpp/leveldb/table/filter_block.cc +106 -0
  107. package/cpp/leveldb/table/filter_block.h +68 -0
  108. package/cpp/leveldb/table/filter_block_test.cc +127 -0
  109. package/cpp/leveldb/table/format.cc +141 -0
  110. package/cpp/leveldb/table/format.h +99 -0
  111. package/cpp/leveldb/table/iterator.cc +76 -0
  112. package/cpp/leveldb/table/iterator_wrapper.h +92 -0
  113. package/cpp/leveldb/table/merger.cc +191 -0
  114. package/cpp/leveldb/table/merger.h +26 -0
  115. package/cpp/leveldb/table/table.cc +271 -0
  116. package/cpp/leveldb/table/table_builder.cc +265 -0
  117. package/cpp/leveldb/table/table_test.cc +834 -0
  118. package/cpp/leveldb/table/two_level_iterator.cc +171 -0
  119. package/cpp/leveldb/table/two_level_iterator.h +31 -0
  120. package/cpp/leveldb/third_party/benchmark/.clang-format +5 -0
  121. package/cpp/leveldb/third_party/benchmark/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  122. package/cpp/leveldb/third_party/benchmark/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  123. package/cpp/leveldb/third_party/benchmark/.github/workflows/build-and-test.yml +38 -0
  124. package/cpp/leveldb/third_party/benchmark/.github/workflows/pylint.yml +26 -0
  125. package/cpp/leveldb/third_party/benchmark/.github/workflows/test_bindings.yml +24 -0
  126. package/cpp/leveldb/third_party/benchmark/.travis-libcxx-setup.sh +28 -0
  127. package/cpp/leveldb/third_party/benchmark/.travis.yml +231 -0
  128. package/cpp/leveldb/third_party/benchmark/.ycm_extra_conf.py +115 -0
  129. package/cpp/leveldb/third_party/benchmark/AUTHORS +58 -0
  130. package/cpp/leveldb/third_party/benchmark/BUILD.bazel +44 -0
  131. package/cpp/leveldb/third_party/benchmark/CMakeLists.txt +287 -0
  132. package/cpp/leveldb/third_party/benchmark/CONTRIBUTING.md +58 -0
  133. package/cpp/leveldb/third_party/benchmark/CONTRIBUTORS +83 -0
  134. package/cpp/leveldb/third_party/benchmark/LICENSE +202 -0
  135. package/cpp/leveldb/third_party/benchmark/README.md +1323 -0
  136. package/cpp/leveldb/third_party/benchmark/WORKSPACE +51 -0
  137. package/cpp/leveldb/third_party/benchmark/_config.yml +1 -0
  138. package/cpp/leveldb/third_party/benchmark/appveyor.yml +50 -0
  139. package/cpp/leveldb/third_party/benchmark/bindings/python/BUILD +3 -0
  140. package/cpp/leveldb/third_party/benchmark/bindings/python/build_defs.bzl +25 -0
  141. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/BUILD +38 -0
  142. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/__init__.py +156 -0
  143. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/benchmark.cc +180 -0
  144. package/cpp/leveldb/third_party/benchmark/bindings/python/google_benchmark/example.py +136 -0
  145. package/cpp/leveldb/third_party/benchmark/bindings/python/pybind11.BUILD +20 -0
  146. package/cpp/leveldb/third_party/benchmark/bindings/python/python_headers.BUILD +6 -0
  147. package/cpp/leveldb/third_party/benchmark/bindings/python/requirements.txt +2 -0
  148. package/cpp/leveldb/third_party/benchmark/cmake/AddCXXCompilerFlag.cmake +74 -0
  149. package/cpp/leveldb/third_party/benchmark/cmake/CXXFeatureCheck.cmake +69 -0
  150. package/cpp/leveldb/third_party/benchmark/cmake/Config.cmake.in +1 -0
  151. package/cpp/leveldb/third_party/benchmark/cmake/GetGitVersion.cmake +54 -0
  152. package/cpp/leveldb/third_party/benchmark/cmake/GoogleTest.cmake +41 -0
  153. package/cpp/leveldb/third_party/benchmark/cmake/GoogleTest.cmake.in +58 -0
  154. package/cpp/leveldb/third_party/benchmark/cmake/benchmark.pc.in +12 -0
  155. package/cpp/leveldb/third_party/benchmark/cmake/gnu_posix_regex.cpp +12 -0
  156. package/cpp/leveldb/third_party/benchmark/cmake/llvm-toolchain.cmake +8 -0
  157. package/cpp/leveldb/third_party/benchmark/cmake/posix_regex.cpp +14 -0
  158. package/cpp/leveldb/third_party/benchmark/cmake/split_list.cmake +3 -0
  159. package/cpp/leveldb/third_party/benchmark/cmake/std_regex.cpp +10 -0
  160. package/cpp/leveldb/third_party/benchmark/cmake/steady_clock.cpp +7 -0
  161. package/cpp/leveldb/third_party/benchmark/cmake/thread_safety_attributes.cpp +4 -0
  162. package/cpp/leveldb/third_party/benchmark/conan/CMakeLists.txt +7 -0
  163. package/cpp/leveldb/third_party/benchmark/conan/test_package/CMakeLists.txt +10 -0
  164. package/cpp/leveldb/third_party/benchmark/conan/test_package/conanfile.py +19 -0
  165. package/cpp/leveldb/third_party/benchmark/conan/test_package/test_package.cpp +18 -0
  166. package/cpp/leveldb/third_party/benchmark/conanfile.py +79 -0
  167. package/cpp/leveldb/third_party/benchmark/dependencies.md +18 -0
  168. package/cpp/leveldb/third_party/benchmark/docs/AssemblyTests.md +147 -0
  169. package/cpp/leveldb/third_party/benchmark/docs/_config.yml +1 -0
  170. package/cpp/leveldb/third_party/benchmark/docs/releasing.md +16 -0
  171. package/cpp/leveldb/third_party/benchmark/docs/tools.md +203 -0
  172. package/cpp/leveldb/third_party/benchmark/include/benchmark/benchmark.h +1604 -0
  173. package/cpp/leveldb/third_party/benchmark/requirements.txt +2 -0
  174. package/cpp/leveldb/third_party/benchmark/setup.py +140 -0
  175. package/cpp/leveldb/third_party/benchmark/src/CMakeLists.txt +114 -0
  176. package/cpp/leveldb/third_party/benchmark/src/arraysize.h +33 -0
  177. package/cpp/leveldb/third_party/benchmark/src/benchmark.cc +499 -0
  178. package/cpp/leveldb/third_party/benchmark/src/benchmark_api_internal.cc +15 -0
  179. package/cpp/leveldb/third_party/benchmark/src/benchmark_api_internal.h +53 -0
  180. package/cpp/leveldb/third_party/benchmark/src/benchmark_main.cc +17 -0
  181. package/cpp/leveldb/third_party/benchmark/src/benchmark_name.cc +58 -0
  182. package/cpp/leveldb/third_party/benchmark/src/benchmark_register.cc +515 -0
  183. package/cpp/leveldb/third_party/benchmark/src/benchmark_register.h +108 -0
  184. package/cpp/leveldb/third_party/benchmark/src/benchmark_runner.cc +362 -0
  185. package/cpp/leveldb/third_party/benchmark/src/benchmark_runner.h +51 -0
  186. package/cpp/leveldb/third_party/benchmark/src/check.h +82 -0
  187. package/cpp/leveldb/third_party/benchmark/src/colorprint.cc +188 -0
  188. package/cpp/leveldb/third_party/benchmark/src/colorprint.h +33 -0
  189. package/cpp/leveldb/third_party/benchmark/src/commandlineflags.cc +228 -0
  190. package/cpp/leveldb/third_party/benchmark/src/commandlineflags.h +103 -0
  191. package/cpp/leveldb/third_party/benchmark/src/complexity.cc +238 -0
  192. package/cpp/leveldb/third_party/benchmark/src/complexity.h +55 -0
  193. package/cpp/leveldb/third_party/benchmark/src/console_reporter.cc +177 -0
  194. package/cpp/leveldb/third_party/benchmark/src/counter.cc +80 -0
  195. package/cpp/leveldb/third_party/benchmark/src/counter.h +32 -0
  196. package/cpp/leveldb/third_party/benchmark/src/csv_reporter.cc +154 -0
  197. package/cpp/leveldb/third_party/benchmark/src/cycleclock.h +211 -0
  198. package/cpp/leveldb/third_party/benchmark/src/internal_macros.h +102 -0
  199. package/cpp/leveldb/third_party/benchmark/src/json_reporter.cc +255 -0
  200. package/cpp/leveldb/third_party/benchmark/src/log.h +74 -0
  201. package/cpp/leveldb/third_party/benchmark/src/mutex.h +155 -0
  202. package/cpp/leveldb/third_party/benchmark/src/re.h +158 -0
  203. package/cpp/leveldb/third_party/benchmark/src/reporter.cc +105 -0
  204. package/cpp/leveldb/third_party/benchmark/src/sleep.cc +67 -0
  205. package/cpp/leveldb/third_party/benchmark/src/sleep.h +15 -0
  206. package/cpp/leveldb/third_party/benchmark/src/statistics.cc +193 -0
  207. package/cpp/leveldb/third_party/benchmark/src/statistics.h +37 -0
  208. package/cpp/leveldb/third_party/benchmark/src/string_util.cc +255 -0
  209. package/cpp/leveldb/third_party/benchmark/src/string_util.h +59 -0
  210. package/cpp/leveldb/third_party/benchmark/src/sysinfo.cc +716 -0
  211. package/cpp/leveldb/third_party/benchmark/src/thread_manager.h +64 -0
  212. package/cpp/leveldb/third_party/benchmark/src/thread_timer.h +86 -0
  213. package/cpp/leveldb/third_party/benchmark/src/timers.cc +245 -0
  214. package/cpp/leveldb/third_party/benchmark/src/timers.h +48 -0
  215. package/cpp/leveldb/third_party/benchmark/test/AssemblyTests.cmake +46 -0
  216. package/cpp/leveldb/third_party/benchmark/test/BUILD +73 -0
  217. package/cpp/leveldb/third_party/benchmark/test/CMakeLists.txt +263 -0
  218. package/cpp/leveldb/third_party/benchmark/test/args_product_test.cc +77 -0
  219. package/cpp/leveldb/third_party/benchmark/test/basic_test.cc +136 -0
  220. package/cpp/leveldb/third_party/benchmark/test/benchmark_gtest.cc +134 -0
  221. package/cpp/leveldb/third_party/benchmark/test/benchmark_name_gtest.cc +74 -0
  222. package/cpp/leveldb/third_party/benchmark/test/benchmark_test.cc +245 -0
  223. package/cpp/leveldb/third_party/benchmark/test/clobber_memory_assembly_test.cc +64 -0
  224. package/cpp/leveldb/third_party/benchmark/test/commandlineflags_gtest.cc +201 -0
  225. package/cpp/leveldb/third_party/benchmark/test/complexity_test.cc +213 -0
  226. package/cpp/leveldb/third_party/benchmark/test/cxx03_test.cc +63 -0
  227. package/cpp/leveldb/third_party/benchmark/test/diagnostics_test.cc +80 -0
  228. package/cpp/leveldb/third_party/benchmark/test/display_aggregates_only_test.cc +43 -0
  229. package/cpp/leveldb/third_party/benchmark/test/donotoptimize_assembly_test.cc +163 -0
  230. package/cpp/leveldb/third_party/benchmark/test/donotoptimize_test.cc +52 -0
  231. package/cpp/leveldb/third_party/benchmark/test/filter_test.cc +104 -0
  232. package/cpp/leveldb/third_party/benchmark/test/fixture_test.cc +51 -0
  233. package/cpp/leveldb/third_party/benchmark/test/internal_threading_test.cc +184 -0
  234. package/cpp/leveldb/third_party/benchmark/test/link_main_test.cc +8 -0
  235. package/cpp/leveldb/third_party/benchmark/test/map_test.cc +57 -0
  236. package/cpp/leveldb/third_party/benchmark/test/memory_manager_test.cc +44 -0
  237. package/cpp/leveldb/third_party/benchmark/test/multiple_ranges_test.cc +96 -0
  238. package/cpp/leveldb/third_party/benchmark/test/options_test.cc +75 -0
  239. package/cpp/leveldb/third_party/benchmark/test/output_test.h +213 -0
  240. package/cpp/leveldb/third_party/benchmark/test/output_test_helper.cc +515 -0
  241. package/cpp/leveldb/third_party/benchmark/test/register_benchmark_test.cc +184 -0
  242. package/cpp/leveldb/third_party/benchmark/test/report_aggregates_only_test.cc +39 -0
  243. package/cpp/leveldb/third_party/benchmark/test/reporter_output_test.cc +747 -0
  244. package/cpp/leveldb/third_party/benchmark/test/skip_with_error_test.cc +195 -0
  245. package/cpp/leveldb/third_party/benchmark/test/state_assembly_test.cc +68 -0
  246. package/cpp/leveldb/third_party/benchmark/test/statistics_gtest.cc +28 -0
  247. package/cpp/leveldb/third_party/benchmark/test/string_util_gtest.cc +153 -0
  248. package/cpp/leveldb/third_party/benchmark/test/templated_fixture_test.cc +28 -0
  249. package/cpp/leveldb/third_party/benchmark/test/user_counters_tabular_test.cc +285 -0
  250. package/cpp/leveldb/third_party/benchmark/test/user_counters_test.cc +531 -0
  251. package/cpp/leveldb/third_party/benchmark/test/user_counters_thousands_test.cc +173 -0
  252. package/cpp/leveldb/third_party/benchmark/tools/BUILD.bazel +19 -0
  253. package/cpp/leveldb/third_party/benchmark/tools/compare.py +429 -0
  254. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test1_run1.json +119 -0
  255. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test1_run2.json +119 -0
  256. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test2_run.json +81 -0
  257. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test3_run0.json +65 -0
  258. package/cpp/leveldb/third_party/benchmark/tools/gbench/Inputs/test3_run1.json +65 -0
  259. package/cpp/leveldb/third_party/benchmark/tools/gbench/__init__.py +8 -0
  260. package/cpp/leveldb/third_party/benchmark/tools/gbench/report.py +903 -0
  261. package/cpp/leveldb/third_party/benchmark/tools/gbench/util.py +163 -0
  262. package/cpp/leveldb/third_party/benchmark/tools/requirements.txt +1 -0
  263. package/cpp/leveldb/third_party/benchmark/tools/strip_asm.py +151 -0
  264. package/cpp/leveldb/third_party/googletest/.clang-format +4 -0
  265. package/cpp/leveldb/third_party/googletest/.travis.yml +73 -0
  266. package/cpp/leveldb/third_party/googletest/BUILD.bazel +179 -0
  267. package/cpp/leveldb/third_party/googletest/CMakeLists.txt +36 -0
  268. package/cpp/leveldb/third_party/googletest/CONTRIBUTING.md +142 -0
  269. package/cpp/leveldb/third_party/googletest/LICENSE +28 -0
  270. package/cpp/leveldb/third_party/googletest/README.md +132 -0
  271. package/cpp/leveldb/third_party/googletest/WORKSPACE +23 -0
  272. package/cpp/leveldb/third_party/googletest/appveyor.yml +154 -0
  273. package/cpp/leveldb/third_party/googletest/ci/build-linux-bazel.sh +37 -0
  274. package/cpp/leveldb/third_party/googletest/ci/build-platformio.sh +2 -0
  275. package/cpp/leveldb/third_party/googletest/ci/env-linux.sh +41 -0
  276. package/cpp/leveldb/third_party/googletest/ci/env-osx.sh +47 -0
  277. package/cpp/leveldb/third_party/googletest/ci/get-nprocessors.sh +48 -0
  278. package/cpp/leveldb/third_party/googletest/ci/install-linux.sh +49 -0
  279. package/cpp/leveldb/third_party/googletest/ci/install-osx.sh +40 -0
  280. package/cpp/leveldb/third_party/googletest/ci/install-platformio.sh +5 -0
  281. package/cpp/leveldb/third_party/googletest/ci/log-config.sh +51 -0
  282. package/cpp/leveldb/third_party/googletest/ci/travis.sh +44 -0
  283. package/cpp/leveldb/third_party/googletest/googlemock/CMakeLists.txt +233 -0
  284. package/cpp/leveldb/third_party/googletest/googlemock/CONTRIBUTORS +40 -0
  285. package/cpp/leveldb/third_party/googletest/googlemock/LICENSE +28 -0
  286. package/cpp/leveldb/third_party/googletest/googlemock/README.md +44 -0
  287. package/cpp/leveldb/third_party/googletest/googlemock/cmake/gmock.pc.in +10 -0
  288. package/cpp/leveldb/third_party/googletest/googlemock/cmake/gmock_main.pc.in +10 -0
  289. package/cpp/leveldb/third_party/googletest/googlemock/docs/cheat_sheet.md +770 -0
  290. package/cpp/leveldb/third_party/googletest/googlemock/docs/cook_book.md +4270 -0
  291. package/cpp/leveldb/third_party/googletest/googlemock/docs/for_dummies.md +700 -0
  292. package/cpp/leveldb/third_party/googletest/googlemock/docs/gmock_faq.md +396 -0
  293. package/cpp/leveldb/third_party/googletest/googlemock/docs/pump_manual.md +187 -0
  294. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-actions.h +1193 -0
  295. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-cardinalities.h +157 -0
  296. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-function-mocker.h +276 -0
  297. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-actions.h +1884 -0
  298. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-actions.h.pump +627 -0
  299. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h +752 -0
  300. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +227 -0
  301. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-matchers.h +1097 -0
  302. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-generated-matchers.h.pump +346 -0
  303. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-matchers.h +4591 -0
  304. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-more-actions.h +162 -0
  305. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-more-matchers.h +92 -0
  306. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-nice-strict.h +215 -0
  307. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock-spec-builders.h +1985 -0
  308. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/gmock.h +101 -0
  309. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/README.md +16 -0
  310. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +10 -0
  311. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +12 -0
  312. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-matchers.h +36 -0
  313. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/custom/gmock-port.h +39 -0
  314. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/gmock-internal-utils.h +472 -0
  315. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/gmock-port.h +87 -0
  316. package/cpp/leveldb/third_party/googletest/googlemock/include/gmock/internal/gmock-pp.h +271 -0
  317. package/cpp/leveldb/third_party/googletest/googlemock/scripts/README.md +5 -0
  318. package/cpp/leveldb/third_party/googletest/googlemock/scripts/fuse_gmock_files.py +240 -0
  319. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/LICENSE +203 -0
  320. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/README +34 -0
  321. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/README.cppclean +115 -0
  322. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  323. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/ast.py +1761 -0
  324. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class.py +248 -0
  325. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/gmock_class_test.py +540 -0
  326. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/keywords.py +56 -0
  327. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/tokenize.py +284 -0
  328. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/cpp/utils.py +37 -0
  329. package/cpp/leveldb/third_party/googletest/googlemock/scripts/generator/gmock_gen.py +30 -0
  330. package/cpp/leveldb/third_party/googletest/googlemock/scripts/pump.py +856 -0
  331. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-all.cc +46 -0
  332. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-cardinalities.cc +155 -0
  333. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-internal-utils.cc +200 -0
  334. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-matchers.cc +462 -0
  335. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock-spec-builders.cc +892 -0
  336. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock.cc +213 -0
  337. package/cpp/leveldb/third_party/googletest/googlemock/src/gmock_main.cc +72 -0
  338. package/cpp/leveldb/third_party/googletest/googlemock/test/BUILD.bazel +110 -0
  339. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-actions_test.cc +1507 -0
  340. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-cardinalities_test.cc +429 -0
  341. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-function-mocker_nc.cc +16 -0
  342. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-function-mocker_nc_test.py +43 -0
  343. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-function-mocker_test.cc +696 -0
  344. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-generated-actions_test.cc +1064 -0
  345. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-generated-function-mockers_test.cc +659 -0
  346. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-generated-matchers_test.cc +1323 -0
  347. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-internal-utils_test.cc +732 -0
  348. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-matchers_test.cc +6913 -0
  349. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-more-actions_test.cc +698 -0
  350. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-nice-strict_test.cc +500 -0
  351. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-port_test.cc +42 -0
  352. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-pp-string_test.cc +206 -0
  353. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-pp_test.cc +83 -0
  354. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock-spec-builders_test.cc +2775 -0
  355. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_all_test.cc +49 -0
  356. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_ex_test.cc +80 -0
  357. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_leak_test.py +104 -0
  358. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_leak_test_.cc +99 -0
  359. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_link2_test.cc +39 -0
  360. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_link_test.cc +39 -0
  361. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_link_test.h +690 -0
  362. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_output_test.py +183 -0
  363. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_output_test_.cc +309 -0
  364. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_output_test_golden.txt +317 -0
  365. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_stress_test.cc +240 -0
  366. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_test.cc +181 -0
  367. package/cpp/leveldb/third_party/googletest/googlemock/test/gmock_test_utils.py +108 -0
  368. package/cpp/leveldb/third_party/googletest/googlemock/test/pump_test.py +182 -0
  369. package/cpp/leveldb/third_party/googletest/googletest/CMakeLists.txt +329 -0
  370. package/cpp/leveldb/third_party/googletest/googletest/CONTRIBUTORS +38 -0
  371. package/cpp/leveldb/third_party/googletest/googletest/LICENSE +28 -0
  372. package/cpp/leveldb/third_party/googletest/googletest/README.md +244 -0
  373. package/cpp/leveldb/third_party/googletest/googletest/cmake/Config.cmake.in +9 -0
  374. package/cpp/leveldb/third_party/googletest/googletest/cmake/gtest.pc.in +9 -0
  375. package/cpp/leveldb/third_party/googletest/googletest/cmake/gtest_main.pc.in +10 -0
  376. package/cpp/leveldb/third_party/googletest/googletest/cmake/internal_utils.cmake +358 -0
  377. package/cpp/leveldb/third_party/googletest/googletest/cmake/libgtest.la.in +21 -0
  378. package/cpp/leveldb/third_party/googletest/googletest/docs/advanced.md +2567 -0
  379. package/cpp/leveldb/third_party/googletest/googletest/docs/faq.md +753 -0
  380. package/cpp/leveldb/third_party/googletest/googletest/docs/pkgconfig.md +219 -0
  381. package/cpp/leveldb/third_party/googletest/googletest/docs/primer.md +579 -0
  382. package/cpp/leveldb/third_party/googletest/googletest/docs/samples.md +22 -0
  383. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-death-test.h +343 -0
  384. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-matchers.h +750 -0
  385. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-message.h +219 -0
  386. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-param-test.h +514 -0
  387. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-printers.h +928 -0
  388. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-spi.h +238 -0
  389. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-test-part.h +184 -0
  390. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest-typed-test.h +337 -0
  391. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest.h +2477 -0
  392. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest_pred_impl.h +359 -0
  393. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/gtest_prod.h +61 -0
  394. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/README.md +56 -0
  395. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/gtest-port.h +37 -0
  396. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  397. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/custom/gtest.h +37 -0
  398. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-death-test-internal.h +304 -0
  399. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-filepath.h +211 -0
  400. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-internal.h +1411 -0
  401. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-param-util.h +880 -0
  402. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-port-arch.h +111 -0
  403. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-port.h +2227 -0
  404. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-string.h +171 -0
  405. package/cpp/leveldb/third_party/googletest/googletest/include/gtest/internal/gtest-type-util.h +183 -0
  406. package/cpp/leveldb/third_party/googletest/googletest/samples/prime_tables.h +126 -0
  407. package/cpp/leveldb/third_party/googletest/googletest/samples/sample1.cc +66 -0
  408. package/cpp/leveldb/third_party/googletest/googletest/samples/sample1.h +41 -0
  409. package/cpp/leveldb/third_party/googletest/googletest/samples/sample10_unittest.cc +139 -0
  410. package/cpp/leveldb/third_party/googletest/googletest/samples/sample1_unittest.cc +151 -0
  411. package/cpp/leveldb/third_party/googletest/googletest/samples/sample2.cc +54 -0
  412. package/cpp/leveldb/third_party/googletest/googletest/samples/sample2.h +81 -0
  413. package/cpp/leveldb/third_party/googletest/googletest/samples/sample2_unittest.cc +107 -0
  414. package/cpp/leveldb/third_party/googletest/googletest/samples/sample3-inl.h +172 -0
  415. package/cpp/leveldb/third_party/googletest/googletest/samples/sample3_unittest.cc +149 -0
  416. package/cpp/leveldb/third_party/googletest/googletest/samples/sample4.cc +54 -0
  417. package/cpp/leveldb/third_party/googletest/googletest/samples/sample4.h +53 -0
  418. package/cpp/leveldb/third_party/googletest/googletest/samples/sample4_unittest.cc +53 -0
  419. package/cpp/leveldb/third_party/googletest/googletest/samples/sample5_unittest.cc +196 -0
  420. package/cpp/leveldb/third_party/googletest/googletest/samples/sample6_unittest.cc +224 -0
  421. package/cpp/leveldb/third_party/googletest/googletest/samples/sample7_unittest.cc +117 -0
  422. package/cpp/leveldb/third_party/googletest/googletest/samples/sample8_unittest.cc +154 -0
  423. package/cpp/leveldb/third_party/googletest/googletest/samples/sample9_unittest.cc +156 -0
  424. package/cpp/leveldb/third_party/googletest/googletest/scripts/README.md +5 -0
  425. package/cpp/leveldb/third_party/googletest/googletest/scripts/common.py +83 -0
  426. package/cpp/leveldb/third_party/googletest/googletest/scripts/fuse_gtest_files.py +253 -0
  427. package/cpp/leveldb/third_party/googletest/googletest/scripts/gen_gtest_pred_impl.py +734 -0
  428. package/cpp/leveldb/third_party/googletest/googletest/scripts/gtest-config.in +274 -0
  429. package/cpp/leveldb/third_party/googletest/googletest/scripts/release_docs.py +158 -0
  430. package/cpp/leveldb/third_party/googletest/googletest/scripts/run_with_path.py +32 -0
  431. package/cpp/leveldb/third_party/googletest/googletest/scripts/upload.py +1402 -0
  432. package/cpp/leveldb/third_party/googletest/googletest/scripts/upload_gtest.py +78 -0
  433. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-all.cc +48 -0
  434. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-death-test.cc +1653 -0
  435. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-filepath.cc +382 -0
  436. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-internal-inl.h +1211 -0
  437. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-matchers.cc +97 -0
  438. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-port.cc +1399 -0
  439. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-printers.cc +442 -0
  440. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-test-part.cc +108 -0
  441. package/cpp/leveldb/third_party/googletest/googletest/src/gtest-typed-test.cc +118 -0
  442. package/cpp/leveldb/third_party/googletest/googletest/src/gtest.cc +6180 -0
  443. package/cpp/leveldb/third_party/googletest/googletest/src/gtest_main.cc +54 -0
  444. package/cpp/leveldb/third_party/googletest/googletest/test/BUILD.bazel +529 -0
  445. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-break-on-failure-unittest.py +208 -0
  446. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-break-on-failure-unittest_.cc +86 -0
  447. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-catch-exceptions-test.py +236 -0
  448. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-catch-exceptions-test_.cc +293 -0
  449. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-color-test.py +127 -0
  450. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-color-test_.cc +62 -0
  451. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-death-test-test.cc +1516 -0
  452. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-death-test_ex_test.cc +92 -0
  453. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-env-var-test.py +117 -0
  454. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-env-var-test_.cc +122 -0
  455. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-filepath-test.cc +649 -0
  456. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-filter-unittest.py +639 -0
  457. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-filter-unittest_.cc +137 -0
  458. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-json-outfiles-test.py +191 -0
  459. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-json-output-unittest.py +778 -0
  460. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-list-tests-unittest.py +205 -0
  461. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-list-tests-unittest_.cc +156 -0
  462. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-listener-test.cc +518 -0
  463. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-message-test.cc +158 -0
  464. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-options-test.cc +216 -0
  465. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-output-test-golden-lin.txt +1137 -0
  466. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-output-test.py +346 -0
  467. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-output-test_.cc +1149 -0
  468. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name1-test.py +63 -0
  469. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name1-test_.cc +50 -0
  470. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name2-test.py +62 -0
  471. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-invalid-name2-test_.cc +55 -0
  472. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-test.cc +1086 -0
  473. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test-test.h +51 -0
  474. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-param-test2-test.cc +61 -0
  475. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-port-test.cc +1272 -0
  476. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-printers-test.cc +1619 -0
  477. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-shuffle-test.py +323 -0
  478. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-shuffle-test_.cc +101 -0
  479. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-test-part-test.cc +230 -0
  480. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-test2_test.cc +61 -0
  481. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-throw-on-failure-test.py +168 -0
  482. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-throw-on-failure-test_.cc +71 -0
  483. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-uninitialized-test.py +67 -0
  484. package/cpp/leveldb/third_party/googletest/googletest/test/googletest-uninitialized-test_.cc +42 -0
  485. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-typed-test2_test.cc +44 -0
  486. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-typed-test_test.cc +462 -0
  487. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-typed-test_test.h +65 -0
  488. package/cpp/leveldb/third_party/googletest/googletest/test/gtest-unittest-api_test.cc +341 -0
  489. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_all_test.cc +46 -0
  490. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_assert_by_exception_test.cc +116 -0
  491. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_environment_test.cc +188 -0
  492. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_help_test.py +170 -0
  493. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_help_test_.cc +45 -0
  494. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_json_test_utils.py +60 -0
  495. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_list_output_unittest.py +141 -0
  496. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_list_output_unittest_.cc +51 -0
  497. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_main_unittest.cc +44 -0
  498. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_no_test_unittest.cc +54 -0
  499. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_pred_impl_unittest.cc +2427 -0
  500. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_premature_exit_test.cc +126 -0
  501. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_prod_test.cc +56 -0
  502. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_repeat_test.cc +233 -0
  503. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_check_output_test.py +59 -0
  504. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_environment_check_output_test.py +54 -0
  505. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_in_environment_setup_test.cc +49 -0
  506. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_skip_test.cc +55 -0
  507. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_sole_header_test.cc +56 -0
  508. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_stress_test.cc +248 -0
  509. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_test_macro_stack_footprint_test.cc +89 -0
  510. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_test_utils.py +314 -0
  511. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_testbridge_test.py +63 -0
  512. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_testbridge_test_.cc +43 -0
  513. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_throw_on_failure_ex_test.cc +90 -0
  514. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_unittest.cc +7496 -0
  515. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_outfile1_test_.cc +43 -0
  516. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_outfile2_test_.cc +43 -0
  517. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_outfiles_test.py +135 -0
  518. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_output_unittest.py +389 -0
  519. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_output_unittest_.cc +188 -0
  520. package/cpp/leveldb/third_party/googletest/googletest/test/gtest_xml_test_utils.py +196 -0
  521. package/cpp/leveldb/third_party/googletest/googletest/test/production.cc +35 -0
  522. package/cpp/leveldb/third_party/googletest/googletest/test/production.h +54 -0
  523. package/cpp/leveldb/third_party/googletest/library.json +66 -0
  524. package/cpp/leveldb/third_party/googletest/platformio.ini +47 -0
  525. package/cpp/leveldb/util/arena.cc +66 -0
  526. package/cpp/leveldb/util/arena.h +71 -0
  527. package/cpp/leveldb/util/arena_test.cc +66 -0
  528. package/cpp/leveldb/util/bloom.cc +92 -0
  529. package/cpp/leveldb/util/bloom_test.cc +159 -0
  530. package/cpp/leveldb/util/cache.cc +401 -0
  531. package/cpp/leveldb/util/cache_test.cc +229 -0
  532. package/cpp/leveldb/util/coding.cc +166 -0
  533. package/cpp/leveldb/util/coding.h +122 -0
  534. package/cpp/leveldb/util/coding_test.cc +198 -0
  535. package/cpp/leveldb/util/comparator.cc +75 -0
  536. package/cpp/leveldb/util/crc32c.cc +380 -0
  537. package/cpp/leveldb/util/crc32c.h +43 -0
  538. package/cpp/leveldb/util/crc32c_test.cc +61 -0
  539. package/cpp/leveldb/util/env.cc +108 -0
  540. package/cpp/leveldb/util/env_posix.cc +893 -0
  541. package/cpp/leveldb/util/env_posix_test.cc +353 -0
  542. package/cpp/leveldb/util/env_posix_test_helper.h +28 -0
  543. package/cpp/leveldb/util/env_test.cc +240 -0
  544. package/cpp/leveldb/util/env_windows.cc +796 -0
  545. package/cpp/leveldb/util/env_windows_test.cc +65 -0
  546. package/cpp/leveldb/util/env_windows_test_helper.h +25 -0
  547. package/cpp/leveldb/util/filter_policy.cc +11 -0
  548. package/cpp/leveldb/util/hash.cc +55 -0
  549. package/cpp/leveldb/util/hash.h +19 -0
  550. package/cpp/leveldb/util/hash_test.cc +46 -0
  551. package/cpp/leveldb/util/histogram.cc +272 -0
  552. package/cpp/leveldb/util/histogram.h +44 -0
  553. package/cpp/leveldb/util/logging.cc +82 -0
  554. package/cpp/leveldb/util/logging.h +44 -0
  555. package/cpp/leveldb/util/logging_test.cc +145 -0
  556. package/cpp/leveldb/util/mutexlock.h +39 -0
  557. package/cpp/leveldb/util/no_destructor.h +46 -0
  558. package/cpp/leveldb/util/no_destructor_test.cc +49 -0
  559. package/cpp/leveldb/util/options.cc +14 -0
  560. package/cpp/leveldb/util/posix_logger.h +130 -0
  561. package/cpp/leveldb/util/random.h +63 -0
  562. package/cpp/leveldb/util/status.cc +77 -0
  563. package/cpp/leveldb/util/status_test.cc +44 -0
  564. package/cpp/leveldb/util/testutil.cc +51 -0
  565. package/cpp/leveldb/util/testutil.h +82 -0
  566. package/cpp/leveldb/util/windows_logger.h +124 -0
  567. package/cpp/react-native-leveldb.cpp +694 -0
  568. package/cpp/react-native-leveldb.h +4 -0
  569. package/ios/Leveldb.h +9 -0
  570. package/ios/Leveldb.mm +35 -0
  571. package/ios/Leveldb.xcodeproj/project.pbxproj +288 -0
  572. package/lib/commonjs/fake.js +181 -0
  573. package/lib/commonjs/fake.js.map +1 -0
  574. package/lib/commonjs/fake.test.js +30 -0
  575. package/lib/commonjs/fake.test.js.map +1 -0
  576. package/lib/commonjs/index.js +172 -0
  577. package/lib/commonjs/index.js.map +1 -0
  578. package/lib/commonjs/package.json +1 -0
  579. package/lib/module/fake.js +171 -0
  580. package/lib/module/fake.js.map +1 -0
  581. package/lib/module/fake.test.js +30 -0
  582. package/lib/module/fake.test.js.map +1 -0
  583. package/lib/module/index.js +165 -0
  584. package/lib/module/index.js.map +1 -0
  585. package/lib/typescript/fake.d.ts +34 -0
  586. package/lib/typescript/fake.d.ts.map +1 -0
  587. package/lib/typescript/fake.test.d.ts +2 -0
  588. package/lib/typescript/fake.test.d.ts.map +1 -0
  589. package/lib/typescript/index.d.ts +72 -0
  590. package/lib/typescript/index.d.ts.map +1 -0
  591. package/package.json +157 -0
  592. package/rn-leveldb.podspec +30 -0
  593. package/src/fake.test.ts +37 -0
  594. package/src/fake.ts +203 -0
  595. package/src/index.ts +291 -0
@@ -0,0 +1,1761 @@
1
+ #!/usr/bin/env python
2
+ #
3
+ # Copyright 2007 Neal Norwitz
4
+ # Portions Copyright 2007 Google Inc.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ """Generate an Abstract Syntax Tree (AST) for C++."""
19
+
20
+ # FIXME:
21
+ # * Tokens should never be exported, need to convert to Nodes
22
+ # (return types, parameters, etc.)
23
+ # * Handle static class data for templatized classes
24
+ # * Handle casts (both C++ and C-style)
25
+ # * Handle conditions and loops (if/else, switch, for, while/do)
26
+ #
27
+ # TODO much, much later:
28
+ # * Handle #define
29
+ # * exceptions
30
+
31
+
32
+ try:
33
+ # Python 3.x
34
+ import builtins
35
+ except ImportError:
36
+ # Python 2.x
37
+ import __builtin__ as builtins
38
+
39
+ import sys
40
+ import traceback
41
+
42
+ from cpp import keywords
43
+ from cpp import tokenize
44
+ from cpp import utils
45
+
46
+
47
+ if not hasattr(builtins, 'reversed'):
48
+ # Support Python 2.3 and earlier.
49
+ def reversed(seq):
50
+ for i in range(len(seq)-1, -1, -1):
51
+ yield seq[i]
52
+
53
+ if not hasattr(builtins, 'next'):
54
+ # Support Python 2.5 and earlier.
55
+ def next(obj):
56
+ return obj.next()
57
+
58
+
59
+ VISIBILITY_PUBLIC, VISIBILITY_PROTECTED, VISIBILITY_PRIVATE = range(3)
60
+
61
+ FUNCTION_NONE = 0x00
62
+ FUNCTION_CONST = 0x01
63
+ FUNCTION_VIRTUAL = 0x02
64
+ FUNCTION_PURE_VIRTUAL = 0x04
65
+ FUNCTION_CTOR = 0x08
66
+ FUNCTION_DTOR = 0x10
67
+ FUNCTION_ATTRIBUTE = 0x20
68
+ FUNCTION_UNKNOWN_ANNOTATION = 0x40
69
+ FUNCTION_THROW = 0x80
70
+ FUNCTION_OVERRIDE = 0x100
71
+
72
+ """
73
+ These are currently unused. Should really handle these properly at some point.
74
+
75
+ TYPE_MODIFIER_INLINE = 0x010000
76
+ TYPE_MODIFIER_EXTERN = 0x020000
77
+ TYPE_MODIFIER_STATIC = 0x040000
78
+ TYPE_MODIFIER_CONST = 0x080000
79
+ TYPE_MODIFIER_REGISTER = 0x100000
80
+ TYPE_MODIFIER_VOLATILE = 0x200000
81
+ TYPE_MODIFIER_MUTABLE = 0x400000
82
+
83
+ TYPE_MODIFIER_MAP = {
84
+ 'inline': TYPE_MODIFIER_INLINE,
85
+ 'extern': TYPE_MODIFIER_EXTERN,
86
+ 'static': TYPE_MODIFIER_STATIC,
87
+ 'const': TYPE_MODIFIER_CONST,
88
+ 'register': TYPE_MODIFIER_REGISTER,
89
+ 'volatile': TYPE_MODIFIER_VOLATILE,
90
+ 'mutable': TYPE_MODIFIER_MUTABLE,
91
+ }
92
+ """
93
+
94
+ _INTERNAL_TOKEN = 'internal'
95
+ _NAMESPACE_POP = 'ns-pop'
96
+
97
+
98
+ # TODO(nnorwitz): use this as a singleton for templated_types, etc
99
+ # where we don't want to create a new empty dict each time. It is also const.
100
+ class _NullDict(object):
101
+ __contains__ = lambda self: False
102
+ keys = values = items = iterkeys = itervalues = iteritems = lambda self: ()
103
+
104
+
105
+ # TODO(nnorwitz): move AST nodes into a separate module.
106
+ class Node(object):
107
+ """Base AST node."""
108
+
109
+ def __init__(self, start, end):
110
+ self.start = start
111
+ self.end = end
112
+
113
+ def IsDeclaration(self):
114
+ """Returns bool if this node is a declaration."""
115
+ return False
116
+
117
+ def IsDefinition(self):
118
+ """Returns bool if this node is a definition."""
119
+ return False
120
+
121
+ def IsExportable(self):
122
+ """Returns bool if this node exportable from a header file."""
123
+ return False
124
+
125
+ def Requires(self, node):
126
+ """Does this AST node require the definition of the node passed in?"""
127
+ return False
128
+
129
+ def XXX__str__(self):
130
+ return self._StringHelper(self.__class__.__name__, '')
131
+
132
+ def _StringHelper(self, name, suffix):
133
+ if not utils.DEBUG:
134
+ return '%s(%s)' % (name, suffix)
135
+ return '%s(%d, %d, %s)' % (name, self.start, self.end, suffix)
136
+
137
+ def __repr__(self):
138
+ return str(self)
139
+
140
+
141
+ class Define(Node):
142
+ def __init__(self, start, end, name, definition):
143
+ Node.__init__(self, start, end)
144
+ self.name = name
145
+ self.definition = definition
146
+
147
+ def __str__(self):
148
+ value = '%s %s' % (self.name, self.definition)
149
+ return self._StringHelper(self.__class__.__name__, value)
150
+
151
+
152
+ class Include(Node):
153
+ def __init__(self, start, end, filename, system):
154
+ Node.__init__(self, start, end)
155
+ self.filename = filename
156
+ self.system = system
157
+
158
+ def __str__(self):
159
+ fmt = '"%s"'
160
+ if self.system:
161
+ fmt = '<%s>'
162
+ return self._StringHelper(self.__class__.__name__, fmt % self.filename)
163
+
164
+
165
+ class Goto(Node):
166
+ def __init__(self, start, end, label):
167
+ Node.__init__(self, start, end)
168
+ self.label = label
169
+
170
+ def __str__(self):
171
+ return self._StringHelper(self.__class__.__name__, str(self.label))
172
+
173
+
174
+ class Expr(Node):
175
+ def __init__(self, start, end, expr):
176
+ Node.__init__(self, start, end)
177
+ self.expr = expr
178
+
179
+ def Requires(self, node):
180
+ # TODO(nnorwitz): impl.
181
+ return False
182
+
183
+ def __str__(self):
184
+ return self._StringHelper(self.__class__.__name__, str(self.expr))
185
+
186
+
187
+ class Return(Expr):
188
+ pass
189
+
190
+
191
+ class Delete(Expr):
192
+ pass
193
+
194
+
195
+ class Friend(Expr):
196
+ def __init__(self, start, end, expr, namespace):
197
+ Expr.__init__(self, start, end, expr)
198
+ self.namespace = namespace[:]
199
+
200
+
201
+ class Using(Node):
202
+ def __init__(self, start, end, names):
203
+ Node.__init__(self, start, end)
204
+ self.names = names
205
+
206
+ def __str__(self):
207
+ return self._StringHelper(self.__class__.__name__, str(self.names))
208
+
209
+
210
+ class Parameter(Node):
211
+ def __init__(self, start, end, name, parameter_type, default):
212
+ Node.__init__(self, start, end)
213
+ self.name = name
214
+ self.type = parameter_type
215
+ self.default = default
216
+
217
+ def Requires(self, node):
218
+ # TODO(nnorwitz): handle namespaces, etc.
219
+ return self.type.name == node.name
220
+
221
+ def __str__(self):
222
+ name = str(self.type)
223
+ suffix = '%s %s' % (name, self.name)
224
+ if self.default:
225
+ suffix += ' = ' + ''.join([d.name for d in self.default])
226
+ return self._StringHelper(self.__class__.__name__, suffix)
227
+
228
+
229
+ class _GenericDeclaration(Node):
230
+ def __init__(self, start, end, name, namespace):
231
+ Node.__init__(self, start, end)
232
+ self.name = name
233
+ self.namespace = namespace[:]
234
+
235
+ def FullName(self):
236
+ prefix = ''
237
+ if self.namespace and self.namespace[-1]:
238
+ prefix = '::'.join(self.namespace) + '::'
239
+ return prefix + self.name
240
+
241
+ def _TypeStringHelper(self, suffix):
242
+ if self.namespace:
243
+ names = [n or '<anonymous>' for n in self.namespace]
244
+ suffix += ' in ' + '::'.join(names)
245
+ return self._StringHelper(self.__class__.__name__, suffix)
246
+
247
+
248
+ # TODO(nnorwitz): merge with Parameter in some way?
249
+ class VariableDeclaration(_GenericDeclaration):
250
+ def __init__(self, start, end, name, var_type, initial_value, namespace):
251
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
252
+ self.type = var_type
253
+ self.initial_value = initial_value
254
+
255
+ def Requires(self, node):
256
+ # TODO(nnorwitz): handle namespaces, etc.
257
+ return self.type.name == node.name
258
+
259
+ def ToString(self):
260
+ """Return a string that tries to reconstitute the variable decl."""
261
+ suffix = '%s %s' % (self.type, self.name)
262
+ if self.initial_value:
263
+ suffix += ' = ' + self.initial_value
264
+ return suffix
265
+
266
+ def __str__(self):
267
+ return self._StringHelper(self.__class__.__name__, self.ToString())
268
+
269
+
270
+ class Typedef(_GenericDeclaration):
271
+ def __init__(self, start, end, name, alias, namespace):
272
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
273
+ self.alias = alias
274
+
275
+ def IsDefinition(self):
276
+ return True
277
+
278
+ def IsExportable(self):
279
+ return True
280
+
281
+ def Requires(self, node):
282
+ # TODO(nnorwitz): handle namespaces, etc.
283
+ name = node.name
284
+ for token in self.alias:
285
+ if token is not None and name == token.name:
286
+ return True
287
+ return False
288
+
289
+ def __str__(self):
290
+ suffix = '%s, %s' % (self.name, self.alias)
291
+ return self._TypeStringHelper(suffix)
292
+
293
+
294
+ class _NestedType(_GenericDeclaration):
295
+ def __init__(self, start, end, name, fields, namespace):
296
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
297
+ self.fields = fields
298
+
299
+ def IsDefinition(self):
300
+ return True
301
+
302
+ def IsExportable(self):
303
+ return True
304
+
305
+ def __str__(self):
306
+ suffix = '%s, {%s}' % (self.name, self.fields)
307
+ return self._TypeStringHelper(suffix)
308
+
309
+
310
+ class Union(_NestedType):
311
+ pass
312
+
313
+
314
+ class Enum(_NestedType):
315
+ pass
316
+
317
+
318
+ class Class(_GenericDeclaration):
319
+ def __init__(self, start, end, name, bases, templated_types, body, namespace):
320
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
321
+ self.bases = bases
322
+ self.body = body
323
+ self.templated_types = templated_types
324
+
325
+ def IsDeclaration(self):
326
+ return self.bases is None and self.body is None
327
+
328
+ def IsDefinition(self):
329
+ return not self.IsDeclaration()
330
+
331
+ def IsExportable(self):
332
+ return not self.IsDeclaration()
333
+
334
+ def Requires(self, node):
335
+ # TODO(nnorwitz): handle namespaces, etc.
336
+ if self.bases:
337
+ for token_list in self.bases:
338
+ # TODO(nnorwitz): bases are tokens, do name comparision.
339
+ for token in token_list:
340
+ if token.name == node.name:
341
+ return True
342
+ # TODO(nnorwitz): search in body too.
343
+ return False
344
+
345
+ def __str__(self):
346
+ name = self.name
347
+ if self.templated_types:
348
+ name += '<%s>' % self.templated_types
349
+ suffix = '%s, %s, %s' % (name, self.bases, self.body)
350
+ return self._TypeStringHelper(suffix)
351
+
352
+
353
+ class Struct(Class):
354
+ pass
355
+
356
+
357
+ class Function(_GenericDeclaration):
358
+ def __init__(self, start, end, name, return_type, parameters,
359
+ modifiers, templated_types, body, namespace):
360
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
361
+ converter = TypeConverter(namespace)
362
+ self.return_type = converter.CreateReturnType(return_type)
363
+ self.parameters = converter.ToParameters(parameters)
364
+ self.modifiers = modifiers
365
+ self.body = body
366
+ self.templated_types = templated_types
367
+
368
+ def IsDeclaration(self):
369
+ return self.body is None
370
+
371
+ def IsDefinition(self):
372
+ return self.body is not None
373
+
374
+ def IsExportable(self):
375
+ if self.return_type and 'static' in self.return_type.modifiers:
376
+ return False
377
+ return None not in self.namespace
378
+
379
+ def Requires(self, node):
380
+ if self.parameters:
381
+ # TODO(nnorwitz): parameters are tokens, do name comparision.
382
+ for p in self.parameters:
383
+ if p.name == node.name:
384
+ return True
385
+ # TODO(nnorwitz): search in body too.
386
+ return False
387
+
388
+ def __str__(self):
389
+ # TODO(nnorwitz): add templated_types.
390
+ suffix = ('%s %s(%s), 0x%02x, %s' %
391
+ (self.return_type, self.name, self.parameters,
392
+ self.modifiers, self.body))
393
+ return self._TypeStringHelper(suffix)
394
+
395
+
396
+ class Method(Function):
397
+ def __init__(self, start, end, name, in_class, return_type, parameters,
398
+ modifiers, templated_types, body, namespace):
399
+ Function.__init__(self, start, end, name, return_type, parameters,
400
+ modifiers, templated_types, body, namespace)
401
+ # TODO(nnorwitz): in_class could also be a namespace which can
402
+ # mess up finding functions properly.
403
+ self.in_class = in_class
404
+
405
+
406
+ class Type(_GenericDeclaration):
407
+ """Type used for any variable (eg class, primitive, struct, etc)."""
408
+
409
+ def __init__(self, start, end, name, templated_types, modifiers,
410
+ reference, pointer, array):
411
+ """
412
+ Args:
413
+ name: str name of main type
414
+ templated_types: [Class (Type?)] template type info between <>
415
+ modifiers: [str] type modifiers (keywords) eg, const, mutable, etc.
416
+ reference, pointer, array: bools
417
+ """
418
+ _GenericDeclaration.__init__(self, start, end, name, [])
419
+ self.templated_types = templated_types
420
+ if not name and modifiers:
421
+ self.name = modifiers.pop()
422
+ self.modifiers = modifiers
423
+ self.reference = reference
424
+ self.pointer = pointer
425
+ self.array = array
426
+
427
+ def __str__(self):
428
+ prefix = ''
429
+ if self.modifiers:
430
+ prefix = ' '.join(self.modifiers) + ' '
431
+ name = str(self.name)
432
+ if self.templated_types:
433
+ name += '<%s>' % self.templated_types
434
+ suffix = prefix + name
435
+ if self.reference:
436
+ suffix += '&'
437
+ if self.pointer:
438
+ suffix += '*'
439
+ if self.array:
440
+ suffix += '[]'
441
+ return self._TypeStringHelper(suffix)
442
+
443
+ # By definition, Is* are always False. A Type can only exist in
444
+ # some sort of variable declaration, parameter, or return value.
445
+ def IsDeclaration(self):
446
+ return False
447
+
448
+ def IsDefinition(self):
449
+ return False
450
+
451
+ def IsExportable(self):
452
+ return False
453
+
454
+
455
+ class TypeConverter(object):
456
+
457
+ def __init__(self, namespace_stack):
458
+ self.namespace_stack = namespace_stack
459
+
460
+ def _GetTemplateEnd(self, tokens, start):
461
+ count = 1
462
+ end = start
463
+ while 1:
464
+ token = tokens[end]
465
+ end += 1
466
+ if token.name == '<':
467
+ count += 1
468
+ elif token.name == '>':
469
+ count -= 1
470
+ if count == 0:
471
+ break
472
+ return tokens[start:end-1], end
473
+
474
+ def ToType(self, tokens):
475
+ """Convert [Token,...] to [Class(...), ] useful for base classes.
476
+ For example, code like class Foo : public Bar<x, y> { ... };
477
+ the "Bar<x, y>" portion gets converted to an AST.
478
+
479
+ Returns:
480
+ [Class(...), ...]
481
+ """
482
+ result = []
483
+ name_tokens = []
484
+ reference = pointer = array = False
485
+
486
+ def AddType(templated_types):
487
+ # Partition tokens into name and modifier tokens.
488
+ names = []
489
+ modifiers = []
490
+ for t in name_tokens:
491
+ if keywords.IsKeyword(t.name):
492
+ modifiers.append(t.name)
493
+ else:
494
+ names.append(t.name)
495
+ name = ''.join(names)
496
+ if name_tokens:
497
+ result.append(Type(name_tokens[0].start, name_tokens[-1].end,
498
+ name, templated_types, modifiers,
499
+ reference, pointer, array))
500
+ del name_tokens[:]
501
+
502
+ i = 0
503
+ end = len(tokens)
504
+ while i < end:
505
+ token = tokens[i]
506
+ if token.name == '<':
507
+ new_tokens, new_end = self._GetTemplateEnd(tokens, i+1)
508
+ AddType(self.ToType(new_tokens))
509
+ # If there is a comma after the template, we need to consume
510
+ # that here otherwise it becomes part of the name.
511
+ i = new_end
512
+ reference = pointer = array = False
513
+ elif token.name == ',':
514
+ AddType([])
515
+ reference = pointer = array = False
516
+ elif token.name == '*':
517
+ pointer = True
518
+ elif token.name == '&':
519
+ reference = True
520
+ elif token.name == '[':
521
+ pointer = True
522
+ elif token.name == ']':
523
+ pass
524
+ else:
525
+ name_tokens.append(token)
526
+ i += 1
527
+
528
+ if name_tokens:
529
+ # No '<' in the tokens, just a simple name and no template.
530
+ AddType([])
531
+ return result
532
+
533
+ def DeclarationToParts(self, parts, needs_name_removed):
534
+ name = None
535
+ default = []
536
+ if needs_name_removed:
537
+ # Handle default (initial) values properly.
538
+ for i, t in enumerate(parts):
539
+ if t.name == '=':
540
+ default = parts[i+1:]
541
+ name = parts[i-1].name
542
+ if name == ']' and parts[i-2].name == '[':
543
+ name = parts[i-3].name
544
+ i -= 1
545
+ parts = parts[:i-1]
546
+ break
547
+ else:
548
+ if parts[-1].token_type == tokenize.NAME:
549
+ name = parts.pop().name
550
+ else:
551
+ # TODO(nnorwitz): this is a hack that happens for code like
552
+ # Register(Foo<T>); where it thinks this is a function call
553
+ # but it's actually a declaration.
554
+ name = '???'
555
+ modifiers = []
556
+ type_name = []
557
+ other_tokens = []
558
+ templated_types = []
559
+ i = 0
560
+ end = len(parts)
561
+ while i < end:
562
+ p = parts[i]
563
+ if keywords.IsKeyword(p.name):
564
+ modifiers.append(p.name)
565
+ elif p.name == '<':
566
+ templated_tokens, new_end = self._GetTemplateEnd(parts, i+1)
567
+ templated_types = self.ToType(templated_tokens)
568
+ i = new_end - 1
569
+ # Don't add a spurious :: to data members being initialized.
570
+ next_index = i + 1
571
+ if next_index < end and parts[next_index].name == '::':
572
+ i += 1
573
+ elif p.name in ('[', ']', '='):
574
+ # These are handled elsewhere.
575
+ other_tokens.append(p)
576
+ elif p.name not in ('*', '&', '>'):
577
+ # Ensure that names have a space between them.
578
+ if (type_name and type_name[-1].token_type == tokenize.NAME and
579
+ p.token_type == tokenize.NAME):
580
+ type_name.append(tokenize.Token(tokenize.SYNTAX, ' ', 0, 0))
581
+ type_name.append(p)
582
+ else:
583
+ other_tokens.append(p)
584
+ i += 1
585
+ type_name = ''.join([t.name for t in type_name])
586
+ return name, type_name, templated_types, modifiers, default, other_tokens
587
+
588
+ def ToParameters(self, tokens):
589
+ if not tokens:
590
+ return []
591
+
592
+ result = []
593
+ name = type_name = ''
594
+ type_modifiers = []
595
+ pointer = reference = array = False
596
+ first_token = None
597
+ default = []
598
+
599
+ def AddParameter(end):
600
+ if default:
601
+ del default[0] # Remove flag.
602
+ parts = self.DeclarationToParts(type_modifiers, True)
603
+ (name, type_name, templated_types, modifiers,
604
+ unused_default, unused_other_tokens) = parts
605
+ parameter_type = Type(first_token.start, first_token.end,
606
+ type_name, templated_types, modifiers,
607
+ reference, pointer, array)
608
+ p = Parameter(first_token.start, end, name,
609
+ parameter_type, default)
610
+ result.append(p)
611
+
612
+ template_count = 0
613
+ for s in tokens:
614
+ if not first_token:
615
+ first_token = s
616
+ if s.name == '<':
617
+ template_count += 1
618
+ elif s.name == '>':
619
+ template_count -= 1
620
+ if template_count > 0:
621
+ type_modifiers.append(s)
622
+ continue
623
+
624
+ if s.name == ',':
625
+ AddParameter(s.start)
626
+ name = type_name = ''
627
+ type_modifiers = []
628
+ pointer = reference = array = False
629
+ first_token = None
630
+ default = []
631
+ elif s.name == '*':
632
+ pointer = True
633
+ elif s.name == '&':
634
+ reference = True
635
+ elif s.name == '[':
636
+ array = True
637
+ elif s.name == ']':
638
+ pass # Just don't add to type_modifiers.
639
+ elif s.name == '=':
640
+ # Got a default value. Add any value (None) as a flag.
641
+ default.append(None)
642
+ elif default:
643
+ default.append(s)
644
+ else:
645
+ type_modifiers.append(s)
646
+ AddParameter(tokens[-1].end)
647
+ return result
648
+
649
+ def CreateReturnType(self, return_type_seq):
650
+ if not return_type_seq:
651
+ return None
652
+ start = return_type_seq[0].start
653
+ end = return_type_seq[-1].end
654
+ _, name, templated_types, modifiers, default, other_tokens = \
655
+ self.DeclarationToParts(return_type_seq, False)
656
+ names = [n.name for n in other_tokens]
657
+ reference = '&' in names
658
+ pointer = '*' in names
659
+ array = '[' in names
660
+ return Type(start, end, name, templated_types, modifiers,
661
+ reference, pointer, array)
662
+
663
+ def GetTemplateIndices(self, names):
664
+ # names is a list of strings.
665
+ start = names.index('<')
666
+ end = len(names) - 1
667
+ while end > 0:
668
+ if names[end] == '>':
669
+ break
670
+ end -= 1
671
+ return start, end+1
672
+
673
+ class AstBuilder(object):
674
+ def __init__(self, token_stream, filename, in_class='', visibility=None,
675
+ namespace_stack=[]):
676
+ self.tokens = token_stream
677
+ self.filename = filename
678
+ # TODO(nnorwitz): use a better data structure (deque) for the queue.
679
+ # Switching directions of the "queue" improved perf by about 25%.
680
+ # Using a deque should be even better since we access from both sides.
681
+ self.token_queue = []
682
+ self.namespace_stack = namespace_stack[:]
683
+ self.in_class = in_class
684
+ if in_class is None:
685
+ self.in_class_name_only = None
686
+ else:
687
+ self.in_class_name_only = in_class.split('::')[-1]
688
+ self.visibility = visibility
689
+ self.in_function = False
690
+ self.current_token = None
691
+ # Keep the state whether we are currently handling a typedef or not.
692
+ self._handling_typedef = False
693
+
694
+ self.converter = TypeConverter(self.namespace_stack)
695
+
696
+ def HandleError(self, msg, token):
697
+ printable_queue = list(reversed(self.token_queue[-20:]))
698
+ sys.stderr.write('Got %s in %s @ %s %s\n' %
699
+ (msg, self.filename, token, printable_queue))
700
+
701
+ def Generate(self):
702
+ while 1:
703
+ token = self._GetNextToken()
704
+ if not token:
705
+ break
706
+
707
+ # Get the next token.
708
+ self.current_token = token
709
+
710
+ # Dispatch on the next token type.
711
+ if token.token_type == _INTERNAL_TOKEN:
712
+ if token.name == _NAMESPACE_POP:
713
+ self.namespace_stack.pop()
714
+ continue
715
+
716
+ try:
717
+ result = self._GenerateOne(token)
718
+ if result is not None:
719
+ yield result
720
+ except:
721
+ self.HandleError('exception', token)
722
+ raise
723
+
724
+ def _CreateVariable(self, pos_token, name, type_name, type_modifiers,
725
+ ref_pointer_name_seq, templated_types, value=None):
726
+ reference = '&' in ref_pointer_name_seq
727
+ pointer = '*' in ref_pointer_name_seq
728
+ array = '[' in ref_pointer_name_seq
729
+ var_type = Type(pos_token.start, pos_token.end, type_name,
730
+ templated_types, type_modifiers,
731
+ reference, pointer, array)
732
+ return VariableDeclaration(pos_token.start, pos_token.end,
733
+ name, var_type, value, self.namespace_stack)
734
+
735
+ def _GenerateOne(self, token):
736
+ if token.token_type == tokenize.NAME:
737
+ if (keywords.IsKeyword(token.name) and
738
+ not keywords.IsBuiltinType(token.name)):
739
+ if token.name == 'enum':
740
+ # Pop the next token and only put it back if it's not
741
+ # 'class'. This allows us to support the two-token
742
+ # 'enum class' keyword as if it were simply 'enum'.
743
+ next = self._GetNextToken()
744
+ if next.name != 'class':
745
+ self._AddBackToken(next)
746
+
747
+ method = getattr(self, 'handle_' + token.name)
748
+ return method()
749
+ elif token.name == self.in_class_name_only:
750
+ # The token name is the same as the class, must be a ctor if
751
+ # there is a paren. Otherwise, it's the return type.
752
+ # Peek ahead to get the next token to figure out which.
753
+ next = self._GetNextToken()
754
+ self._AddBackToken(next)
755
+ if next.token_type == tokenize.SYNTAX and next.name == '(':
756
+ return self._GetMethod([token], FUNCTION_CTOR, None, True)
757
+ # Fall through--handle like any other method.
758
+
759
+ # Handle data or function declaration/definition.
760
+ syntax = tokenize.SYNTAX
761
+ temp_tokens, last_token = \
762
+ self._GetVarTokensUpToIgnoringTemplates(syntax,
763
+ '(', ';', '{', '[')
764
+ temp_tokens.insert(0, token)
765
+ if last_token.name == '(':
766
+ # If there is an assignment before the paren,
767
+ # this is an expression, not a method.
768
+ expr = bool([e for e in temp_tokens if e.name == '='])
769
+ if expr:
770
+ new_temp = self._GetTokensUpTo(tokenize.SYNTAX, ';')
771
+ temp_tokens.append(last_token)
772
+ temp_tokens.extend(new_temp)
773
+ last_token = tokenize.Token(tokenize.SYNTAX, ';', 0, 0)
774
+
775
+ if last_token.name == '[':
776
+ # Handle array, this isn't a method, unless it's an operator.
777
+ # TODO(nnorwitz): keep the size somewhere.
778
+ # unused_size = self._GetTokensUpTo(tokenize.SYNTAX, ']')
779
+ temp_tokens.append(last_token)
780
+ if temp_tokens[-2].name == 'operator':
781
+ temp_tokens.append(self._GetNextToken())
782
+ else:
783
+ temp_tokens2, last_token = \
784
+ self._GetVarTokensUpTo(tokenize.SYNTAX, ';')
785
+ temp_tokens.extend(temp_tokens2)
786
+
787
+ if last_token.name == ';':
788
+ # Handle data, this isn't a method.
789
+ parts = self.converter.DeclarationToParts(temp_tokens, True)
790
+ (name, type_name, templated_types, modifiers, default,
791
+ unused_other_tokens) = parts
792
+
793
+ t0 = temp_tokens[0]
794
+ names = [t.name for t in temp_tokens]
795
+ if templated_types:
796
+ start, end = self.converter.GetTemplateIndices(names)
797
+ names = names[:start] + names[end:]
798
+ default = ''.join([t.name for t in default])
799
+ return self._CreateVariable(t0, name, type_name, modifiers,
800
+ names, templated_types, default)
801
+ if last_token.name == '{':
802
+ self._AddBackTokens(temp_tokens[1:])
803
+ self._AddBackToken(last_token)
804
+ method_name = temp_tokens[0].name
805
+ method = getattr(self, 'handle_' + method_name, None)
806
+ if not method:
807
+ # Must be declaring a variable.
808
+ # TODO(nnorwitz): handle the declaration.
809
+ return None
810
+ return method()
811
+ return self._GetMethod(temp_tokens, 0, None, False)
812
+ elif token.token_type == tokenize.SYNTAX:
813
+ if token.name == '~' and self.in_class:
814
+ # Must be a dtor (probably not in method body).
815
+ token = self._GetNextToken()
816
+ # self.in_class can contain A::Name, but the dtor will only
817
+ # be Name. Make sure to compare against the right value.
818
+ if (token.token_type == tokenize.NAME and
819
+ token.name == self.in_class_name_only):
820
+ return self._GetMethod([token], FUNCTION_DTOR, None, True)
821
+ # TODO(nnorwitz): handle a lot more syntax.
822
+ elif token.token_type == tokenize.PREPROCESSOR:
823
+ # TODO(nnorwitz): handle more preprocessor directives.
824
+ # token starts with a #, so remove it and strip whitespace.
825
+ name = token.name[1:].lstrip()
826
+ if name.startswith('include'):
827
+ # Remove "include".
828
+ name = name[7:].strip()
829
+ assert name
830
+ # Handle #include \<newline> "header-on-second-line.h".
831
+ if name.startswith('\\'):
832
+ name = name[1:].strip()
833
+ assert name[0] in '<"', token
834
+ assert name[-1] in '>"', token
835
+ system = name[0] == '<'
836
+ filename = name[1:-1]
837
+ return Include(token.start, token.end, filename, system)
838
+ if name.startswith('define'):
839
+ # Remove "define".
840
+ name = name[6:].strip()
841
+ assert name
842
+ value = ''
843
+ for i, c in enumerate(name):
844
+ if c.isspace():
845
+ value = name[i:].lstrip()
846
+ name = name[:i]
847
+ break
848
+ return Define(token.start, token.end, name, value)
849
+ if name.startswith('if') and name[2:3].isspace():
850
+ condition = name[3:].strip()
851
+ if condition.startswith('0') or condition.startswith('(0)'):
852
+ self._SkipIf0Blocks()
853
+ return None
854
+
855
+ def _GetTokensUpTo(self, expected_token_type, expected_token):
856
+ return self._GetVarTokensUpTo(expected_token_type, expected_token)[0]
857
+
858
+ def _GetVarTokensUpTo(self, expected_token_type, *expected_tokens):
859
+ last_token = self._GetNextToken()
860
+ tokens = []
861
+ while (last_token.token_type != expected_token_type or
862
+ last_token.name not in expected_tokens):
863
+ tokens.append(last_token)
864
+ last_token = self._GetNextToken()
865
+ return tokens, last_token
866
+
867
+ # Same as _GetVarTokensUpTo, but skips over '<...>' which could contain an
868
+ # expected token.
869
+ def _GetVarTokensUpToIgnoringTemplates(self, expected_token_type,
870
+ *expected_tokens):
871
+ last_token = self._GetNextToken()
872
+ tokens = []
873
+ nesting = 0
874
+ while (nesting > 0 or
875
+ last_token.token_type != expected_token_type or
876
+ last_token.name not in expected_tokens):
877
+ tokens.append(last_token)
878
+ last_token = self._GetNextToken()
879
+ if last_token.name == '<':
880
+ nesting += 1
881
+ elif last_token.name == '>':
882
+ nesting -= 1
883
+ return tokens, last_token
884
+
885
+ # TODO(nnorwitz): remove _IgnoreUpTo() it shouldn't be necesary.
886
+ def _IgnoreUpTo(self, token_type, token):
887
+ unused_tokens = self._GetTokensUpTo(token_type, token)
888
+
889
+ def _SkipIf0Blocks(self):
890
+ count = 1
891
+ while 1:
892
+ token = self._GetNextToken()
893
+ if token.token_type != tokenize.PREPROCESSOR:
894
+ continue
895
+
896
+ name = token.name[1:].lstrip()
897
+ if name.startswith('endif'):
898
+ count -= 1
899
+ if count == 0:
900
+ break
901
+ elif name.startswith('if'):
902
+ count += 1
903
+
904
+ def _GetMatchingChar(self, open_paren, close_paren, GetNextToken=None):
905
+ if GetNextToken is None:
906
+ GetNextToken = self._GetNextToken
907
+ # Assumes the current token is open_paren and we will consume
908
+ # and return up to the close_paren.
909
+ count = 1
910
+ token = GetNextToken()
911
+ while 1:
912
+ if token.token_type == tokenize.SYNTAX:
913
+ if token.name == open_paren:
914
+ count += 1
915
+ elif token.name == close_paren:
916
+ count -= 1
917
+ if count == 0:
918
+ break
919
+ yield token
920
+ token = GetNextToken()
921
+ yield token
922
+
923
+ def _GetParameters(self):
924
+ return self._GetMatchingChar('(', ')')
925
+
926
+ def GetScope(self):
927
+ return self._GetMatchingChar('{', '}')
928
+
929
+ def _GetNextToken(self):
930
+ if self.token_queue:
931
+ return self.token_queue.pop()
932
+ try:
933
+ return next(self.tokens)
934
+ except StopIteration:
935
+ return
936
+
937
+ def _AddBackToken(self, token):
938
+ if token.whence == tokenize.WHENCE_STREAM:
939
+ token.whence = tokenize.WHENCE_QUEUE
940
+ self.token_queue.insert(0, token)
941
+ else:
942
+ assert token.whence == tokenize.WHENCE_QUEUE, token
943
+ self.token_queue.append(token)
944
+
945
+ def _AddBackTokens(self, tokens):
946
+ if tokens:
947
+ if tokens[-1].whence == tokenize.WHENCE_STREAM:
948
+ for token in tokens:
949
+ token.whence = tokenize.WHENCE_QUEUE
950
+ self.token_queue[:0] = reversed(tokens)
951
+ else:
952
+ assert tokens[-1].whence == tokenize.WHENCE_QUEUE, tokens
953
+ self.token_queue.extend(reversed(tokens))
954
+
955
+ def GetName(self, seq=None):
956
+ """Returns ([tokens], next_token_info)."""
957
+ GetNextToken = self._GetNextToken
958
+ if seq is not None:
959
+ it = iter(seq)
960
+ GetNextToken = lambda: next(it)
961
+ next_token = GetNextToken()
962
+ tokens = []
963
+ last_token_was_name = False
964
+ while (next_token.token_type == tokenize.NAME or
965
+ (next_token.token_type == tokenize.SYNTAX and
966
+ next_token.name in ('::', '<'))):
967
+ # Two NAMEs in a row means the identifier should terminate.
968
+ # It's probably some sort of variable declaration.
969
+ if last_token_was_name and next_token.token_type == tokenize.NAME:
970
+ break
971
+ last_token_was_name = next_token.token_type == tokenize.NAME
972
+ tokens.append(next_token)
973
+ # Handle templated names.
974
+ if next_token.name == '<':
975
+ tokens.extend(self._GetMatchingChar('<', '>', GetNextToken))
976
+ last_token_was_name = True
977
+ next_token = GetNextToken()
978
+ return tokens, next_token
979
+
980
+ def GetMethod(self, modifiers, templated_types):
981
+ return_type_and_name = self._GetTokensUpTo(tokenize.SYNTAX, '(')
982
+ assert len(return_type_and_name) >= 1
983
+ return self._GetMethod(return_type_and_name, modifiers, templated_types,
984
+ False)
985
+
986
+ def _GetMethod(self, return_type_and_name, modifiers, templated_types,
987
+ get_paren):
988
+ template_portion = None
989
+ if get_paren:
990
+ token = self._GetNextToken()
991
+ assert token.token_type == tokenize.SYNTAX, token
992
+ if token.name == '<':
993
+ # Handle templatized dtors.
994
+ template_portion = [token]
995
+ template_portion.extend(self._GetMatchingChar('<', '>'))
996
+ token = self._GetNextToken()
997
+ assert token.token_type == tokenize.SYNTAX, token
998
+ assert token.name == '(', token
999
+
1000
+ name = return_type_and_name.pop()
1001
+ # Handle templatized ctors.
1002
+ if name.name == '>':
1003
+ index = 1
1004
+ while return_type_and_name[index].name != '<':
1005
+ index += 1
1006
+ template_portion = return_type_and_name[index:] + [name]
1007
+ del return_type_and_name[index:]
1008
+ name = return_type_and_name.pop()
1009
+ elif name.name == ']':
1010
+ rt = return_type_and_name
1011
+ assert rt[-1].name == '[', return_type_and_name
1012
+ assert rt[-2].name == 'operator', return_type_and_name
1013
+ name_seq = return_type_and_name[-2:]
1014
+ del return_type_and_name[-2:]
1015
+ name = tokenize.Token(tokenize.NAME, 'operator[]',
1016
+ name_seq[0].start, name.end)
1017
+ # Get the open paren so _GetParameters() below works.
1018
+ unused_open_paren = self._GetNextToken()
1019
+
1020
+ # TODO(nnorwitz): store template_portion.
1021
+ return_type = return_type_and_name
1022
+ indices = name
1023
+ if return_type:
1024
+ indices = return_type[0]
1025
+
1026
+ # Force ctor for templatized ctors.
1027
+ if name.name == self.in_class and not modifiers:
1028
+ modifiers |= FUNCTION_CTOR
1029
+ parameters = list(self._GetParameters())
1030
+ del parameters[-1] # Remove trailing ')'.
1031
+
1032
+ # Handling operator() is especially weird.
1033
+ if name.name == 'operator' and not parameters:
1034
+ token = self._GetNextToken()
1035
+ assert token.name == '(', token
1036
+ parameters = list(self._GetParameters())
1037
+ del parameters[-1] # Remove trailing ')'.
1038
+
1039
+ token = self._GetNextToken()
1040
+ while token.token_type == tokenize.NAME:
1041
+ modifier_token = token
1042
+ token = self._GetNextToken()
1043
+ if modifier_token.name == 'const':
1044
+ modifiers |= FUNCTION_CONST
1045
+ elif modifier_token.name == '__attribute__':
1046
+ # TODO(nnorwitz): handle more __attribute__ details.
1047
+ modifiers |= FUNCTION_ATTRIBUTE
1048
+ assert token.name == '(', token
1049
+ # Consume everything between the (parens).
1050
+ unused_tokens = list(self._GetMatchingChar('(', ')'))
1051
+ token = self._GetNextToken()
1052
+ elif modifier_token.name == 'throw':
1053
+ modifiers |= FUNCTION_THROW
1054
+ assert token.name == '(', token
1055
+ # Consume everything between the (parens).
1056
+ unused_tokens = list(self._GetMatchingChar('(', ')'))
1057
+ token = self._GetNextToken()
1058
+ elif modifier_token.name == 'override':
1059
+ modifiers |= FUNCTION_OVERRIDE
1060
+ elif modifier_token.name == modifier_token.name.upper():
1061
+ # HACK(nnorwitz): assume that all upper-case names
1062
+ # are some macro we aren't expanding.
1063
+ modifiers |= FUNCTION_UNKNOWN_ANNOTATION
1064
+ else:
1065
+ self.HandleError('unexpected token', modifier_token)
1066
+
1067
+ assert token.token_type == tokenize.SYNTAX, token
1068
+ # Handle ctor initializers.
1069
+ if token.name == ':':
1070
+ # TODO(nnorwitz): anything else to handle for initializer list?
1071
+ while token.name != ';' and token.name != '{':
1072
+ token = self._GetNextToken()
1073
+
1074
+ # Handle pointer to functions that are really data but look
1075
+ # like method declarations.
1076
+ if token.name == '(':
1077
+ if parameters[0].name == '*':
1078
+ # name contains the return type.
1079
+ name = parameters.pop()
1080
+ # parameters contains the name of the data.
1081
+ modifiers = [p.name for p in parameters]
1082
+ # Already at the ( to open the parameter list.
1083
+ function_parameters = list(self._GetMatchingChar('(', ')'))
1084
+ del function_parameters[-1] # Remove trailing ')'.
1085
+ # TODO(nnorwitz): store the function_parameters.
1086
+ token = self._GetNextToken()
1087
+ assert token.token_type == tokenize.SYNTAX, token
1088
+ assert token.name == ';', token
1089
+ return self._CreateVariable(indices, name.name, indices.name,
1090
+ modifiers, '', None)
1091
+ # At this point, we got something like:
1092
+ # return_type (type::*name_)(params);
1093
+ # This is a data member called name_ that is a function pointer.
1094
+ # With this code: void (sq_type::*field_)(string&);
1095
+ # We get: name=void return_type=[] parameters=sq_type ... field_
1096
+ # TODO(nnorwitz): is return_type always empty?
1097
+ # TODO(nnorwitz): this isn't even close to being correct.
1098
+ # Just put in something so we don't crash and can move on.
1099
+ real_name = parameters[-1]
1100
+ modifiers = [p.name for p in self._GetParameters()]
1101
+ del modifiers[-1] # Remove trailing ')'.
1102
+ return self._CreateVariable(indices, real_name.name, indices.name,
1103
+ modifiers, '', None)
1104
+
1105
+ if token.name == '{':
1106
+ body = list(self.GetScope())
1107
+ del body[-1] # Remove trailing '}'.
1108
+ else:
1109
+ body = None
1110
+ if token.name == '=':
1111
+ token = self._GetNextToken()
1112
+
1113
+ if token.name == 'default' or token.name == 'delete':
1114
+ # Ignore explicitly defaulted and deleted special members
1115
+ # in C++11.
1116
+ token = self._GetNextToken()
1117
+ else:
1118
+ # Handle pure-virtual declarations.
1119
+ assert token.token_type == tokenize.CONSTANT, token
1120
+ assert token.name == '0', token
1121
+ modifiers |= FUNCTION_PURE_VIRTUAL
1122
+ token = self._GetNextToken()
1123
+
1124
+ if token.name == '[':
1125
+ # TODO(nnorwitz): store tokens and improve parsing.
1126
+ # template <typename T, size_t N> char (&ASH(T (&seq)[N]))[N];
1127
+ tokens = list(self._GetMatchingChar('[', ']'))
1128
+ token = self._GetNextToken()
1129
+
1130
+ assert token.name == ';', (token, return_type_and_name, parameters)
1131
+
1132
+ # Looks like we got a method, not a function.
1133
+ if len(return_type) > 2 and return_type[-1].name == '::':
1134
+ return_type, in_class = \
1135
+ self._GetReturnTypeAndClassName(return_type)
1136
+ return Method(indices.start, indices.end, name.name, in_class,
1137
+ return_type, parameters, modifiers, templated_types,
1138
+ body, self.namespace_stack)
1139
+ return Function(indices.start, indices.end, name.name, return_type,
1140
+ parameters, modifiers, templated_types, body,
1141
+ self.namespace_stack)
1142
+
1143
+ def _GetReturnTypeAndClassName(self, token_seq):
1144
+ # Splitting the return type from the class name in a method
1145
+ # can be tricky. For example, Return::Type::Is::Hard::To::Find().
1146
+ # Where is the return type and where is the class name?
1147
+ # The heuristic used is to pull the last name as the class name.
1148
+ # This includes all the templated type info.
1149
+ # TODO(nnorwitz): if there is only One name like in the
1150
+ # example above, punt and assume the last bit is the class name.
1151
+
1152
+ # Ignore a :: prefix, if exists so we can find the first real name.
1153
+ i = 0
1154
+ if token_seq[0].name == '::':
1155
+ i = 1
1156
+ # Ignore a :: suffix, if exists.
1157
+ end = len(token_seq) - 1
1158
+ if token_seq[end-1].name == '::':
1159
+ end -= 1
1160
+
1161
+ # Make a copy of the sequence so we can append a sentinel
1162
+ # value. This is required for GetName will has to have some
1163
+ # terminating condition beyond the last name.
1164
+ seq_copy = token_seq[i:end]
1165
+ seq_copy.append(tokenize.Token(tokenize.SYNTAX, '', 0, 0))
1166
+ names = []
1167
+ while i < end:
1168
+ # Iterate through the sequence parsing out each name.
1169
+ new_name, next = self.GetName(seq_copy[i:])
1170
+ assert new_name, 'Got empty new_name, next=%s' % next
1171
+ # We got a pointer or ref. Add it to the name.
1172
+ if next and next.token_type == tokenize.SYNTAX:
1173
+ new_name.append(next)
1174
+ names.append(new_name)
1175
+ i += len(new_name)
1176
+
1177
+ # Now that we have the names, it's time to undo what we did.
1178
+
1179
+ # Remove the sentinel value.
1180
+ names[-1].pop()
1181
+ # Flatten the token sequence for the return type.
1182
+ return_type = [e for seq in names[:-1] for e in seq]
1183
+ # The class name is the last name.
1184
+ class_name = names[-1]
1185
+ return return_type, class_name
1186
+
1187
+ def handle_bool(self):
1188
+ pass
1189
+
1190
+ def handle_char(self):
1191
+ pass
1192
+
1193
+ def handle_int(self):
1194
+ pass
1195
+
1196
+ def handle_long(self):
1197
+ pass
1198
+
1199
+ def handle_short(self):
1200
+ pass
1201
+
1202
+ def handle_double(self):
1203
+ pass
1204
+
1205
+ def handle_float(self):
1206
+ pass
1207
+
1208
+ def handle_void(self):
1209
+ pass
1210
+
1211
+ def handle_wchar_t(self):
1212
+ pass
1213
+
1214
+ def handle_unsigned(self):
1215
+ pass
1216
+
1217
+ def handle_signed(self):
1218
+ pass
1219
+
1220
+ def _GetNestedType(self, ctor):
1221
+ name = None
1222
+ name_tokens, token = self.GetName()
1223
+ if name_tokens:
1224
+ name = ''.join([t.name for t in name_tokens])
1225
+
1226
+ # Handle forward declarations.
1227
+ if token.token_type == tokenize.SYNTAX and token.name == ';':
1228
+ return ctor(token.start, token.end, name, None,
1229
+ self.namespace_stack)
1230
+
1231
+ if token.token_type == tokenize.NAME and self._handling_typedef:
1232
+ self._AddBackToken(token)
1233
+ return ctor(token.start, token.end, name, None,
1234
+ self.namespace_stack)
1235
+
1236
+ # Must be the type declaration.
1237
+ fields = list(self._GetMatchingChar('{', '}'))
1238
+ del fields[-1] # Remove trailing '}'.
1239
+ if token.token_type == tokenize.SYNTAX and token.name == '{':
1240
+ next = self._GetNextToken()
1241
+ new_type = ctor(token.start, token.end, name, fields,
1242
+ self.namespace_stack)
1243
+ # A name means this is an anonymous type and the name
1244
+ # is the variable declaration.
1245
+ if next.token_type != tokenize.NAME:
1246
+ return new_type
1247
+ name = new_type
1248
+ token = next
1249
+
1250
+ # Must be variable declaration using the type prefixed with keyword.
1251
+ assert token.token_type == tokenize.NAME, token
1252
+ return self._CreateVariable(token, token.name, name, [], '', None)
1253
+
1254
+ def handle_struct(self):
1255
+ # Special case the handling typedef/aliasing of structs here.
1256
+ # It would be a pain to handle in the class code.
1257
+ name_tokens, var_token = self.GetName()
1258
+ if name_tokens:
1259
+ next_token = self._GetNextToken()
1260
+ is_syntax = (var_token.token_type == tokenize.SYNTAX and
1261
+ var_token.name[0] in '*&')
1262
+ is_variable = (var_token.token_type == tokenize.NAME and
1263
+ next_token.name == ';')
1264
+ variable = var_token
1265
+ if is_syntax and not is_variable:
1266
+ variable = next_token
1267
+ temp = self._GetNextToken()
1268
+ if temp.token_type == tokenize.SYNTAX and temp.name == '(':
1269
+ # Handle methods declared to return a struct.
1270
+ t0 = name_tokens[0]
1271
+ struct = tokenize.Token(tokenize.NAME, 'struct',
1272
+ t0.start-7, t0.start-2)
1273
+ type_and_name = [struct]
1274
+ type_and_name.extend(name_tokens)
1275
+ type_and_name.extend((var_token, next_token))
1276
+ return self._GetMethod(type_and_name, 0, None, False)
1277
+ assert temp.name == ';', (temp, name_tokens, var_token)
1278
+ if is_syntax or (is_variable and not self._handling_typedef):
1279
+ modifiers = ['struct']
1280
+ type_name = ''.join([t.name for t in name_tokens])
1281
+ position = name_tokens[0]
1282
+ return self._CreateVariable(position, variable.name, type_name,
1283
+ modifiers, var_token.name, None)
1284
+ name_tokens.extend((var_token, next_token))
1285
+ self._AddBackTokens(name_tokens)
1286
+ else:
1287
+ self._AddBackToken(var_token)
1288
+ return self._GetClass(Struct, VISIBILITY_PUBLIC, None)
1289
+
1290
+ def handle_union(self):
1291
+ return self._GetNestedType(Union)
1292
+
1293
+ def handle_enum(self):
1294
+ return self._GetNestedType(Enum)
1295
+
1296
+ def handle_auto(self):
1297
+ # TODO(nnorwitz): warn about using auto? Probably not since it
1298
+ # will be reclaimed and useful for C++0x.
1299
+ pass
1300
+
1301
+ def handle_register(self):
1302
+ pass
1303
+
1304
+ def handle_const(self):
1305
+ pass
1306
+
1307
+ def handle_inline(self):
1308
+ pass
1309
+
1310
+ def handle_extern(self):
1311
+ pass
1312
+
1313
+ def handle_static(self):
1314
+ pass
1315
+
1316
+ def handle_virtual(self):
1317
+ # What follows must be a method.
1318
+ token = token2 = self._GetNextToken()
1319
+ if token.name == 'inline':
1320
+ # HACK(nnorwitz): handle inline dtors by ignoring 'inline'.
1321
+ token2 = self._GetNextToken()
1322
+ if token2.token_type == tokenize.SYNTAX and token2.name == '~':
1323
+ return self.GetMethod(FUNCTION_VIRTUAL + FUNCTION_DTOR, None)
1324
+ assert token.token_type == tokenize.NAME or token.name == '::', token
1325
+ return_type_and_name, _ = self._GetVarTokensUpToIgnoringTemplates(
1326
+ tokenize.SYNTAX, '(') # )
1327
+ return_type_and_name.insert(0, token)
1328
+ if token2 is not token:
1329
+ return_type_and_name.insert(1, token2)
1330
+ return self._GetMethod(return_type_and_name, FUNCTION_VIRTUAL,
1331
+ None, False)
1332
+
1333
+ def handle_volatile(self):
1334
+ pass
1335
+
1336
+ def handle_mutable(self):
1337
+ pass
1338
+
1339
+ def handle_public(self):
1340
+ assert self.in_class
1341
+ self.visibility = VISIBILITY_PUBLIC
1342
+
1343
+ def handle_protected(self):
1344
+ assert self.in_class
1345
+ self.visibility = VISIBILITY_PROTECTED
1346
+
1347
+ def handle_private(self):
1348
+ assert self.in_class
1349
+ self.visibility = VISIBILITY_PRIVATE
1350
+
1351
+ def handle_friend(self):
1352
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1353
+ assert tokens
1354
+ t0 = tokens[0]
1355
+ return Friend(t0.start, t0.end, tokens, self.namespace_stack)
1356
+
1357
+ def handle_static_cast(self):
1358
+ pass
1359
+
1360
+ def handle_const_cast(self):
1361
+ pass
1362
+
1363
+ def handle_dynamic_cast(self):
1364
+ pass
1365
+
1366
+ def handle_reinterpret_cast(self):
1367
+ pass
1368
+
1369
+ def handle_new(self):
1370
+ pass
1371
+
1372
+ def handle_delete(self):
1373
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1374
+ assert tokens
1375
+ return Delete(tokens[0].start, tokens[0].end, tokens)
1376
+
1377
+ def handle_typedef(self):
1378
+ token = self._GetNextToken()
1379
+ if (token.token_type == tokenize.NAME and
1380
+ keywords.IsKeyword(token.name)):
1381
+ # Token must be struct/enum/union/class.
1382
+ method = getattr(self, 'handle_' + token.name)
1383
+ self._handling_typedef = True
1384
+ tokens = [method()]
1385
+ self._handling_typedef = False
1386
+ else:
1387
+ tokens = [token]
1388
+
1389
+ # Get the remainder of the typedef up to the semi-colon.
1390
+ tokens.extend(self._GetTokensUpTo(tokenize.SYNTAX, ';'))
1391
+
1392
+ # TODO(nnorwitz): clean all this up.
1393
+ assert tokens
1394
+ name = tokens.pop()
1395
+ indices = name
1396
+ if tokens:
1397
+ indices = tokens[0]
1398
+ if not indices:
1399
+ indices = token
1400
+ if name.name == ')':
1401
+ # HACK(nnorwitz): Handle pointers to functions "properly".
1402
+ if (len(tokens) >= 4 and
1403
+ tokens[1].name == '(' and tokens[2].name == '*'):
1404
+ tokens.append(name)
1405
+ name = tokens[3]
1406
+ elif name.name == ']':
1407
+ # HACK(nnorwitz): Handle arrays properly.
1408
+ if len(tokens) >= 2:
1409
+ tokens.append(name)
1410
+ name = tokens[1]
1411
+ new_type = tokens
1412
+ if tokens and isinstance(tokens[0], tokenize.Token):
1413
+ new_type = self.converter.ToType(tokens)[0]
1414
+ return Typedef(indices.start, indices.end, name.name,
1415
+ new_type, self.namespace_stack)
1416
+
1417
+ def handle_typeid(self):
1418
+ pass # Not needed yet.
1419
+
1420
+ def handle_typename(self):
1421
+ pass # Not needed yet.
1422
+
1423
+ def _GetTemplatedTypes(self):
1424
+ result = {}
1425
+ tokens = list(self._GetMatchingChar('<', '>'))
1426
+ len_tokens = len(tokens) - 1 # Ignore trailing '>'.
1427
+ i = 0
1428
+ while i < len_tokens:
1429
+ key = tokens[i].name
1430
+ i += 1
1431
+ if keywords.IsKeyword(key) or key == ',':
1432
+ continue
1433
+ type_name = default = None
1434
+ if i < len_tokens:
1435
+ i += 1
1436
+ if tokens[i-1].name == '=':
1437
+ assert i < len_tokens, '%s %s' % (i, tokens)
1438
+ default, unused_next_token = self.GetName(tokens[i:])
1439
+ i += len(default)
1440
+ else:
1441
+ if tokens[i-1].name != ',':
1442
+ # We got something like: Type variable.
1443
+ # Re-adjust the key (variable) and type_name (Type).
1444
+ key = tokens[i-1].name
1445
+ type_name = tokens[i-2]
1446
+
1447
+ result[key] = (type_name, default)
1448
+ return result
1449
+
1450
+ def handle_template(self):
1451
+ token = self._GetNextToken()
1452
+ assert token.token_type == tokenize.SYNTAX, token
1453
+ assert token.name == '<', token
1454
+ templated_types = self._GetTemplatedTypes()
1455
+ # TODO(nnorwitz): for now, just ignore the template params.
1456
+ token = self._GetNextToken()
1457
+ if token.token_type == tokenize.NAME:
1458
+ if token.name == 'class':
1459
+ return self._GetClass(Class, VISIBILITY_PRIVATE, templated_types)
1460
+ elif token.name == 'struct':
1461
+ return self._GetClass(Struct, VISIBILITY_PUBLIC, templated_types)
1462
+ elif token.name == 'friend':
1463
+ return self.handle_friend()
1464
+ self._AddBackToken(token)
1465
+ tokens, last = self._GetVarTokensUpTo(tokenize.SYNTAX, '(', ';')
1466
+ tokens.append(last)
1467
+ self._AddBackTokens(tokens)
1468
+ if last.name == '(':
1469
+ return self.GetMethod(FUNCTION_NONE, templated_types)
1470
+ # Must be a variable definition.
1471
+ return None
1472
+
1473
+ def handle_true(self):
1474
+ pass # Nothing to do.
1475
+
1476
+ def handle_false(self):
1477
+ pass # Nothing to do.
1478
+
1479
+ def handle_asm(self):
1480
+ pass # Not needed yet.
1481
+
1482
+ def handle_class(self):
1483
+ return self._GetClass(Class, VISIBILITY_PRIVATE, None)
1484
+
1485
+ def _GetBases(self):
1486
+ # Get base classes.
1487
+ bases = []
1488
+ while 1:
1489
+ token = self._GetNextToken()
1490
+ assert token.token_type == tokenize.NAME, token
1491
+ # TODO(nnorwitz): store kind of inheritance...maybe.
1492
+ if token.name not in ('public', 'protected', 'private'):
1493
+ # If inheritance type is not specified, it is private.
1494
+ # Just put the token back so we can form a name.
1495
+ # TODO(nnorwitz): it would be good to warn about this.
1496
+ self._AddBackToken(token)
1497
+ else:
1498
+ # Check for virtual inheritance.
1499
+ token = self._GetNextToken()
1500
+ if token.name != 'virtual':
1501
+ self._AddBackToken(token)
1502
+ else:
1503
+ # TODO(nnorwitz): store that we got virtual for this base.
1504
+ pass
1505
+ base, next_token = self.GetName()
1506
+ bases_ast = self.converter.ToType(base)
1507
+ assert len(bases_ast) == 1, bases_ast
1508
+ bases.append(bases_ast[0])
1509
+ assert next_token.token_type == tokenize.SYNTAX, next_token
1510
+ if next_token.name == '{':
1511
+ token = next_token
1512
+ break
1513
+ # Support multiple inheritance.
1514
+ assert next_token.name == ',', next_token
1515
+ return bases, token
1516
+
1517
+ def _GetClass(self, class_type, visibility, templated_types):
1518
+ class_name = None
1519
+ class_token = self._GetNextToken()
1520
+ if class_token.token_type != tokenize.NAME:
1521
+ assert class_token.token_type == tokenize.SYNTAX, class_token
1522
+ token = class_token
1523
+ else:
1524
+ # Skip any macro (e.g. storage class specifiers) after the
1525
+ # 'class' keyword.
1526
+ next_token = self._GetNextToken()
1527
+ if next_token.token_type == tokenize.NAME:
1528
+ self._AddBackToken(next_token)
1529
+ else:
1530
+ self._AddBackTokens([class_token, next_token])
1531
+ name_tokens, token = self.GetName()
1532
+ class_name = ''.join([t.name for t in name_tokens])
1533
+ bases = None
1534
+ if token.token_type == tokenize.SYNTAX:
1535
+ if token.name == ';':
1536
+ # Forward declaration.
1537
+ return class_type(class_token.start, class_token.end,
1538
+ class_name, None, templated_types, None,
1539
+ self.namespace_stack)
1540
+ if token.name in '*&':
1541
+ # Inline forward declaration. Could be method or data.
1542
+ name_token = self._GetNextToken()
1543
+ next_token = self._GetNextToken()
1544
+ if next_token.name == ';':
1545
+ # Handle data
1546
+ modifiers = ['class']
1547
+ return self._CreateVariable(class_token, name_token.name,
1548
+ class_name,
1549
+ modifiers, token.name, None)
1550
+ else:
1551
+ # Assume this is a method.
1552
+ tokens = (class_token, token, name_token, next_token)
1553
+ self._AddBackTokens(tokens)
1554
+ return self.GetMethod(FUNCTION_NONE, None)
1555
+ if token.name == ':':
1556
+ bases, token = self._GetBases()
1557
+
1558
+ body = None
1559
+ if token.token_type == tokenize.SYNTAX and token.name == '{':
1560
+ assert token.token_type == tokenize.SYNTAX, token
1561
+ assert token.name == '{', token
1562
+
1563
+ ast = AstBuilder(self.GetScope(), self.filename, class_name,
1564
+ visibility, self.namespace_stack)
1565
+ body = list(ast.Generate())
1566
+
1567
+ if not self._handling_typedef:
1568
+ token = self._GetNextToken()
1569
+ if token.token_type != tokenize.NAME:
1570
+ assert token.token_type == tokenize.SYNTAX, token
1571
+ assert token.name == ';', token
1572
+ else:
1573
+ new_class = class_type(class_token.start, class_token.end,
1574
+ class_name, bases, None,
1575
+ body, self.namespace_stack)
1576
+
1577
+ modifiers = []
1578
+ return self._CreateVariable(class_token,
1579
+ token.name, new_class,
1580
+ modifiers, token.name, None)
1581
+ else:
1582
+ if not self._handling_typedef:
1583
+ self.HandleError('non-typedef token', token)
1584
+ self._AddBackToken(token)
1585
+
1586
+ return class_type(class_token.start, class_token.end, class_name,
1587
+ bases, templated_types, body, self.namespace_stack)
1588
+
1589
+ def handle_namespace(self):
1590
+ token = self._GetNextToken()
1591
+ # Support anonymous namespaces.
1592
+ name = None
1593
+ if token.token_type == tokenize.NAME:
1594
+ name = token.name
1595
+ token = self._GetNextToken()
1596
+ self.namespace_stack.append(name)
1597
+ assert token.token_type == tokenize.SYNTAX, token
1598
+ # Create an internal token that denotes when the namespace is complete.
1599
+ internal_token = tokenize.Token(_INTERNAL_TOKEN, _NAMESPACE_POP,
1600
+ None, None)
1601
+ internal_token.whence = token.whence
1602
+ if token.name == '=':
1603
+ # TODO(nnorwitz): handle aliasing namespaces.
1604
+ name, next_token = self.GetName()
1605
+ assert next_token.name == ';', next_token
1606
+ self._AddBackToken(internal_token)
1607
+ else:
1608
+ assert token.name == '{', token
1609
+ tokens = list(self.GetScope())
1610
+ # Replace the trailing } with the internal namespace pop token.
1611
+ tokens[-1] = internal_token
1612
+ # Handle namespace with nothing in it.
1613
+ self._AddBackTokens(tokens)
1614
+ return None
1615
+
1616
+ def handle_using(self):
1617
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1618
+ assert tokens
1619
+ return Using(tokens[0].start, tokens[0].end, tokens)
1620
+
1621
+ def handle_explicit(self):
1622
+ assert self.in_class
1623
+ # Nothing much to do.
1624
+ # TODO(nnorwitz): maybe verify the method name == class name.
1625
+ # This must be a ctor.
1626
+ return self.GetMethod(FUNCTION_CTOR, None)
1627
+
1628
+ def handle_this(self):
1629
+ pass # Nothing to do.
1630
+
1631
+ def handle_operator(self):
1632
+ # Pull off the next token(s?) and make that part of the method name.
1633
+ pass
1634
+
1635
+ def handle_sizeof(self):
1636
+ pass
1637
+
1638
+ def handle_case(self):
1639
+ pass
1640
+
1641
+ def handle_switch(self):
1642
+ pass
1643
+
1644
+ def handle_default(self):
1645
+ token = self._GetNextToken()
1646
+ assert token.token_type == tokenize.SYNTAX
1647
+ assert token.name == ':'
1648
+
1649
+ def handle_if(self):
1650
+ pass
1651
+
1652
+ def handle_else(self):
1653
+ pass
1654
+
1655
+ def handle_return(self):
1656
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1657
+ if not tokens:
1658
+ return Return(self.current_token.start, self.current_token.end, None)
1659
+ return Return(tokens[0].start, tokens[0].end, tokens)
1660
+
1661
+ def handle_goto(self):
1662
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1663
+ assert len(tokens) == 1, str(tokens)
1664
+ return Goto(tokens[0].start, tokens[0].end, tokens[0].name)
1665
+
1666
+ def handle_try(self):
1667
+ pass # Not needed yet.
1668
+
1669
+ def handle_catch(self):
1670
+ pass # Not needed yet.
1671
+
1672
+ def handle_throw(self):
1673
+ pass # Not needed yet.
1674
+
1675
+ def handle_while(self):
1676
+ pass
1677
+
1678
+ def handle_do(self):
1679
+ pass
1680
+
1681
+ def handle_for(self):
1682
+ pass
1683
+
1684
+ def handle_break(self):
1685
+ self._IgnoreUpTo(tokenize.SYNTAX, ';')
1686
+
1687
+ def handle_continue(self):
1688
+ self._IgnoreUpTo(tokenize.SYNTAX, ';')
1689
+
1690
+
1691
+ def BuilderFromSource(source, filename):
1692
+ """Utility method that returns an AstBuilder from source code.
1693
+
1694
+ Args:
1695
+ source: 'C++ source code'
1696
+ filename: 'file1'
1697
+
1698
+ Returns:
1699
+ AstBuilder
1700
+ """
1701
+ return AstBuilder(tokenize.GetTokens(source), filename)
1702
+
1703
+
1704
+ def PrintIndentifiers(filename, should_print):
1705
+ """Prints all identifiers for a C++ source file.
1706
+
1707
+ Args:
1708
+ filename: 'file1'
1709
+ should_print: predicate with signature: bool Function(token)
1710
+ """
1711
+ source = utils.ReadFile(filename, False)
1712
+ if source is None:
1713
+ sys.stderr.write('Unable to find: %s\n' % filename)
1714
+ return
1715
+
1716
+ #print('Processing %s' % actual_filename)
1717
+ builder = BuilderFromSource(source, filename)
1718
+ try:
1719
+ for node in builder.Generate():
1720
+ if should_print(node):
1721
+ print(node.name)
1722
+ except KeyboardInterrupt:
1723
+ return
1724
+ except:
1725
+ pass
1726
+
1727
+
1728
+ def PrintAllIndentifiers(filenames, should_print):
1729
+ """Prints all identifiers for each C++ source file in filenames.
1730
+
1731
+ Args:
1732
+ filenames: ['file1', 'file2', ...]
1733
+ should_print: predicate with signature: bool Function(token)
1734
+ """
1735
+ for path in filenames:
1736
+ PrintIndentifiers(path, should_print)
1737
+
1738
+
1739
+ def main(argv):
1740
+ for filename in argv[1:]:
1741
+ source = utils.ReadFile(filename)
1742
+ if source is None:
1743
+ continue
1744
+
1745
+ print('Processing %s' % filename)
1746
+ builder = BuilderFromSource(source, filename)
1747
+ try:
1748
+ entire_ast = filter(None, builder.Generate())
1749
+ except KeyboardInterrupt:
1750
+ return
1751
+ except:
1752
+ # Already printed a warning, print the traceback and continue.
1753
+ traceback.print_exc()
1754
+ else:
1755
+ if utils.DEBUG:
1756
+ for ast in entire_ast:
1757
+ print(ast)
1758
+
1759
+
1760
+ if __name__ == '__main__':
1761
+ main(sys.argv)