rj_schema 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (323) hide show
  1. checksums.yaml +5 -5
  2. data/Rakefile +4 -0
  3. data/ext/rj_schema/rapidjson/thirdparty/gtest/CMakeLists.txt +16 -0
  4. data/ext/rj_schema/rapidjson/thirdparty/gtest/README.md +141 -0
  5. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CHANGES +126 -0
  6. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CMakeLists.txt +202 -0
  7. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/CONTRIBUTORS +40 -0
  8. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/LICENSE +28 -0
  9. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/Makefile.am +224 -0
  10. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/README.md +333 -0
  11. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/configure.ac +146 -0
  12. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CheatSheet.md +562 -0
  13. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/CookBook.md +3675 -0
  14. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DesignDoc.md +280 -0
  15. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/DevGuide.md +132 -0
  16. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/Documentation.md +12 -0
  17. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/ForDummies.md +439 -0
  18. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/FrequentlyAskedQuestions.md +628 -0
  19. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/KnownIssues.md +19 -0
  20. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/CheatSheet.md +525 -0
  21. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/CookBook.md +3250 -0
  22. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/Documentation.md +11 -0
  23. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/ForDummies.md +439 -0
  24. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_5/FrequentlyAskedQuestions.md +624 -0
  25. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/CheatSheet.md +534 -0
  26. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/CookBook.md +3342 -0
  27. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/Documentation.md +12 -0
  28. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/ForDummies.md +439 -0
  29. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_6/FrequentlyAskedQuestions.md +628 -0
  30. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/CheatSheet.md +556 -0
  31. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/CookBook.md +3432 -0
  32. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/Documentation.md +12 -0
  33. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/ForDummies.md +439 -0
  34. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/docs/v1_7/FrequentlyAskedQuestions.md +628 -0
  35. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-actions.h +1205 -0
  36. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-cardinalities.h +147 -0
  37. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h +2377 -0
  38. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-actions.h.pump +794 -0
  39. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h +1095 -0
  40. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-function-mockers.h.pump +291 -0
  41. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h +2179 -0
  42. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-matchers.h.pump +672 -0
  43. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h +397 -0
  44. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-generated-nice-strict.h.pump +161 -0
  45. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-matchers.h +4399 -0
  46. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-actions.h +246 -0
  47. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-more-matchers.h +58 -0
  48. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock-spec-builders.h +1847 -0
  49. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/gmock.h +94 -0
  50. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h +8 -0
  51. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-generated-actions.h.pump +10 -0
  52. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-matchers.h +39 -0
  53. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/custom/gmock-port.h +46 -0
  54. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h +279 -0
  55. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h.pump +136 -0
  56. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-internal-utils.h +511 -0
  57. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/include/gmock/internal/gmock-port.h +91 -0
  58. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/make/Makefile +101 -0
  59. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.sln +32 -0
  60. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock.vcproj +191 -0
  61. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_config.vsprops +15 -0
  62. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_main.vcproj +187 -0
  63. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2005/gmock_test.vcproj +201 -0
  64. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.sln +32 -0
  65. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock.vcxproj +82 -0
  66. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_config.props +19 -0
  67. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_main.vcxproj +88 -0
  68. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2010/gmock_test.vcxproj +101 -0
  69. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.sln +32 -0
  70. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock.vcxproj +84 -0
  71. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_config.props +19 -0
  72. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_main.vcxproj +90 -0
  73. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/msvc/2015/gmock_test.vcxproj +103 -0
  74. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/fuse_gmock_files.py +240 -0
  75. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/LICENSE +203 -0
  76. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README +35 -0
  77. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/README.cppclean +115 -0
  78. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/__init__.py +0 -0
  79. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/ast.py +1733 -0
  80. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class.py +227 -0
  81. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/gmock_class_test.py +448 -0
  82. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/keywords.py +59 -0
  83. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/tokenize.py +287 -0
  84. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/cpp/utils.py +41 -0
  85. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/generator/gmock_gen.py +31 -0
  86. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock-config.in +303 -0
  87. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/gmock_doctor.py +640 -0
  88. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload.py +1387 -0
  89. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/scripts/upload_gmock.py +78 -0
  90. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-all.cc +47 -0
  91. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-cardinalities.cc +156 -0
  92. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-internal-utils.cc +174 -0
  93. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-matchers.cc +498 -0
  94. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock-spec-builders.cc +823 -0
  95. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock.cc +183 -0
  96. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/src/gmock_main.cc +54 -0
  97. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-actions_test.cc +1411 -0
  98. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-cardinalities_test.cc +428 -0
  99. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-actions_test.cc +1228 -0
  100. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-function-mockers_test.cc +622 -0
  101. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-internal-utils_test.cc +127 -0
  102. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-generated-matchers_test.cc +1286 -0
  103. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-internal-utils_test.cc +699 -0
  104. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-matchers_test.cc +5648 -0
  105. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-more-actions_test.cc +708 -0
  106. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-nice-strict_test.cc +424 -0
  107. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-port_test.cc +43 -0
  108. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock-spec-builders_test.cc +2644 -0
  109. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_all_test.cc +51 -0
  110. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_ex_test.cc +81 -0
  111. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test.py +108 -0
  112. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_leak_test_.cc +100 -0
  113. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link2_test.cc +40 -0
  114. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.cc +40 -0
  115. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_link_test.h +669 -0
  116. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test.py +180 -0
  117. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_.cc +291 -0
  118. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_output_test_golden.txt +310 -0
  119. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_stress_test.cc +322 -0
  120. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test.cc +220 -0
  121. data/ext/rj_schema/rapidjson/thirdparty/gtest/googlemock/test/gmock_test_utils.py +112 -0
  122. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CHANGES +157 -0
  123. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CMakeLists.txt +286 -0
  124. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/CONTRIBUTORS +37 -0
  125. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/LICENSE +28 -0
  126. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/Makefile.am +310 -0
  127. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/README.md +280 -0
  128. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/cmake/internal_utils.cmake +242 -0
  129. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.cbproj +138 -0
  130. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest.groupproj +54 -0
  131. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_all.cc +38 -0
  132. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_link.cc +40 -0
  133. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_main.cbproj +82 -0
  134. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/codegear/gtest_unittest.cbproj +88 -0
  135. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/configure.ac +68 -0
  136. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/AdvancedGuide.md +2182 -0
  137. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/DevGuide.md +126 -0
  138. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Documentation.md +14 -0
  139. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/FAQ.md +1087 -0
  140. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Primer.md +502 -0
  141. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/PumpManual.md +177 -0
  142. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/Samples.md +14 -0
  143. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_AdvancedGuide.md +2096 -0
  144. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_Documentation.md +12 -0
  145. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_FAQ.md +886 -0
  146. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_Primer.md +497 -0
  147. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_PumpManual.md +177 -0
  148. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_5_XcodeGuide.md +93 -0
  149. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_AdvancedGuide.md +2178 -0
  150. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_Documentation.md +14 -0
  151. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_FAQ.md +1038 -0
  152. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_Primer.md +501 -0
  153. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_PumpManual.md +177 -0
  154. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_Samples.md +14 -0
  155. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_6_XcodeGuide.md +93 -0
  156. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_AdvancedGuide.md +2181 -0
  157. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_Documentation.md +14 -0
  158. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_FAQ.md +1082 -0
  159. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_Primer.md +501 -0
  160. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_PumpManual.md +177 -0
  161. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_Samples.md +14 -0
  162. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/V1_7_XcodeGuide.md +93 -0
  163. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/docs/XcodeGuide.md +93 -0
  164. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-death-test.h +294 -0
  165. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-message.h +250 -0
  166. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h +1444 -0
  167. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-param-test.h.pump +510 -0
  168. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-printers.h +993 -0
  169. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-spi.h +232 -0
  170. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-test-part.h +179 -0
  171. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest-typed-test.h +263 -0
  172. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest.h +2236 -0
  173. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_pred_impl.h +358 -0
  174. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/gtest_prod.h +58 -0
  175. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-port.h +69 -0
  176. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest-printers.h +42 -0
  177. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/custom/gtest.h +41 -0
  178. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-death-test-internal.h +319 -0
  179. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-filepath.h +206 -0
  180. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-internal.h +1238 -0
  181. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-linked_ptr.h +243 -0
  182. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h +5146 -0
  183. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util-generated.h.pump +286 -0
  184. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-param-util.h +731 -0
  185. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port-arch.h +93 -0
  186. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-port.h +2554 -0
  187. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-string.h +167 -0
  188. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h +1020 -0
  189. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-tuple.h.pump +347 -0
  190. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h +3331 -0
  191. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/include/gtest/internal/gtest-type-util.h.pump +297 -0
  192. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/acx_pthread.m4 +363 -0
  193. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/m4/gtest.m4 +74 -0
  194. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/make/Makefile +82 -0
  195. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest-md.sln +45 -0
  196. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest-md.vcproj +126 -0
  197. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest.sln +45 -0
  198. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest.vcproj +126 -0
  199. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_main-md.vcproj +129 -0
  200. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_main.vcproj +129 -0
  201. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_prod_test-md.vcproj +164 -0
  202. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_prod_test.vcproj +164 -0
  203. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_unittest-md.vcproj +147 -0
  204. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/msvc/gtest_unittest.vcproj +147 -0
  205. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/prime_tables.h +123 -0
  206. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.cc +68 -0
  207. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1.h +43 -0
  208. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample10_unittest.cc +144 -0
  209. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample1_unittest.cc +153 -0
  210. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.cc +56 -0
  211. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2.h +85 -0
  212. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample2_unittest.cc +109 -0
  213. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3-inl.h +172 -0
  214. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample3_unittest.cc +151 -0
  215. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.cc +46 -0
  216. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4.h +53 -0
  217. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample4_unittest.cc +45 -0
  218. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample5_unittest.cc +199 -0
  219. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample6_unittest.cc +224 -0
  220. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample7_unittest.cc +130 -0
  221. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample8_unittest.cc +173 -0
  222. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/samples/sample9_unittest.cc +160 -0
  223. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/common.py +83 -0
  224. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/fuse_gtest_files.py +253 -0
  225. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gen_gtest_pred_impl.py +730 -0
  226. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/gtest-config.in +274 -0
  227. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/pump.py +855 -0
  228. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/release_docs.py +158 -0
  229. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/test/Makefile +59 -0
  230. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload.py +1387 -0
  231. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/scripts/upload_gtest.py +78 -0
  232. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-all.cc +48 -0
  233. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-death-test.cc +1342 -0
  234. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-filepath.cc +387 -0
  235. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-internal-inl.h +1183 -0
  236. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-port.cc +1259 -0
  237. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-printers.cc +373 -0
  238. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-test-part.cc +110 -0
  239. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest-typed-test.cc +118 -0
  240. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest.cc +5388 -0
  241. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/src/gtest_main.cc +38 -0
  242. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_ex_test.cc +93 -0
  243. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-death-test_test.cc +1427 -0
  244. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-filepath_test.cc +662 -0
  245. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-linked_ptr_test.cc +154 -0
  246. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-listener_test.cc +311 -0
  247. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-message_test.cc +159 -0
  248. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-options_test.cc +215 -0
  249. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test2_test.cc +65 -0
  250. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.cc +1055 -0
  251. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-param-test_test.h +57 -0
  252. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-port_test.cc +1304 -0
  253. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-printers_test.cc +1635 -0
  254. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-test-part_test.cc +208 -0
  255. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-tuple_test.cc +320 -0
  256. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test2_test.cc +45 -0
  257. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.cc +380 -0
  258. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-typed-test_test.h +66 -0
  259. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest-unittest-api_test.cc +341 -0
  260. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_all_test.cc +47 -0
  261. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest.py +212 -0
  262. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_break_on_failure_unittest_.cc +88 -0
  263. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test.py +237 -0
  264. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_catch_exceptions_test_.cc +311 -0
  265. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test.py +130 -0
  266. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_color_test_.cc +71 -0
  267. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test.py +117 -0
  268. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_env_var_test_.cc +126 -0
  269. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_environment_test.cc +192 -0
  270. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest.py +636 -0
  271. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_filter_unittest_.cc +140 -0
  272. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test.py +172 -0
  273. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_help_test_.cc +46 -0
  274. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest.py +207 -0
  275. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_list_tests_unittest_.cc +157 -0
  276. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_main_unittest.cc +45 -0
  277. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_no_test_unittest.cc +56 -0
  278. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test.py +340 -0
  279. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_.cc +1062 -0
  280. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_output_test_golden_lin.txt +743 -0
  281. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_pred_impl_unittest.cc +2427 -0
  282. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_premature_exit_test.cc +127 -0
  283. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_prod_test.cc +57 -0
  284. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_repeat_test.cc +253 -0
  285. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test.py +325 -0
  286. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_shuffle_test_.cc +103 -0
  287. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_sole_header_test.cc +57 -0
  288. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_stress_test.cc +256 -0
  289. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_test_utils.py +320 -0
  290. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_ex_test.cc +92 -0
  291. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test.py +171 -0
  292. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_throw_on_failure_test_.cc +72 -0
  293. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test.py +70 -0
  294. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_uninitialized_test_.cc +43 -0
  295. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_unittest.cc +7706 -0
  296. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile1_test_.cc +49 -0
  297. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfile2_test_.cc +49 -0
  298. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_outfiles_test.py +132 -0
  299. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest.py +308 -0
  300. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_output_unittest_.cc +181 -0
  301. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/gtest_xml_test_utils.py +194 -0
  302. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.cc +36 -0
  303. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/test/production.h +55 -0
  304. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/DebugProject.xcconfig +30 -0
  305. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/FrameworkTarget.xcconfig +17 -0
  306. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/General.xcconfig +41 -0
  307. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/ReleaseProject.xcconfig +32 -0
  308. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/StaticLibraryTarget.xcconfig +18 -0
  309. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Config/TestTarget.xcconfig +8 -0
  310. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Resources/Info.plist +30 -0
  311. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/Info.plist +28 -0
  312. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/WidgetFramework.xcodeproj/project.pbxproj +457 -0
  313. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/runtests.sh +62 -0
  314. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.cc +63 -0
  315. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget.h +59 -0
  316. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Samples/FrameworkSample/widget_test.cc +68 -0
  317. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/runtests.sh +65 -0
  318. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/Scripts/versiongenerate.py +100 -0
  319. data/ext/rj_schema/rapidjson/thirdparty/gtest/googletest/xcode/gtest.xcodeproj/project.pbxproj +1135 -0
  320. data/ext/rj_schema/rapidjson/thirdparty/gtest/travis.sh +15 -0
  321. data/ext/rj_schema/rj_schema.cpp +64 -41
  322. data/lib/rj_schema.rb +1 -1
  323. metadata +378 -5
@@ -0,0 +1,203 @@
1
+
2
+ Apache License
3
+ Version 2.0, January 2004
4
+ http://www.apache.org/licenses/
5
+
6
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
7
+
8
+ 1. Definitions.
9
+
10
+ "License" shall mean the terms and conditions for use, reproduction,
11
+ and distribution as defined by Sections 1 through 9 of this document.
12
+
13
+ "Licensor" shall mean the copyright owner or entity authorized by
14
+ the copyright owner that is granting the License.
15
+
16
+ "Legal Entity" shall mean the union of the acting entity and all
17
+ other entities that control, are controlled by, or are under common
18
+ control with that entity. For the purposes of this definition,
19
+ "control" means (i) the power, direct or indirect, to cause the
20
+ direction or management of such entity, whether by contract or
21
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
22
+ outstanding shares, or (iii) beneficial ownership of such entity.
23
+
24
+ "You" (or "Your") shall mean an individual or Legal Entity
25
+ exercising permissions granted by this License.
26
+
27
+ "Source" form shall mean the preferred form for making modifications,
28
+ including but not limited to software source code, documentation
29
+ source, and configuration files.
30
+
31
+ "Object" form shall mean any form resulting from mechanical
32
+ transformation or translation of a Source form, including but
33
+ not limited to compiled object code, generated documentation,
34
+ and conversions to other media types.
35
+
36
+ "Work" shall mean the work of authorship, whether in Source or
37
+ Object form, made available under the License, as indicated by a
38
+ copyright notice that is included in or attached to the work
39
+ (an example is provided in the Appendix below).
40
+
41
+ "Derivative Works" shall mean any work, whether in Source or Object
42
+ form, that is based on (or derived from) the Work and for which the
43
+ editorial revisions, annotations, elaborations, or other modifications
44
+ represent, as a whole, an original work of authorship. For the purposes
45
+ of this License, Derivative Works shall not include works that remain
46
+ separable from, or merely link (or bind by name) to the interfaces of,
47
+ the Work and Derivative Works thereof.
48
+
49
+ "Contribution" shall mean any work of authorship, including
50
+ the original version of the Work and any modifications or additions
51
+ to that Work or Derivative Works thereof, that is intentionally
52
+ submitted to Licensor for inclusion in the Work by the copyright owner
53
+ or by an individual or Legal Entity authorized to submit on behalf of
54
+ the copyright owner. For the purposes of this definition, "submitted"
55
+ means any form of electronic, verbal, or written communication sent
56
+ to the Licensor or its representatives, including but not limited to
57
+ communication on electronic mailing lists, source code control systems,
58
+ and issue tracking systems that are managed by, or on behalf of, the
59
+ Licensor for the purpose of discussing and improving the Work, but
60
+ excluding communication that is conspicuously marked or otherwise
61
+ designated in writing by the copyright owner as "Not a Contribution."
62
+
63
+ "Contributor" shall mean Licensor and any individual or Legal Entity
64
+ on behalf of whom a Contribution has been received by Licensor and
65
+ subsequently incorporated within the Work.
66
+
67
+ 2. Grant of Copyright License. Subject to the terms and conditions of
68
+ this License, each Contributor hereby grants to You a perpetual,
69
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
70
+ copyright license to reproduce, prepare Derivative Works of,
71
+ publicly display, publicly perform, sublicense, and distribute the
72
+ Work and such Derivative Works in Source or Object form.
73
+
74
+ 3. Grant of Patent License. Subject to the terms and conditions of
75
+ this License, each Contributor hereby grants to You a perpetual,
76
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
77
+ (except as stated in this section) patent license to make, have made,
78
+ use, offer to sell, sell, import, and otherwise transfer the Work,
79
+ where such license applies only to those patent claims licensable
80
+ by such Contributor that are necessarily infringed by their
81
+ Contribution(s) alone or by combination of their Contribution(s)
82
+ with the Work to which such Contribution(s) was submitted. If You
83
+ institute patent litigation against any entity (including a
84
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
85
+ or a Contribution incorporated within the Work constitutes direct
86
+ or contributory patent infringement, then any patent licenses
87
+ granted to You under this License for that Work shall terminate
88
+ as of the date such litigation is filed.
89
+
90
+ 4. Redistribution. You may reproduce and distribute copies of the
91
+ Work or Derivative Works thereof in any medium, with or without
92
+ modifications, and in Source or Object form, provided that You
93
+ meet the following conditions:
94
+
95
+ (a) You must give any other recipients of the Work or
96
+ Derivative Works a copy of this License; and
97
+
98
+ (b) You must cause any modified files to carry prominent notices
99
+ stating that You changed the files; and
100
+
101
+ (c) You must retain, in the Source form of any Derivative Works
102
+ that You distribute, all copyright, patent, trademark, and
103
+ attribution notices from the Source form of the Work,
104
+ excluding those notices that do not pertain to any part of
105
+ the Derivative Works; and
106
+
107
+ (d) If the Work includes a "NOTICE" text file as part of its
108
+ distribution, then any Derivative Works that You distribute must
109
+ include a readable copy of the attribution notices contained
110
+ within such NOTICE file, excluding those notices that do not
111
+ pertain to any part of the Derivative Works, in at least one
112
+ of the following places: within a NOTICE text file distributed
113
+ as part of the Derivative Works; within the Source form or
114
+ documentation, if provided along with the Derivative Works; or,
115
+ within a display generated by the Derivative Works, if and
116
+ wherever such third-party notices normally appear. The contents
117
+ of the NOTICE file are for informational purposes only and
118
+ do not modify the License. You may add Your own attribution
119
+ notices within Derivative Works that You distribute, alongside
120
+ or as an addendum to the NOTICE text from the Work, provided
121
+ that such additional attribution notices cannot be construed
122
+ as modifying the License.
123
+
124
+ You may add Your own copyright statement to Your modifications and
125
+ may provide additional or different license terms and conditions
126
+ for use, reproduction, or distribution of Your modifications, or
127
+ for any such Derivative Works as a whole, provided Your use,
128
+ reproduction, and distribution of the Work otherwise complies with
129
+ the conditions stated in this License.
130
+
131
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
132
+ any Contribution intentionally submitted for inclusion in the Work
133
+ by You to the Licensor shall be under the terms and conditions of
134
+ this License, without any additional terms or conditions.
135
+ Notwithstanding the above, nothing herein shall supersede or modify
136
+ the terms of any separate license agreement you may have executed
137
+ with Licensor regarding such Contributions.
138
+
139
+ 6. Trademarks. This License does not grant permission to use the trade
140
+ names, trademarks, service marks, or product names of the Licensor,
141
+ except as required for reasonable and customary use in describing the
142
+ origin of the Work and reproducing the content of the NOTICE file.
143
+
144
+ 7. Disclaimer of Warranty. Unless required by applicable law or
145
+ agreed to in writing, Licensor provides the Work (and each
146
+ Contributor provides its Contributions) on an "AS IS" BASIS,
147
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
148
+ implied, including, without limitation, any warranties or conditions
149
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
150
+ PARTICULAR PURPOSE. You are solely responsible for determining the
151
+ appropriateness of using or redistributing the Work and assume any
152
+ risks associated with Your exercise of permissions under this License.
153
+
154
+ 8. Limitation of Liability. In no event and under no legal theory,
155
+ whether in tort (including negligence), contract, or otherwise,
156
+ unless required by applicable law (such as deliberate and grossly
157
+ negligent acts) or agreed to in writing, shall any Contributor be
158
+ liable to You for damages, including any direct, indirect, special,
159
+ incidental, or consequential damages of any character arising as a
160
+ result of this License or out of the use or inability to use the
161
+ Work (including but not limited to damages for loss of goodwill,
162
+ work stoppage, computer failure or malfunction, or any and all
163
+ other commercial damages or losses), even if such Contributor
164
+ has been advised of the possibility of such damages.
165
+
166
+ 9. Accepting Warranty or Additional Liability. While redistributing
167
+ the Work or Derivative Works thereof, You may choose to offer,
168
+ and charge a fee for, acceptance of support, warranty, indemnity,
169
+ or other liability obligations and/or rights consistent with this
170
+ License. However, in accepting such obligations, You may act only
171
+ on Your own behalf and on Your sole responsibility, not on behalf
172
+ of any other Contributor, and only if You agree to indemnify,
173
+ defend, and hold each Contributor harmless for any liability
174
+ incurred by, or claims asserted against, such Contributor by reason
175
+ of your accepting any such warranty or additional liability.
176
+
177
+ END OF TERMS AND CONDITIONS
178
+
179
+ APPENDIX: How to apply the Apache License to your work.
180
+
181
+ To apply the Apache License to your work, attach the following
182
+ boilerplate notice, with the fields enclosed by brackets "[]"
183
+ replaced with your own identifying information. (Don't include
184
+ the brackets!) The text should be enclosed in the appropriate
185
+ comment syntax for the file format. We also recommend that a
186
+ file or class name and description of purpose be included on the
187
+ same "printed page" as the copyright notice for easier
188
+ identification within third-party archives.
189
+
190
+ Copyright [2007] Neal Norwitz
191
+ Portions Copyright [2007] Google Inc.
192
+
193
+ Licensed under the Apache License, Version 2.0 (the "License");
194
+ you may not use this file except in compliance with the License.
195
+ You may obtain a copy of the License at
196
+
197
+ http://www.apache.org/licenses/LICENSE-2.0
198
+
199
+ Unless required by applicable law or agreed to in writing, software
200
+ distributed under the License is distributed on an "AS IS" BASIS,
201
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
202
+ See the License for the specific language governing permissions and
203
+ limitations under the License.
@@ -0,0 +1,35 @@
1
+
2
+ The Google Mock class generator is an application that is part of cppclean.
3
+ For more information about cppclean, see the README.cppclean file or
4
+ visit http://code.google.com/p/cppclean/
5
+
6
+ cppclean requires Python 2.3.5 or later. If you don't have Python installed
7
+ on your system, you will also need to install it. You can download Python
8
+ from: http://www.python.org/download/releases/
9
+
10
+ To use the Google Mock class generator, you need to call it
11
+ on the command line passing the header file and class for which you want
12
+ to generate a Google Mock class.
13
+
14
+ Make sure to install the scripts somewhere in your path. Then you can
15
+ run the program.
16
+
17
+ gmock_gen.py header-file.h [ClassName]...
18
+
19
+ If no ClassNames are specified, all classes in the file are emitted.
20
+
21
+ To change the indentation from the default of 2, set INDENT in
22
+ the environment. For example to use an indent of 4 spaces:
23
+
24
+ INDENT=4 gmock_gen.py header-file.h ClassName
25
+
26
+ This version was made from SVN revision 281 in the cppclean repository.
27
+
28
+ Known Limitations
29
+ -----------------
30
+ Not all code will be generated properly. For example, when mocking templated
31
+ classes, the template information is lost. You will need to add the template
32
+ information manually.
33
+
34
+ Not all permutations of using multiple pointers/references will be rendered
35
+ properly. These will also have to be fixed manually.
@@ -0,0 +1,115 @@
1
+ Goal:
2
+ -----
3
+ CppClean attempts to find problems in C++ source that slow development
4
+ in large code bases, for example various forms of unused code.
5
+ Unused code can be unused functions, methods, data members, types, etc
6
+ to unnecessary #include directives. Unnecessary #includes can cause
7
+ considerable extra compiles increasing the edit-compile-run cycle.
8
+
9
+ The project home page is: http://code.google.com/p/cppclean/
10
+
11
+
12
+ Features:
13
+ ---------
14
+ * Find and print C++ language constructs: classes, methods, functions, etc.
15
+ * Find classes with virtual methods, no virtual destructor, and no bases
16
+ * Find global/static data that are potential problems when using threads
17
+ * Unnecessary forward class declarations
18
+ * Unnecessary function declarations
19
+ * Undeclared function definitions
20
+ * (planned) Find unnecessary header files #included
21
+ - No direct reference to anything in the header
22
+ - Header is unnecessary if classes were forward declared instead
23
+ * (planned) Source files that reference headers not directly #included,
24
+ ie, files that rely on a transitive #include from another header
25
+ * (planned) Unused members (private, protected, & public) methods and data
26
+ * (planned) Store AST in a SQL database so relationships can be queried
27
+
28
+ AST is Abstract Syntax Tree, a representation of parsed source code.
29
+ http://en.wikipedia.org/wiki/Abstract_syntax_tree
30
+
31
+
32
+ System Requirements:
33
+ --------------------
34
+ * Python 2.4 or later (2.3 probably works too)
35
+ * Works on Windows (untested), Mac OS X, and Unix
36
+
37
+
38
+ How to Run:
39
+ -----------
40
+ For all examples, it is assumed that cppclean resides in a directory called
41
+ /cppclean.
42
+
43
+ To print warnings for classes with virtual methods, no virtual destructor and
44
+ no base classes:
45
+
46
+ /cppclean/run.sh nonvirtual_dtors.py file1.h file2.h file3.cc ...
47
+
48
+ To print all the functions defined in header file(s):
49
+
50
+ /cppclean/run.sh functions.py file1.h file2.h ...
51
+
52
+ All the commands take multiple files on the command line. Other programs
53
+ include: find_warnings, headers, methods, and types. Some other programs
54
+ are available, but used primarily for debugging.
55
+
56
+ run.sh is a simple wrapper that sets PYTHONPATH to /cppclean and then
57
+ runs the program in /cppclean/cpp/PROGRAM.py. There is currently
58
+ no equivalent for Windows. Contributions for a run.bat file
59
+ would be greatly appreciated.
60
+
61
+
62
+ How to Configure:
63
+ -----------------
64
+ You can add a siteheaders.py file in /cppclean/cpp to configure where
65
+ to look for other headers (typically -I options passed to a compiler).
66
+ Currently two values are supported: _TRANSITIVE and GetIncludeDirs.
67
+ _TRANSITIVE should be set to a boolean value (True or False) indicating
68
+ whether to transitively process all header files. The default is False.
69
+
70
+ GetIncludeDirs is a function that takes a single argument and returns
71
+ a sequence of directories to include. This can be a generator or
72
+ return a static list.
73
+
74
+ def GetIncludeDirs(filename):
75
+ return ['/some/path/with/other/headers']
76
+
77
+ # Here is a more complicated example.
78
+ def GetIncludeDirs(filename):
79
+ yield '/path1'
80
+ yield os.path.join('/path2', os.path.dirname(filename))
81
+ yield '/path3'
82
+
83
+
84
+ How to Test:
85
+ ------------
86
+ For all examples, it is assumed that cppclean resides in a directory called
87
+ /cppclean. The tests require
88
+
89
+ cd /cppclean
90
+ make test
91
+ # To generate expected results after a change:
92
+ make expected
93
+
94
+
95
+ Current Status:
96
+ ---------------
97
+ The parser works pretty well for header files, parsing about 99% of Google's
98
+ header files. Anything which inspects structure of C++ source files should
99
+ work reasonably well. Function bodies are not transformed to an AST,
100
+ but left as tokens. Much work is still needed on finding unused header files
101
+ and storing an AST in a database.
102
+
103
+
104
+ Non-goals:
105
+ ----------
106
+ * Parsing all valid C++ source
107
+ * Handling invalid C++ source gracefully
108
+ * Compiling to machine code (or anything beyond an AST)
109
+
110
+
111
+ Contact:
112
+ --------
113
+ If you used cppclean, I would love to hear about your experiences
114
+ cppclean@googlegroups.com. Even if you don't use cppclean, I'd like to
115
+ hear from you. :-) (You can contact me directly at: nnorwitz@gmail.com)
@@ -0,0 +1,1733 @@
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
+ __author__ = 'nnorwitz@google.com (Neal Norwitz)'
21
+
22
+
23
+ # TODO:
24
+ # * Tokens should never be exported, need to convert to Nodes
25
+ # (return types, parameters, etc.)
26
+ # * Handle static class data for templatized classes
27
+ # * Handle casts (both C++ and C-style)
28
+ # * Handle conditions and loops (if/else, switch, for, while/do)
29
+ #
30
+ # TODO much, much later:
31
+ # * Handle #define
32
+ # * exceptions
33
+
34
+
35
+ try:
36
+ # Python 3.x
37
+ import builtins
38
+ except ImportError:
39
+ # Python 2.x
40
+ import __builtin__ as builtins
41
+
42
+ import sys
43
+ import traceback
44
+
45
+ from cpp import keywords
46
+ from cpp import tokenize
47
+ from cpp import utils
48
+
49
+
50
+ if not hasattr(builtins, 'reversed'):
51
+ # Support Python 2.3 and earlier.
52
+ def reversed(seq):
53
+ for i in range(len(seq)-1, -1, -1):
54
+ yield seq[i]
55
+
56
+ if not hasattr(builtins, 'next'):
57
+ # Support Python 2.5 and earlier.
58
+ def next(obj):
59
+ return obj.next()
60
+
61
+
62
+ VISIBILITY_PUBLIC, VISIBILITY_PROTECTED, VISIBILITY_PRIVATE = range(3)
63
+
64
+ FUNCTION_NONE = 0x00
65
+ FUNCTION_CONST = 0x01
66
+ FUNCTION_VIRTUAL = 0x02
67
+ FUNCTION_PURE_VIRTUAL = 0x04
68
+ FUNCTION_CTOR = 0x08
69
+ FUNCTION_DTOR = 0x10
70
+ FUNCTION_ATTRIBUTE = 0x20
71
+ FUNCTION_UNKNOWN_ANNOTATION = 0x40
72
+ FUNCTION_THROW = 0x80
73
+ FUNCTION_OVERRIDE = 0x100
74
+
75
+ """
76
+ These are currently unused. Should really handle these properly at some point.
77
+
78
+ TYPE_MODIFIER_INLINE = 0x010000
79
+ TYPE_MODIFIER_EXTERN = 0x020000
80
+ TYPE_MODIFIER_STATIC = 0x040000
81
+ TYPE_MODIFIER_CONST = 0x080000
82
+ TYPE_MODIFIER_REGISTER = 0x100000
83
+ TYPE_MODIFIER_VOLATILE = 0x200000
84
+ TYPE_MODIFIER_MUTABLE = 0x400000
85
+
86
+ TYPE_MODIFIER_MAP = {
87
+ 'inline': TYPE_MODIFIER_INLINE,
88
+ 'extern': TYPE_MODIFIER_EXTERN,
89
+ 'static': TYPE_MODIFIER_STATIC,
90
+ 'const': TYPE_MODIFIER_CONST,
91
+ 'register': TYPE_MODIFIER_REGISTER,
92
+ 'volatile': TYPE_MODIFIER_VOLATILE,
93
+ 'mutable': TYPE_MODIFIER_MUTABLE,
94
+ }
95
+ """
96
+
97
+ _INTERNAL_TOKEN = 'internal'
98
+ _NAMESPACE_POP = 'ns-pop'
99
+
100
+
101
+ # TODO(nnorwitz): use this as a singleton for templated_types, etc
102
+ # where we don't want to create a new empty dict each time. It is also const.
103
+ class _NullDict(object):
104
+ __contains__ = lambda self: False
105
+ keys = values = items = iterkeys = itervalues = iteritems = lambda self: ()
106
+
107
+
108
+ # TODO(nnorwitz): move AST nodes into a separate module.
109
+ class Node(object):
110
+ """Base AST node."""
111
+
112
+ def __init__(self, start, end):
113
+ self.start = start
114
+ self.end = end
115
+
116
+ def IsDeclaration(self):
117
+ """Returns bool if this node is a declaration."""
118
+ return False
119
+
120
+ def IsDefinition(self):
121
+ """Returns bool if this node is a definition."""
122
+ return False
123
+
124
+ def IsExportable(self):
125
+ """Returns bool if this node exportable from a header file."""
126
+ return False
127
+
128
+ def Requires(self, node):
129
+ """Does this AST node require the definition of the node passed in?"""
130
+ return False
131
+
132
+ def XXX__str__(self):
133
+ return self._StringHelper(self.__class__.__name__, '')
134
+
135
+ def _StringHelper(self, name, suffix):
136
+ if not utils.DEBUG:
137
+ return '%s(%s)' % (name, suffix)
138
+ return '%s(%d, %d, %s)' % (name, self.start, self.end, suffix)
139
+
140
+ def __repr__(self):
141
+ return str(self)
142
+
143
+
144
+ class Define(Node):
145
+ def __init__(self, start, end, name, definition):
146
+ Node.__init__(self, start, end)
147
+ self.name = name
148
+ self.definition = definition
149
+
150
+ def __str__(self):
151
+ value = '%s %s' % (self.name, self.definition)
152
+ return self._StringHelper(self.__class__.__name__, value)
153
+
154
+
155
+ class Include(Node):
156
+ def __init__(self, start, end, filename, system):
157
+ Node.__init__(self, start, end)
158
+ self.filename = filename
159
+ self.system = system
160
+
161
+ def __str__(self):
162
+ fmt = '"%s"'
163
+ if self.system:
164
+ fmt = '<%s>'
165
+ return self._StringHelper(self.__class__.__name__, fmt % self.filename)
166
+
167
+
168
+ class Goto(Node):
169
+ def __init__(self, start, end, label):
170
+ Node.__init__(self, start, end)
171
+ self.label = label
172
+
173
+ def __str__(self):
174
+ return self._StringHelper(self.__class__.__name__, str(self.label))
175
+
176
+
177
+ class Expr(Node):
178
+ def __init__(self, start, end, expr):
179
+ Node.__init__(self, start, end)
180
+ self.expr = expr
181
+
182
+ def Requires(self, node):
183
+ # TODO(nnorwitz): impl.
184
+ return False
185
+
186
+ def __str__(self):
187
+ return self._StringHelper(self.__class__.__name__, str(self.expr))
188
+
189
+
190
+ class Return(Expr):
191
+ pass
192
+
193
+
194
+ class Delete(Expr):
195
+ pass
196
+
197
+
198
+ class Friend(Expr):
199
+ def __init__(self, start, end, expr, namespace):
200
+ Expr.__init__(self, start, end, expr)
201
+ self.namespace = namespace[:]
202
+
203
+
204
+ class Using(Node):
205
+ def __init__(self, start, end, names):
206
+ Node.__init__(self, start, end)
207
+ self.names = names
208
+
209
+ def __str__(self):
210
+ return self._StringHelper(self.__class__.__name__, str(self.names))
211
+
212
+
213
+ class Parameter(Node):
214
+ def __init__(self, start, end, name, parameter_type, default):
215
+ Node.__init__(self, start, end)
216
+ self.name = name
217
+ self.type = parameter_type
218
+ self.default = default
219
+
220
+ def Requires(self, node):
221
+ # TODO(nnorwitz): handle namespaces, etc.
222
+ return self.type.name == node.name
223
+
224
+ def __str__(self):
225
+ name = str(self.type)
226
+ suffix = '%s %s' % (name, self.name)
227
+ if self.default:
228
+ suffix += ' = ' + ''.join([d.name for d in self.default])
229
+ return self._StringHelper(self.__class__.__name__, suffix)
230
+
231
+
232
+ class _GenericDeclaration(Node):
233
+ def __init__(self, start, end, name, namespace):
234
+ Node.__init__(self, start, end)
235
+ self.name = name
236
+ self.namespace = namespace[:]
237
+
238
+ def FullName(self):
239
+ prefix = ''
240
+ if self.namespace and self.namespace[-1]:
241
+ prefix = '::'.join(self.namespace) + '::'
242
+ return prefix + self.name
243
+
244
+ def _TypeStringHelper(self, suffix):
245
+ if self.namespace:
246
+ names = [n or '<anonymous>' for n in self.namespace]
247
+ suffix += ' in ' + '::'.join(names)
248
+ return self._StringHelper(self.__class__.__name__, suffix)
249
+
250
+
251
+ # TODO(nnorwitz): merge with Parameter in some way?
252
+ class VariableDeclaration(_GenericDeclaration):
253
+ def __init__(self, start, end, name, var_type, initial_value, namespace):
254
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
255
+ self.type = var_type
256
+ self.initial_value = initial_value
257
+
258
+ def Requires(self, node):
259
+ # TODO(nnorwitz): handle namespaces, etc.
260
+ return self.type.name == node.name
261
+
262
+ def ToString(self):
263
+ """Return a string that tries to reconstitute the variable decl."""
264
+ suffix = '%s %s' % (self.type, self.name)
265
+ if self.initial_value:
266
+ suffix += ' = ' + self.initial_value
267
+ return suffix
268
+
269
+ def __str__(self):
270
+ return self._StringHelper(self.__class__.__name__, self.ToString())
271
+
272
+
273
+ class Typedef(_GenericDeclaration):
274
+ def __init__(self, start, end, name, alias, namespace):
275
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
276
+ self.alias = alias
277
+
278
+ def IsDefinition(self):
279
+ return True
280
+
281
+ def IsExportable(self):
282
+ return True
283
+
284
+ def Requires(self, node):
285
+ # TODO(nnorwitz): handle namespaces, etc.
286
+ name = node.name
287
+ for token in self.alias:
288
+ if token is not None and name == token.name:
289
+ return True
290
+ return False
291
+
292
+ def __str__(self):
293
+ suffix = '%s, %s' % (self.name, self.alias)
294
+ return self._TypeStringHelper(suffix)
295
+
296
+
297
+ class _NestedType(_GenericDeclaration):
298
+ def __init__(self, start, end, name, fields, namespace):
299
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
300
+ self.fields = fields
301
+
302
+ def IsDefinition(self):
303
+ return True
304
+
305
+ def IsExportable(self):
306
+ return True
307
+
308
+ def __str__(self):
309
+ suffix = '%s, {%s}' % (self.name, self.fields)
310
+ return self._TypeStringHelper(suffix)
311
+
312
+
313
+ class Union(_NestedType):
314
+ pass
315
+
316
+
317
+ class Enum(_NestedType):
318
+ pass
319
+
320
+
321
+ class Class(_GenericDeclaration):
322
+ def __init__(self, start, end, name, bases, templated_types, body, namespace):
323
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
324
+ self.bases = bases
325
+ self.body = body
326
+ self.templated_types = templated_types
327
+
328
+ def IsDeclaration(self):
329
+ return self.bases is None and self.body is None
330
+
331
+ def IsDefinition(self):
332
+ return not self.IsDeclaration()
333
+
334
+ def IsExportable(self):
335
+ return not self.IsDeclaration()
336
+
337
+ def Requires(self, node):
338
+ # TODO(nnorwitz): handle namespaces, etc.
339
+ if self.bases:
340
+ for token_list in self.bases:
341
+ # TODO(nnorwitz): bases are tokens, do name comparision.
342
+ for token in token_list:
343
+ if token.name == node.name:
344
+ return True
345
+ # TODO(nnorwitz): search in body too.
346
+ return False
347
+
348
+ def __str__(self):
349
+ name = self.name
350
+ if self.templated_types:
351
+ name += '<%s>' % self.templated_types
352
+ suffix = '%s, %s, %s' % (name, self.bases, self.body)
353
+ return self._TypeStringHelper(suffix)
354
+
355
+
356
+ class Struct(Class):
357
+ pass
358
+
359
+
360
+ class Function(_GenericDeclaration):
361
+ def __init__(self, start, end, name, return_type, parameters,
362
+ modifiers, templated_types, body, namespace):
363
+ _GenericDeclaration.__init__(self, start, end, name, namespace)
364
+ converter = TypeConverter(namespace)
365
+ self.return_type = converter.CreateReturnType(return_type)
366
+ self.parameters = converter.ToParameters(parameters)
367
+ self.modifiers = modifiers
368
+ self.body = body
369
+ self.templated_types = templated_types
370
+
371
+ def IsDeclaration(self):
372
+ return self.body is None
373
+
374
+ def IsDefinition(self):
375
+ return self.body is not None
376
+
377
+ def IsExportable(self):
378
+ if self.return_type and 'static' in self.return_type.modifiers:
379
+ return False
380
+ return None not in self.namespace
381
+
382
+ def Requires(self, node):
383
+ if self.parameters:
384
+ # TODO(nnorwitz): parameters are tokens, do name comparision.
385
+ for p in self.parameters:
386
+ if p.name == node.name:
387
+ return True
388
+ # TODO(nnorwitz): search in body too.
389
+ return False
390
+
391
+ def __str__(self):
392
+ # TODO(nnorwitz): add templated_types.
393
+ suffix = ('%s %s(%s), 0x%02x, %s' %
394
+ (self.return_type, self.name, self.parameters,
395
+ self.modifiers, self.body))
396
+ return self._TypeStringHelper(suffix)
397
+
398
+
399
+ class Method(Function):
400
+ def __init__(self, start, end, name, in_class, return_type, parameters,
401
+ modifiers, templated_types, body, namespace):
402
+ Function.__init__(self, start, end, name, return_type, parameters,
403
+ modifiers, templated_types, body, namespace)
404
+ # TODO(nnorwitz): in_class could also be a namespace which can
405
+ # mess up finding functions properly.
406
+ self.in_class = in_class
407
+
408
+
409
+ class Type(_GenericDeclaration):
410
+ """Type used for any variable (eg class, primitive, struct, etc)."""
411
+
412
+ def __init__(self, start, end, name, templated_types, modifiers,
413
+ reference, pointer, array):
414
+ """
415
+ Args:
416
+ name: str name of main type
417
+ templated_types: [Class (Type?)] template type info between <>
418
+ modifiers: [str] type modifiers (keywords) eg, const, mutable, etc.
419
+ reference, pointer, array: bools
420
+ """
421
+ _GenericDeclaration.__init__(self, start, end, name, [])
422
+ self.templated_types = templated_types
423
+ if not name and modifiers:
424
+ self.name = modifiers.pop()
425
+ self.modifiers = modifiers
426
+ self.reference = reference
427
+ self.pointer = pointer
428
+ self.array = array
429
+
430
+ def __str__(self):
431
+ prefix = ''
432
+ if self.modifiers:
433
+ prefix = ' '.join(self.modifiers) + ' '
434
+ name = str(self.name)
435
+ if self.templated_types:
436
+ name += '<%s>' % self.templated_types
437
+ suffix = prefix + name
438
+ if self.reference:
439
+ suffix += '&'
440
+ if self.pointer:
441
+ suffix += '*'
442
+ if self.array:
443
+ suffix += '[]'
444
+ return self._TypeStringHelper(suffix)
445
+
446
+ # By definition, Is* are always False. A Type can only exist in
447
+ # some sort of variable declaration, parameter, or return value.
448
+ def IsDeclaration(self):
449
+ return False
450
+
451
+ def IsDefinition(self):
452
+ return False
453
+
454
+ def IsExportable(self):
455
+ return False
456
+
457
+
458
+ class TypeConverter(object):
459
+
460
+ def __init__(self, namespace_stack):
461
+ self.namespace_stack = namespace_stack
462
+
463
+ def _GetTemplateEnd(self, tokens, start):
464
+ count = 1
465
+ end = start
466
+ while 1:
467
+ token = tokens[end]
468
+ end += 1
469
+ if token.name == '<':
470
+ count += 1
471
+ elif token.name == '>':
472
+ count -= 1
473
+ if count == 0:
474
+ break
475
+ return tokens[start:end-1], end
476
+
477
+ def ToType(self, tokens):
478
+ """Convert [Token,...] to [Class(...), ] useful for base classes.
479
+ For example, code like class Foo : public Bar<x, y> { ... };
480
+ the "Bar<x, y>" portion gets converted to an AST.
481
+
482
+ Returns:
483
+ [Class(...), ...]
484
+ """
485
+ result = []
486
+ name_tokens = []
487
+ reference = pointer = array = False
488
+
489
+ def AddType(templated_types):
490
+ # Partition tokens into name and modifier tokens.
491
+ names = []
492
+ modifiers = []
493
+ for t in name_tokens:
494
+ if keywords.IsKeyword(t.name):
495
+ modifiers.append(t.name)
496
+ else:
497
+ names.append(t.name)
498
+ name = ''.join(names)
499
+ if name_tokens:
500
+ result.append(Type(name_tokens[0].start, name_tokens[-1].end,
501
+ name, templated_types, modifiers,
502
+ reference, pointer, array))
503
+ del name_tokens[:]
504
+
505
+ i = 0
506
+ end = len(tokens)
507
+ while i < end:
508
+ token = tokens[i]
509
+ if token.name == '<':
510
+ new_tokens, new_end = self._GetTemplateEnd(tokens, i+1)
511
+ AddType(self.ToType(new_tokens))
512
+ # If there is a comma after the template, we need to consume
513
+ # that here otherwise it becomes part of the name.
514
+ i = new_end
515
+ reference = pointer = array = False
516
+ elif token.name == ',':
517
+ AddType([])
518
+ reference = pointer = array = False
519
+ elif token.name == '*':
520
+ pointer = True
521
+ elif token.name == '&':
522
+ reference = True
523
+ elif token.name == '[':
524
+ pointer = True
525
+ elif token.name == ']':
526
+ pass
527
+ else:
528
+ name_tokens.append(token)
529
+ i += 1
530
+
531
+ if name_tokens:
532
+ # No '<' in the tokens, just a simple name and no template.
533
+ AddType([])
534
+ return result
535
+
536
+ def DeclarationToParts(self, parts, needs_name_removed):
537
+ name = None
538
+ default = []
539
+ if needs_name_removed:
540
+ # Handle default (initial) values properly.
541
+ for i, t in enumerate(parts):
542
+ if t.name == '=':
543
+ default = parts[i+1:]
544
+ name = parts[i-1].name
545
+ if name == ']' and parts[i-2].name == '[':
546
+ name = parts[i-3].name
547
+ i -= 1
548
+ parts = parts[:i-1]
549
+ break
550
+ else:
551
+ if parts[-1].token_type == tokenize.NAME:
552
+ name = parts.pop().name
553
+ else:
554
+ # TODO(nnorwitz): this is a hack that happens for code like
555
+ # Register(Foo<T>); where it thinks this is a function call
556
+ # but it's actually a declaration.
557
+ name = '???'
558
+ modifiers = []
559
+ type_name = []
560
+ other_tokens = []
561
+ templated_types = []
562
+ i = 0
563
+ end = len(parts)
564
+ while i < end:
565
+ p = parts[i]
566
+ if keywords.IsKeyword(p.name):
567
+ modifiers.append(p.name)
568
+ elif p.name == '<':
569
+ templated_tokens, new_end = self._GetTemplateEnd(parts, i+1)
570
+ templated_types = self.ToType(templated_tokens)
571
+ i = new_end - 1
572
+ # Don't add a spurious :: to data members being initialized.
573
+ next_index = i + 1
574
+ if next_index < end and parts[next_index].name == '::':
575
+ i += 1
576
+ elif p.name in ('[', ']', '='):
577
+ # These are handled elsewhere.
578
+ other_tokens.append(p)
579
+ elif p.name not in ('*', '&', '>'):
580
+ # Ensure that names have a space between them.
581
+ if (type_name and type_name[-1].token_type == tokenize.NAME and
582
+ p.token_type == tokenize.NAME):
583
+ type_name.append(tokenize.Token(tokenize.SYNTAX, ' ', 0, 0))
584
+ type_name.append(p)
585
+ else:
586
+ other_tokens.append(p)
587
+ i += 1
588
+ type_name = ''.join([t.name for t in type_name])
589
+ return name, type_name, templated_types, modifiers, default, other_tokens
590
+
591
+ def ToParameters(self, tokens):
592
+ if not tokens:
593
+ return []
594
+
595
+ result = []
596
+ name = type_name = ''
597
+ type_modifiers = []
598
+ pointer = reference = array = False
599
+ first_token = None
600
+ default = []
601
+
602
+ def AddParameter(end):
603
+ if default:
604
+ del default[0] # Remove flag.
605
+ parts = self.DeclarationToParts(type_modifiers, True)
606
+ (name, type_name, templated_types, modifiers,
607
+ unused_default, unused_other_tokens) = parts
608
+ parameter_type = Type(first_token.start, first_token.end,
609
+ type_name, templated_types, modifiers,
610
+ reference, pointer, array)
611
+ p = Parameter(first_token.start, end, name,
612
+ parameter_type, default)
613
+ result.append(p)
614
+
615
+ template_count = 0
616
+ for s in tokens:
617
+ if not first_token:
618
+ first_token = s
619
+ if s.name == '<':
620
+ template_count += 1
621
+ elif s.name == '>':
622
+ template_count -= 1
623
+ if template_count > 0:
624
+ type_modifiers.append(s)
625
+ continue
626
+
627
+ if s.name == ',':
628
+ AddParameter(s.start)
629
+ name = type_name = ''
630
+ type_modifiers = []
631
+ pointer = reference = array = False
632
+ first_token = None
633
+ default = []
634
+ elif s.name == '*':
635
+ pointer = True
636
+ elif s.name == '&':
637
+ reference = True
638
+ elif s.name == '[':
639
+ array = True
640
+ elif s.name == ']':
641
+ pass # Just don't add to type_modifiers.
642
+ elif s.name == '=':
643
+ # Got a default value. Add any value (None) as a flag.
644
+ default.append(None)
645
+ elif default:
646
+ default.append(s)
647
+ else:
648
+ type_modifiers.append(s)
649
+ AddParameter(tokens[-1].end)
650
+ return result
651
+
652
+ def CreateReturnType(self, return_type_seq):
653
+ if not return_type_seq:
654
+ return None
655
+ start = return_type_seq[0].start
656
+ end = return_type_seq[-1].end
657
+ _, name, templated_types, modifiers, default, other_tokens = \
658
+ self.DeclarationToParts(return_type_seq, False)
659
+ names = [n.name for n in other_tokens]
660
+ reference = '&' in names
661
+ pointer = '*' in names
662
+ array = '[' in names
663
+ return Type(start, end, name, templated_types, modifiers,
664
+ reference, pointer, array)
665
+
666
+ def GetTemplateIndices(self, names):
667
+ # names is a list of strings.
668
+ start = names.index('<')
669
+ end = len(names) - 1
670
+ while end > 0:
671
+ if names[end] == '>':
672
+ break
673
+ end -= 1
674
+ return start, end+1
675
+
676
+ class AstBuilder(object):
677
+ def __init__(self, token_stream, filename, in_class='', visibility=None,
678
+ namespace_stack=[]):
679
+ self.tokens = token_stream
680
+ self.filename = filename
681
+ # TODO(nnorwitz): use a better data structure (deque) for the queue.
682
+ # Switching directions of the "queue" improved perf by about 25%.
683
+ # Using a deque should be even better since we access from both sides.
684
+ self.token_queue = []
685
+ self.namespace_stack = namespace_stack[:]
686
+ self.in_class = in_class
687
+ if in_class is None:
688
+ self.in_class_name_only = None
689
+ else:
690
+ self.in_class_name_only = in_class.split('::')[-1]
691
+ self.visibility = visibility
692
+ self.in_function = False
693
+ self.current_token = None
694
+ # Keep the state whether we are currently handling a typedef or not.
695
+ self._handling_typedef = False
696
+
697
+ self.converter = TypeConverter(self.namespace_stack)
698
+
699
+ def HandleError(self, msg, token):
700
+ printable_queue = list(reversed(self.token_queue[-20:]))
701
+ sys.stderr.write('Got %s in %s @ %s %s\n' %
702
+ (msg, self.filename, token, printable_queue))
703
+
704
+ def Generate(self):
705
+ while 1:
706
+ token = self._GetNextToken()
707
+ if not token:
708
+ break
709
+
710
+ # Get the next token.
711
+ self.current_token = token
712
+
713
+ # Dispatch on the next token type.
714
+ if token.token_type == _INTERNAL_TOKEN:
715
+ if token.name == _NAMESPACE_POP:
716
+ self.namespace_stack.pop()
717
+ continue
718
+
719
+ try:
720
+ result = self._GenerateOne(token)
721
+ if result is not None:
722
+ yield result
723
+ except:
724
+ self.HandleError('exception', token)
725
+ raise
726
+
727
+ def _CreateVariable(self, pos_token, name, type_name, type_modifiers,
728
+ ref_pointer_name_seq, templated_types, value=None):
729
+ reference = '&' in ref_pointer_name_seq
730
+ pointer = '*' in ref_pointer_name_seq
731
+ array = '[' in ref_pointer_name_seq
732
+ var_type = Type(pos_token.start, pos_token.end, type_name,
733
+ templated_types, type_modifiers,
734
+ reference, pointer, array)
735
+ return VariableDeclaration(pos_token.start, pos_token.end,
736
+ name, var_type, value, self.namespace_stack)
737
+
738
+ def _GenerateOne(self, token):
739
+ if token.token_type == tokenize.NAME:
740
+ if (keywords.IsKeyword(token.name) and
741
+ not keywords.IsBuiltinType(token.name)):
742
+ method = getattr(self, 'handle_' + token.name)
743
+ return method()
744
+ elif token.name == self.in_class_name_only:
745
+ # The token name is the same as the class, must be a ctor if
746
+ # there is a paren. Otherwise, it's the return type.
747
+ # Peek ahead to get the next token to figure out which.
748
+ next = self._GetNextToken()
749
+ self._AddBackToken(next)
750
+ if next.token_type == tokenize.SYNTAX and next.name == '(':
751
+ return self._GetMethod([token], FUNCTION_CTOR, None, True)
752
+ # Fall through--handle like any other method.
753
+
754
+ # Handle data or function declaration/definition.
755
+ syntax = tokenize.SYNTAX
756
+ temp_tokens, last_token = \
757
+ self._GetVarTokensUpTo(syntax, '(', ';', '{', '[')
758
+ temp_tokens.insert(0, token)
759
+ if last_token.name == '(':
760
+ # If there is an assignment before the paren,
761
+ # this is an expression, not a method.
762
+ expr = bool([e for e in temp_tokens if e.name == '='])
763
+ if expr:
764
+ new_temp = self._GetTokensUpTo(tokenize.SYNTAX, ';')
765
+ temp_tokens.append(last_token)
766
+ temp_tokens.extend(new_temp)
767
+ last_token = tokenize.Token(tokenize.SYNTAX, ';', 0, 0)
768
+
769
+ if last_token.name == '[':
770
+ # Handle array, this isn't a method, unless it's an operator.
771
+ # TODO(nnorwitz): keep the size somewhere.
772
+ # unused_size = self._GetTokensUpTo(tokenize.SYNTAX, ']')
773
+ temp_tokens.append(last_token)
774
+ if temp_tokens[-2].name == 'operator':
775
+ temp_tokens.append(self._GetNextToken())
776
+ else:
777
+ temp_tokens2, last_token = \
778
+ self._GetVarTokensUpTo(tokenize.SYNTAX, ';')
779
+ temp_tokens.extend(temp_tokens2)
780
+
781
+ if last_token.name == ';':
782
+ # Handle data, this isn't a method.
783
+ parts = self.converter.DeclarationToParts(temp_tokens, True)
784
+ (name, type_name, templated_types, modifiers, default,
785
+ unused_other_tokens) = parts
786
+
787
+ t0 = temp_tokens[0]
788
+ names = [t.name for t in temp_tokens]
789
+ if templated_types:
790
+ start, end = self.converter.GetTemplateIndices(names)
791
+ names = names[:start] + names[end:]
792
+ default = ''.join([t.name for t in default])
793
+ return self._CreateVariable(t0, name, type_name, modifiers,
794
+ names, templated_types, default)
795
+ if last_token.name == '{':
796
+ self._AddBackTokens(temp_tokens[1:])
797
+ self._AddBackToken(last_token)
798
+ method_name = temp_tokens[0].name
799
+ method = getattr(self, 'handle_' + method_name, None)
800
+ if not method:
801
+ # Must be declaring a variable.
802
+ # TODO(nnorwitz): handle the declaration.
803
+ return None
804
+ return method()
805
+ return self._GetMethod(temp_tokens, 0, None, False)
806
+ elif token.token_type == tokenize.SYNTAX:
807
+ if token.name == '~' and self.in_class:
808
+ # Must be a dtor (probably not in method body).
809
+ token = self._GetNextToken()
810
+ # self.in_class can contain A::Name, but the dtor will only
811
+ # be Name. Make sure to compare against the right value.
812
+ if (token.token_type == tokenize.NAME and
813
+ token.name == self.in_class_name_only):
814
+ return self._GetMethod([token], FUNCTION_DTOR, None, True)
815
+ # TODO(nnorwitz): handle a lot more syntax.
816
+ elif token.token_type == tokenize.PREPROCESSOR:
817
+ # TODO(nnorwitz): handle more preprocessor directives.
818
+ # token starts with a #, so remove it and strip whitespace.
819
+ name = token.name[1:].lstrip()
820
+ if name.startswith('include'):
821
+ # Remove "include".
822
+ name = name[7:].strip()
823
+ assert name
824
+ # Handle #include \<newline> "header-on-second-line.h".
825
+ if name.startswith('\\'):
826
+ name = name[1:].strip()
827
+ assert name[0] in '<"', token
828
+ assert name[-1] in '>"', token
829
+ system = name[0] == '<'
830
+ filename = name[1:-1]
831
+ return Include(token.start, token.end, filename, system)
832
+ if name.startswith('define'):
833
+ # Remove "define".
834
+ name = name[6:].strip()
835
+ assert name
836
+ value = ''
837
+ for i, c in enumerate(name):
838
+ if c.isspace():
839
+ value = name[i:].lstrip()
840
+ name = name[:i]
841
+ break
842
+ return Define(token.start, token.end, name, value)
843
+ if name.startswith('if') and name[2:3].isspace():
844
+ condition = name[3:].strip()
845
+ if condition.startswith('0') or condition.startswith('(0)'):
846
+ self._SkipIf0Blocks()
847
+ return None
848
+
849
+ def _GetTokensUpTo(self, expected_token_type, expected_token):
850
+ return self._GetVarTokensUpTo(expected_token_type, expected_token)[0]
851
+
852
+ def _GetVarTokensUpTo(self, expected_token_type, *expected_tokens):
853
+ last_token = self._GetNextToken()
854
+ tokens = []
855
+ while (last_token.token_type != expected_token_type or
856
+ last_token.name not in expected_tokens):
857
+ tokens.append(last_token)
858
+ last_token = self._GetNextToken()
859
+ return tokens, last_token
860
+
861
+ # TODO(nnorwitz): remove _IgnoreUpTo() it shouldn't be necesary.
862
+ def _IgnoreUpTo(self, token_type, token):
863
+ unused_tokens = self._GetTokensUpTo(token_type, token)
864
+
865
+ def _SkipIf0Blocks(self):
866
+ count = 1
867
+ while 1:
868
+ token = self._GetNextToken()
869
+ if token.token_type != tokenize.PREPROCESSOR:
870
+ continue
871
+
872
+ name = token.name[1:].lstrip()
873
+ if name.startswith('endif'):
874
+ count -= 1
875
+ if count == 0:
876
+ break
877
+ elif name.startswith('if'):
878
+ count += 1
879
+
880
+ def _GetMatchingChar(self, open_paren, close_paren, GetNextToken=None):
881
+ if GetNextToken is None:
882
+ GetNextToken = self._GetNextToken
883
+ # Assumes the current token is open_paren and we will consume
884
+ # and return up to the close_paren.
885
+ count = 1
886
+ token = GetNextToken()
887
+ while 1:
888
+ if token.token_type == tokenize.SYNTAX:
889
+ if token.name == open_paren:
890
+ count += 1
891
+ elif token.name == close_paren:
892
+ count -= 1
893
+ if count == 0:
894
+ break
895
+ yield token
896
+ token = GetNextToken()
897
+ yield token
898
+
899
+ def _GetParameters(self):
900
+ return self._GetMatchingChar('(', ')')
901
+
902
+ def GetScope(self):
903
+ return self._GetMatchingChar('{', '}')
904
+
905
+ def _GetNextToken(self):
906
+ if self.token_queue:
907
+ return self.token_queue.pop()
908
+ return next(self.tokens)
909
+
910
+ def _AddBackToken(self, token):
911
+ if token.whence == tokenize.WHENCE_STREAM:
912
+ token.whence = tokenize.WHENCE_QUEUE
913
+ self.token_queue.insert(0, token)
914
+ else:
915
+ assert token.whence == tokenize.WHENCE_QUEUE, token
916
+ self.token_queue.append(token)
917
+
918
+ def _AddBackTokens(self, tokens):
919
+ if tokens:
920
+ if tokens[-1].whence == tokenize.WHENCE_STREAM:
921
+ for token in tokens:
922
+ token.whence = tokenize.WHENCE_QUEUE
923
+ self.token_queue[:0] = reversed(tokens)
924
+ else:
925
+ assert tokens[-1].whence == tokenize.WHENCE_QUEUE, tokens
926
+ self.token_queue.extend(reversed(tokens))
927
+
928
+ def GetName(self, seq=None):
929
+ """Returns ([tokens], next_token_info)."""
930
+ GetNextToken = self._GetNextToken
931
+ if seq is not None:
932
+ it = iter(seq)
933
+ GetNextToken = lambda: next(it)
934
+ next_token = GetNextToken()
935
+ tokens = []
936
+ last_token_was_name = False
937
+ while (next_token.token_type == tokenize.NAME or
938
+ (next_token.token_type == tokenize.SYNTAX and
939
+ next_token.name in ('::', '<'))):
940
+ # Two NAMEs in a row means the identifier should terminate.
941
+ # It's probably some sort of variable declaration.
942
+ if last_token_was_name and next_token.token_type == tokenize.NAME:
943
+ break
944
+ last_token_was_name = next_token.token_type == tokenize.NAME
945
+ tokens.append(next_token)
946
+ # Handle templated names.
947
+ if next_token.name == '<':
948
+ tokens.extend(self._GetMatchingChar('<', '>', GetNextToken))
949
+ last_token_was_name = True
950
+ next_token = GetNextToken()
951
+ return tokens, next_token
952
+
953
+ def GetMethod(self, modifiers, templated_types):
954
+ return_type_and_name = self._GetTokensUpTo(tokenize.SYNTAX, '(')
955
+ assert len(return_type_and_name) >= 1
956
+ return self._GetMethod(return_type_and_name, modifiers, templated_types,
957
+ False)
958
+
959
+ def _GetMethod(self, return_type_and_name, modifiers, templated_types,
960
+ get_paren):
961
+ template_portion = None
962
+ if get_paren:
963
+ token = self._GetNextToken()
964
+ assert token.token_type == tokenize.SYNTAX, token
965
+ if token.name == '<':
966
+ # Handle templatized dtors.
967
+ template_portion = [token]
968
+ template_portion.extend(self._GetMatchingChar('<', '>'))
969
+ token = self._GetNextToken()
970
+ assert token.token_type == tokenize.SYNTAX, token
971
+ assert token.name == '(', token
972
+
973
+ name = return_type_and_name.pop()
974
+ # Handle templatized ctors.
975
+ if name.name == '>':
976
+ index = 1
977
+ while return_type_and_name[index].name != '<':
978
+ index += 1
979
+ template_portion = return_type_and_name[index:] + [name]
980
+ del return_type_and_name[index:]
981
+ name = return_type_and_name.pop()
982
+ elif name.name == ']':
983
+ rt = return_type_and_name
984
+ assert rt[-1].name == '[', return_type_and_name
985
+ assert rt[-2].name == 'operator', return_type_and_name
986
+ name_seq = return_type_and_name[-2:]
987
+ del return_type_and_name[-2:]
988
+ name = tokenize.Token(tokenize.NAME, 'operator[]',
989
+ name_seq[0].start, name.end)
990
+ # Get the open paren so _GetParameters() below works.
991
+ unused_open_paren = self._GetNextToken()
992
+
993
+ # TODO(nnorwitz): store template_portion.
994
+ return_type = return_type_and_name
995
+ indices = name
996
+ if return_type:
997
+ indices = return_type[0]
998
+
999
+ # Force ctor for templatized ctors.
1000
+ if name.name == self.in_class and not modifiers:
1001
+ modifiers |= FUNCTION_CTOR
1002
+ parameters = list(self._GetParameters())
1003
+ del parameters[-1] # Remove trailing ')'.
1004
+
1005
+ # Handling operator() is especially weird.
1006
+ if name.name == 'operator' and not parameters:
1007
+ token = self._GetNextToken()
1008
+ assert token.name == '(', token
1009
+ parameters = list(self._GetParameters())
1010
+ del parameters[-1] # Remove trailing ')'.
1011
+
1012
+ token = self._GetNextToken()
1013
+ while token.token_type == tokenize.NAME:
1014
+ modifier_token = token
1015
+ token = self._GetNextToken()
1016
+ if modifier_token.name == 'const':
1017
+ modifiers |= FUNCTION_CONST
1018
+ elif modifier_token.name == '__attribute__':
1019
+ # TODO(nnorwitz): handle more __attribute__ details.
1020
+ modifiers |= FUNCTION_ATTRIBUTE
1021
+ assert token.name == '(', token
1022
+ # Consume everything between the (parens).
1023
+ unused_tokens = list(self._GetMatchingChar('(', ')'))
1024
+ token = self._GetNextToken()
1025
+ elif modifier_token.name == 'throw':
1026
+ modifiers |= FUNCTION_THROW
1027
+ assert token.name == '(', token
1028
+ # Consume everything between the (parens).
1029
+ unused_tokens = list(self._GetMatchingChar('(', ')'))
1030
+ token = self._GetNextToken()
1031
+ elif modifier_token.name == 'override':
1032
+ modifiers |= FUNCTION_OVERRIDE
1033
+ elif modifier_token.name == modifier_token.name.upper():
1034
+ # HACK(nnorwitz): assume that all upper-case names
1035
+ # are some macro we aren't expanding.
1036
+ modifiers |= FUNCTION_UNKNOWN_ANNOTATION
1037
+ else:
1038
+ self.HandleError('unexpected token', modifier_token)
1039
+
1040
+ assert token.token_type == tokenize.SYNTAX, token
1041
+ # Handle ctor initializers.
1042
+ if token.name == ':':
1043
+ # TODO(nnorwitz): anything else to handle for initializer list?
1044
+ while token.name != ';' and token.name != '{':
1045
+ token = self._GetNextToken()
1046
+
1047
+ # Handle pointer to functions that are really data but look
1048
+ # like method declarations.
1049
+ if token.name == '(':
1050
+ if parameters[0].name == '*':
1051
+ # name contains the return type.
1052
+ name = parameters.pop()
1053
+ # parameters contains the name of the data.
1054
+ modifiers = [p.name for p in parameters]
1055
+ # Already at the ( to open the parameter list.
1056
+ function_parameters = list(self._GetMatchingChar('(', ')'))
1057
+ del function_parameters[-1] # Remove trailing ')'.
1058
+ # TODO(nnorwitz): store the function_parameters.
1059
+ token = self._GetNextToken()
1060
+ assert token.token_type == tokenize.SYNTAX, token
1061
+ assert token.name == ';', token
1062
+ return self._CreateVariable(indices, name.name, indices.name,
1063
+ modifiers, '', None)
1064
+ # At this point, we got something like:
1065
+ # return_type (type::*name_)(params);
1066
+ # This is a data member called name_ that is a function pointer.
1067
+ # With this code: void (sq_type::*field_)(string&);
1068
+ # We get: name=void return_type=[] parameters=sq_type ... field_
1069
+ # TODO(nnorwitz): is return_type always empty?
1070
+ # TODO(nnorwitz): this isn't even close to being correct.
1071
+ # Just put in something so we don't crash and can move on.
1072
+ real_name = parameters[-1]
1073
+ modifiers = [p.name for p in self._GetParameters()]
1074
+ del modifiers[-1] # Remove trailing ')'.
1075
+ return self._CreateVariable(indices, real_name.name, indices.name,
1076
+ modifiers, '', None)
1077
+
1078
+ if token.name == '{':
1079
+ body = list(self.GetScope())
1080
+ del body[-1] # Remove trailing '}'.
1081
+ else:
1082
+ body = None
1083
+ if token.name == '=':
1084
+ token = self._GetNextToken()
1085
+
1086
+ if token.name == 'default' or token.name == 'delete':
1087
+ # Ignore explicitly defaulted and deleted special members
1088
+ # in C++11.
1089
+ token = self._GetNextToken()
1090
+ else:
1091
+ # Handle pure-virtual declarations.
1092
+ assert token.token_type == tokenize.CONSTANT, token
1093
+ assert token.name == '0', token
1094
+ modifiers |= FUNCTION_PURE_VIRTUAL
1095
+ token = self._GetNextToken()
1096
+
1097
+ if token.name == '[':
1098
+ # TODO(nnorwitz): store tokens and improve parsing.
1099
+ # template <typename T, size_t N> char (&ASH(T (&seq)[N]))[N];
1100
+ tokens = list(self._GetMatchingChar('[', ']'))
1101
+ token = self._GetNextToken()
1102
+
1103
+ assert token.name == ';', (token, return_type_and_name, parameters)
1104
+
1105
+ # Looks like we got a method, not a function.
1106
+ if len(return_type) > 2 and return_type[-1].name == '::':
1107
+ return_type, in_class = \
1108
+ self._GetReturnTypeAndClassName(return_type)
1109
+ return Method(indices.start, indices.end, name.name, in_class,
1110
+ return_type, parameters, modifiers, templated_types,
1111
+ body, self.namespace_stack)
1112
+ return Function(indices.start, indices.end, name.name, return_type,
1113
+ parameters, modifiers, templated_types, body,
1114
+ self.namespace_stack)
1115
+
1116
+ def _GetReturnTypeAndClassName(self, token_seq):
1117
+ # Splitting the return type from the class name in a method
1118
+ # can be tricky. For example, Return::Type::Is::Hard::To::Find().
1119
+ # Where is the return type and where is the class name?
1120
+ # The heuristic used is to pull the last name as the class name.
1121
+ # This includes all the templated type info.
1122
+ # TODO(nnorwitz): if there is only One name like in the
1123
+ # example above, punt and assume the last bit is the class name.
1124
+
1125
+ # Ignore a :: prefix, if exists so we can find the first real name.
1126
+ i = 0
1127
+ if token_seq[0].name == '::':
1128
+ i = 1
1129
+ # Ignore a :: suffix, if exists.
1130
+ end = len(token_seq) - 1
1131
+ if token_seq[end-1].name == '::':
1132
+ end -= 1
1133
+
1134
+ # Make a copy of the sequence so we can append a sentinel
1135
+ # value. This is required for GetName will has to have some
1136
+ # terminating condition beyond the last name.
1137
+ seq_copy = token_seq[i:end]
1138
+ seq_copy.append(tokenize.Token(tokenize.SYNTAX, '', 0, 0))
1139
+ names = []
1140
+ while i < end:
1141
+ # Iterate through the sequence parsing out each name.
1142
+ new_name, next = self.GetName(seq_copy[i:])
1143
+ assert new_name, 'Got empty new_name, next=%s' % next
1144
+ # We got a pointer or ref. Add it to the name.
1145
+ if next and next.token_type == tokenize.SYNTAX:
1146
+ new_name.append(next)
1147
+ names.append(new_name)
1148
+ i += len(new_name)
1149
+
1150
+ # Now that we have the names, it's time to undo what we did.
1151
+
1152
+ # Remove the sentinel value.
1153
+ names[-1].pop()
1154
+ # Flatten the token sequence for the return type.
1155
+ return_type = [e for seq in names[:-1] for e in seq]
1156
+ # The class name is the last name.
1157
+ class_name = names[-1]
1158
+ return return_type, class_name
1159
+
1160
+ def handle_bool(self):
1161
+ pass
1162
+
1163
+ def handle_char(self):
1164
+ pass
1165
+
1166
+ def handle_int(self):
1167
+ pass
1168
+
1169
+ def handle_long(self):
1170
+ pass
1171
+
1172
+ def handle_short(self):
1173
+ pass
1174
+
1175
+ def handle_double(self):
1176
+ pass
1177
+
1178
+ def handle_float(self):
1179
+ pass
1180
+
1181
+ def handle_void(self):
1182
+ pass
1183
+
1184
+ def handle_wchar_t(self):
1185
+ pass
1186
+
1187
+ def handle_unsigned(self):
1188
+ pass
1189
+
1190
+ def handle_signed(self):
1191
+ pass
1192
+
1193
+ def _GetNestedType(self, ctor):
1194
+ name = None
1195
+ name_tokens, token = self.GetName()
1196
+ if name_tokens:
1197
+ name = ''.join([t.name for t in name_tokens])
1198
+
1199
+ # Handle forward declarations.
1200
+ if token.token_type == tokenize.SYNTAX and token.name == ';':
1201
+ return ctor(token.start, token.end, name, None,
1202
+ self.namespace_stack)
1203
+
1204
+ if token.token_type == tokenize.NAME and self._handling_typedef:
1205
+ self._AddBackToken(token)
1206
+ return ctor(token.start, token.end, name, None,
1207
+ self.namespace_stack)
1208
+
1209
+ # Must be the type declaration.
1210
+ fields = list(self._GetMatchingChar('{', '}'))
1211
+ del fields[-1] # Remove trailing '}'.
1212
+ if token.token_type == tokenize.SYNTAX and token.name == '{':
1213
+ next = self._GetNextToken()
1214
+ new_type = ctor(token.start, token.end, name, fields,
1215
+ self.namespace_stack)
1216
+ # A name means this is an anonymous type and the name
1217
+ # is the variable declaration.
1218
+ if next.token_type != tokenize.NAME:
1219
+ return new_type
1220
+ name = new_type
1221
+ token = next
1222
+
1223
+ # Must be variable declaration using the type prefixed with keyword.
1224
+ assert token.token_type == tokenize.NAME, token
1225
+ return self._CreateVariable(token, token.name, name, [], '', None)
1226
+
1227
+ def handle_struct(self):
1228
+ # Special case the handling typedef/aliasing of structs here.
1229
+ # It would be a pain to handle in the class code.
1230
+ name_tokens, var_token = self.GetName()
1231
+ if name_tokens:
1232
+ next_token = self._GetNextToken()
1233
+ is_syntax = (var_token.token_type == tokenize.SYNTAX and
1234
+ var_token.name[0] in '*&')
1235
+ is_variable = (var_token.token_type == tokenize.NAME and
1236
+ next_token.name == ';')
1237
+ variable = var_token
1238
+ if is_syntax and not is_variable:
1239
+ variable = next_token
1240
+ temp = self._GetNextToken()
1241
+ if temp.token_type == tokenize.SYNTAX and temp.name == '(':
1242
+ # Handle methods declared to return a struct.
1243
+ t0 = name_tokens[0]
1244
+ struct = tokenize.Token(tokenize.NAME, 'struct',
1245
+ t0.start-7, t0.start-2)
1246
+ type_and_name = [struct]
1247
+ type_and_name.extend(name_tokens)
1248
+ type_and_name.extend((var_token, next_token))
1249
+ return self._GetMethod(type_and_name, 0, None, False)
1250
+ assert temp.name == ';', (temp, name_tokens, var_token)
1251
+ if is_syntax or (is_variable and not self._handling_typedef):
1252
+ modifiers = ['struct']
1253
+ type_name = ''.join([t.name for t in name_tokens])
1254
+ position = name_tokens[0]
1255
+ return self._CreateVariable(position, variable.name, type_name,
1256
+ modifiers, var_token.name, None)
1257
+ name_tokens.extend((var_token, next_token))
1258
+ self._AddBackTokens(name_tokens)
1259
+ else:
1260
+ self._AddBackToken(var_token)
1261
+ return self._GetClass(Struct, VISIBILITY_PUBLIC, None)
1262
+
1263
+ def handle_union(self):
1264
+ return self._GetNestedType(Union)
1265
+
1266
+ def handle_enum(self):
1267
+ return self._GetNestedType(Enum)
1268
+
1269
+ def handle_auto(self):
1270
+ # TODO(nnorwitz): warn about using auto? Probably not since it
1271
+ # will be reclaimed and useful for C++0x.
1272
+ pass
1273
+
1274
+ def handle_register(self):
1275
+ pass
1276
+
1277
+ def handle_const(self):
1278
+ pass
1279
+
1280
+ def handle_inline(self):
1281
+ pass
1282
+
1283
+ def handle_extern(self):
1284
+ pass
1285
+
1286
+ def handle_static(self):
1287
+ pass
1288
+
1289
+ def handle_virtual(self):
1290
+ # What follows must be a method.
1291
+ token = token2 = self._GetNextToken()
1292
+ if token.name == 'inline':
1293
+ # HACK(nnorwitz): handle inline dtors by ignoring 'inline'.
1294
+ token2 = self._GetNextToken()
1295
+ if token2.token_type == tokenize.SYNTAX and token2.name == '~':
1296
+ return self.GetMethod(FUNCTION_VIRTUAL + FUNCTION_DTOR, None)
1297
+ assert token.token_type == tokenize.NAME or token.name == '::', token
1298
+ return_type_and_name = self._GetTokensUpTo(tokenize.SYNTAX, '(') # )
1299
+ return_type_and_name.insert(0, token)
1300
+ if token2 is not token:
1301
+ return_type_and_name.insert(1, token2)
1302
+ return self._GetMethod(return_type_and_name, FUNCTION_VIRTUAL,
1303
+ None, False)
1304
+
1305
+ def handle_volatile(self):
1306
+ pass
1307
+
1308
+ def handle_mutable(self):
1309
+ pass
1310
+
1311
+ def handle_public(self):
1312
+ assert self.in_class
1313
+ self.visibility = VISIBILITY_PUBLIC
1314
+
1315
+ def handle_protected(self):
1316
+ assert self.in_class
1317
+ self.visibility = VISIBILITY_PROTECTED
1318
+
1319
+ def handle_private(self):
1320
+ assert self.in_class
1321
+ self.visibility = VISIBILITY_PRIVATE
1322
+
1323
+ def handle_friend(self):
1324
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1325
+ assert tokens
1326
+ t0 = tokens[0]
1327
+ return Friend(t0.start, t0.end, tokens, self.namespace_stack)
1328
+
1329
+ def handle_static_cast(self):
1330
+ pass
1331
+
1332
+ def handle_const_cast(self):
1333
+ pass
1334
+
1335
+ def handle_dynamic_cast(self):
1336
+ pass
1337
+
1338
+ def handle_reinterpret_cast(self):
1339
+ pass
1340
+
1341
+ def handle_new(self):
1342
+ pass
1343
+
1344
+ def handle_delete(self):
1345
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1346
+ assert tokens
1347
+ return Delete(tokens[0].start, tokens[0].end, tokens)
1348
+
1349
+ def handle_typedef(self):
1350
+ token = self._GetNextToken()
1351
+ if (token.token_type == tokenize.NAME and
1352
+ keywords.IsKeyword(token.name)):
1353
+ # Token must be struct/enum/union/class.
1354
+ method = getattr(self, 'handle_' + token.name)
1355
+ self._handling_typedef = True
1356
+ tokens = [method()]
1357
+ self._handling_typedef = False
1358
+ else:
1359
+ tokens = [token]
1360
+
1361
+ # Get the remainder of the typedef up to the semi-colon.
1362
+ tokens.extend(self._GetTokensUpTo(tokenize.SYNTAX, ';'))
1363
+
1364
+ # TODO(nnorwitz): clean all this up.
1365
+ assert tokens
1366
+ name = tokens.pop()
1367
+ indices = name
1368
+ if tokens:
1369
+ indices = tokens[0]
1370
+ if not indices:
1371
+ indices = token
1372
+ if name.name == ')':
1373
+ # HACK(nnorwitz): Handle pointers to functions "properly".
1374
+ if (len(tokens) >= 4 and
1375
+ tokens[1].name == '(' and tokens[2].name == '*'):
1376
+ tokens.append(name)
1377
+ name = tokens[3]
1378
+ elif name.name == ']':
1379
+ # HACK(nnorwitz): Handle arrays properly.
1380
+ if len(tokens) >= 2:
1381
+ tokens.append(name)
1382
+ name = tokens[1]
1383
+ new_type = tokens
1384
+ if tokens and isinstance(tokens[0], tokenize.Token):
1385
+ new_type = self.converter.ToType(tokens)[0]
1386
+ return Typedef(indices.start, indices.end, name.name,
1387
+ new_type, self.namespace_stack)
1388
+
1389
+ def handle_typeid(self):
1390
+ pass # Not needed yet.
1391
+
1392
+ def handle_typename(self):
1393
+ pass # Not needed yet.
1394
+
1395
+ def _GetTemplatedTypes(self):
1396
+ result = {}
1397
+ tokens = list(self._GetMatchingChar('<', '>'))
1398
+ len_tokens = len(tokens) - 1 # Ignore trailing '>'.
1399
+ i = 0
1400
+ while i < len_tokens:
1401
+ key = tokens[i].name
1402
+ i += 1
1403
+ if keywords.IsKeyword(key) or key == ',':
1404
+ continue
1405
+ type_name = default = None
1406
+ if i < len_tokens:
1407
+ i += 1
1408
+ if tokens[i-1].name == '=':
1409
+ assert i < len_tokens, '%s %s' % (i, tokens)
1410
+ default, unused_next_token = self.GetName(tokens[i:])
1411
+ i += len(default)
1412
+ else:
1413
+ if tokens[i-1].name != ',':
1414
+ # We got something like: Type variable.
1415
+ # Re-adjust the key (variable) and type_name (Type).
1416
+ key = tokens[i-1].name
1417
+ type_name = tokens[i-2]
1418
+
1419
+ result[key] = (type_name, default)
1420
+ return result
1421
+
1422
+ def handle_template(self):
1423
+ token = self._GetNextToken()
1424
+ assert token.token_type == tokenize.SYNTAX, token
1425
+ assert token.name == '<', token
1426
+ templated_types = self._GetTemplatedTypes()
1427
+ # TODO(nnorwitz): for now, just ignore the template params.
1428
+ token = self._GetNextToken()
1429
+ if token.token_type == tokenize.NAME:
1430
+ if token.name == 'class':
1431
+ return self._GetClass(Class, VISIBILITY_PRIVATE, templated_types)
1432
+ elif token.name == 'struct':
1433
+ return self._GetClass(Struct, VISIBILITY_PUBLIC, templated_types)
1434
+ elif token.name == 'friend':
1435
+ return self.handle_friend()
1436
+ self._AddBackToken(token)
1437
+ tokens, last = self._GetVarTokensUpTo(tokenize.SYNTAX, '(', ';')
1438
+ tokens.append(last)
1439
+ self._AddBackTokens(tokens)
1440
+ if last.name == '(':
1441
+ return self.GetMethod(FUNCTION_NONE, templated_types)
1442
+ # Must be a variable definition.
1443
+ return None
1444
+
1445
+ def handle_true(self):
1446
+ pass # Nothing to do.
1447
+
1448
+ def handle_false(self):
1449
+ pass # Nothing to do.
1450
+
1451
+ def handle_asm(self):
1452
+ pass # Not needed yet.
1453
+
1454
+ def handle_class(self):
1455
+ return self._GetClass(Class, VISIBILITY_PRIVATE, None)
1456
+
1457
+ def _GetBases(self):
1458
+ # Get base classes.
1459
+ bases = []
1460
+ while 1:
1461
+ token = self._GetNextToken()
1462
+ assert token.token_type == tokenize.NAME, token
1463
+ # TODO(nnorwitz): store kind of inheritance...maybe.
1464
+ if token.name not in ('public', 'protected', 'private'):
1465
+ # If inheritance type is not specified, it is private.
1466
+ # Just put the token back so we can form a name.
1467
+ # TODO(nnorwitz): it would be good to warn about this.
1468
+ self._AddBackToken(token)
1469
+ else:
1470
+ # Check for virtual inheritance.
1471
+ token = self._GetNextToken()
1472
+ if token.name != 'virtual':
1473
+ self._AddBackToken(token)
1474
+ else:
1475
+ # TODO(nnorwitz): store that we got virtual for this base.
1476
+ pass
1477
+ base, next_token = self.GetName()
1478
+ bases_ast = self.converter.ToType(base)
1479
+ assert len(bases_ast) == 1, bases_ast
1480
+ bases.append(bases_ast[0])
1481
+ assert next_token.token_type == tokenize.SYNTAX, next_token
1482
+ if next_token.name == '{':
1483
+ token = next_token
1484
+ break
1485
+ # Support multiple inheritance.
1486
+ assert next_token.name == ',', next_token
1487
+ return bases, token
1488
+
1489
+ def _GetClass(self, class_type, visibility, templated_types):
1490
+ class_name = None
1491
+ class_token = self._GetNextToken()
1492
+ if class_token.token_type != tokenize.NAME:
1493
+ assert class_token.token_type == tokenize.SYNTAX, class_token
1494
+ token = class_token
1495
+ else:
1496
+ # Skip any macro (e.g. storage class specifiers) after the
1497
+ # 'class' keyword.
1498
+ next_token = self._GetNextToken()
1499
+ if next_token.token_type == tokenize.NAME:
1500
+ self._AddBackToken(next_token)
1501
+ else:
1502
+ self._AddBackTokens([class_token, next_token])
1503
+ name_tokens, token = self.GetName()
1504
+ class_name = ''.join([t.name for t in name_tokens])
1505
+ bases = None
1506
+ if token.token_type == tokenize.SYNTAX:
1507
+ if token.name == ';':
1508
+ # Forward declaration.
1509
+ return class_type(class_token.start, class_token.end,
1510
+ class_name, None, templated_types, None,
1511
+ self.namespace_stack)
1512
+ if token.name in '*&':
1513
+ # Inline forward declaration. Could be method or data.
1514
+ name_token = self._GetNextToken()
1515
+ next_token = self._GetNextToken()
1516
+ if next_token.name == ';':
1517
+ # Handle data
1518
+ modifiers = ['class']
1519
+ return self._CreateVariable(class_token, name_token.name,
1520
+ class_name,
1521
+ modifiers, token.name, None)
1522
+ else:
1523
+ # Assume this is a method.
1524
+ tokens = (class_token, token, name_token, next_token)
1525
+ self._AddBackTokens(tokens)
1526
+ return self.GetMethod(FUNCTION_NONE, None)
1527
+ if token.name == ':':
1528
+ bases, token = self._GetBases()
1529
+
1530
+ body = None
1531
+ if token.token_type == tokenize.SYNTAX and token.name == '{':
1532
+ assert token.token_type == tokenize.SYNTAX, token
1533
+ assert token.name == '{', token
1534
+
1535
+ ast = AstBuilder(self.GetScope(), self.filename, class_name,
1536
+ visibility, self.namespace_stack)
1537
+ body = list(ast.Generate())
1538
+
1539
+ if not self._handling_typedef:
1540
+ token = self._GetNextToken()
1541
+ if token.token_type != tokenize.NAME:
1542
+ assert token.token_type == tokenize.SYNTAX, token
1543
+ assert token.name == ';', token
1544
+ else:
1545
+ new_class = class_type(class_token.start, class_token.end,
1546
+ class_name, bases, None,
1547
+ body, self.namespace_stack)
1548
+
1549
+ modifiers = []
1550
+ return self._CreateVariable(class_token,
1551
+ token.name, new_class,
1552
+ modifiers, token.name, None)
1553
+ else:
1554
+ if not self._handling_typedef:
1555
+ self.HandleError('non-typedef token', token)
1556
+ self._AddBackToken(token)
1557
+
1558
+ return class_type(class_token.start, class_token.end, class_name,
1559
+ bases, templated_types, body, self.namespace_stack)
1560
+
1561
+ def handle_namespace(self):
1562
+ token = self._GetNextToken()
1563
+ # Support anonymous namespaces.
1564
+ name = None
1565
+ if token.token_type == tokenize.NAME:
1566
+ name = token.name
1567
+ token = self._GetNextToken()
1568
+ self.namespace_stack.append(name)
1569
+ assert token.token_type == tokenize.SYNTAX, token
1570
+ # Create an internal token that denotes when the namespace is complete.
1571
+ internal_token = tokenize.Token(_INTERNAL_TOKEN, _NAMESPACE_POP,
1572
+ None, None)
1573
+ internal_token.whence = token.whence
1574
+ if token.name == '=':
1575
+ # TODO(nnorwitz): handle aliasing namespaces.
1576
+ name, next_token = self.GetName()
1577
+ assert next_token.name == ';', next_token
1578
+ self._AddBackToken(internal_token)
1579
+ else:
1580
+ assert token.name == '{', token
1581
+ tokens = list(self.GetScope())
1582
+ # Replace the trailing } with the internal namespace pop token.
1583
+ tokens[-1] = internal_token
1584
+ # Handle namespace with nothing in it.
1585
+ self._AddBackTokens(tokens)
1586
+ return None
1587
+
1588
+ def handle_using(self):
1589
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1590
+ assert tokens
1591
+ return Using(tokens[0].start, tokens[0].end, tokens)
1592
+
1593
+ def handle_explicit(self):
1594
+ assert self.in_class
1595
+ # Nothing much to do.
1596
+ # TODO(nnorwitz): maybe verify the method name == class name.
1597
+ # This must be a ctor.
1598
+ return self.GetMethod(FUNCTION_CTOR, None)
1599
+
1600
+ def handle_this(self):
1601
+ pass # Nothing to do.
1602
+
1603
+ def handle_operator(self):
1604
+ # Pull off the next token(s?) and make that part of the method name.
1605
+ pass
1606
+
1607
+ def handle_sizeof(self):
1608
+ pass
1609
+
1610
+ def handle_case(self):
1611
+ pass
1612
+
1613
+ def handle_switch(self):
1614
+ pass
1615
+
1616
+ def handle_default(self):
1617
+ token = self._GetNextToken()
1618
+ assert token.token_type == tokenize.SYNTAX
1619
+ assert token.name == ':'
1620
+
1621
+ def handle_if(self):
1622
+ pass
1623
+
1624
+ def handle_else(self):
1625
+ pass
1626
+
1627
+ def handle_return(self):
1628
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1629
+ if not tokens:
1630
+ return Return(self.current_token.start, self.current_token.end, None)
1631
+ return Return(tokens[0].start, tokens[0].end, tokens)
1632
+
1633
+ def handle_goto(self):
1634
+ tokens = self._GetTokensUpTo(tokenize.SYNTAX, ';')
1635
+ assert len(tokens) == 1, str(tokens)
1636
+ return Goto(tokens[0].start, tokens[0].end, tokens[0].name)
1637
+
1638
+ def handle_try(self):
1639
+ pass # Not needed yet.
1640
+
1641
+ def handle_catch(self):
1642
+ pass # Not needed yet.
1643
+
1644
+ def handle_throw(self):
1645
+ pass # Not needed yet.
1646
+
1647
+ def handle_while(self):
1648
+ pass
1649
+
1650
+ def handle_do(self):
1651
+ pass
1652
+
1653
+ def handle_for(self):
1654
+ pass
1655
+
1656
+ def handle_break(self):
1657
+ self._IgnoreUpTo(tokenize.SYNTAX, ';')
1658
+
1659
+ def handle_continue(self):
1660
+ self._IgnoreUpTo(tokenize.SYNTAX, ';')
1661
+
1662
+
1663
+ def BuilderFromSource(source, filename):
1664
+ """Utility method that returns an AstBuilder from source code.
1665
+
1666
+ Args:
1667
+ source: 'C++ source code'
1668
+ filename: 'file1'
1669
+
1670
+ Returns:
1671
+ AstBuilder
1672
+ """
1673
+ return AstBuilder(tokenize.GetTokens(source), filename)
1674
+
1675
+
1676
+ def PrintIndentifiers(filename, should_print):
1677
+ """Prints all identifiers for a C++ source file.
1678
+
1679
+ Args:
1680
+ filename: 'file1'
1681
+ should_print: predicate with signature: bool Function(token)
1682
+ """
1683
+ source = utils.ReadFile(filename, False)
1684
+ if source is None:
1685
+ sys.stderr.write('Unable to find: %s\n' % filename)
1686
+ return
1687
+
1688
+ #print('Processing %s' % actual_filename)
1689
+ builder = BuilderFromSource(source, filename)
1690
+ try:
1691
+ for node in builder.Generate():
1692
+ if should_print(node):
1693
+ print(node.name)
1694
+ except KeyboardInterrupt:
1695
+ return
1696
+ except:
1697
+ pass
1698
+
1699
+
1700
+ def PrintAllIndentifiers(filenames, should_print):
1701
+ """Prints all identifiers for each C++ source file in filenames.
1702
+
1703
+ Args:
1704
+ filenames: ['file1', 'file2', ...]
1705
+ should_print: predicate with signature: bool Function(token)
1706
+ """
1707
+ for path in filenames:
1708
+ PrintIndentifiers(path, should_print)
1709
+
1710
+
1711
+ def main(argv):
1712
+ for filename in argv[1:]:
1713
+ source = utils.ReadFile(filename)
1714
+ if source is None:
1715
+ continue
1716
+
1717
+ print('Processing %s' % filename)
1718
+ builder = BuilderFromSource(source, filename)
1719
+ try:
1720
+ entire_ast = filter(None, builder.Generate())
1721
+ except KeyboardInterrupt:
1722
+ return
1723
+ except:
1724
+ # Already printed a warning, print the traceback and continue.
1725
+ traceback.print_exc()
1726
+ else:
1727
+ if utils.DEBUG:
1728
+ for ast in entire_ast:
1729
+ print(ast)
1730
+
1731
+
1732
+ if __name__ == '__main__':
1733
+ main(sys.argv)