ruby-lint 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. data.tar.gz.asc +14 -14
  2. data/.gitignore +1 -2
  3. data/.rubocop.yml +59 -0
  4. data/.travis.yml +3 -7
  5. data/.yardopts +2 -2
  6. data/Gemfile +4 -0
  7. data/MANIFEST +103 -67
  8. data/README.md +13 -31
  9. data/Rakefile +1 -6
  10. data/checksum/ruby-lint-0.0.3.gem.sha512 +1 -0
  11. data/debug/memory_usage.rb +14 -0
  12. data/debug/profile.rb +18 -0
  13. data/doc/architecture.md +14 -18
  14. data/doc/changelog.md +29 -0
  15. data/doc/code_analysis.md +12 -12
  16. data/doc/configuration.md +21 -50
  17. data/doc/graphviz/flow.dot +1 -1
  18. data/doc/images/flow.png +0 -0
  19. data/lib/ruby-lint.rb +33 -19
  20. data/lib/ruby-lint/analysis/argument_amount.rb +84 -0
  21. data/lib/ruby-lint/analysis/base.rb +132 -0
  22. data/lib/ruby-lint/analysis/confusing_variables.rb +26 -0
  23. data/lib/ruby-lint/analysis/pedantics.rb +36 -0
  24. data/lib/ruby-lint/analysis/shadowing_variables.rb +47 -0
  25. data/lib/ruby-lint/analysis/undefined_methods.rb +91 -0
  26. data/lib/ruby-lint/analysis/undefined_variables.rb +46 -0
  27. data/lib/ruby-lint/analysis/unused_variables.rb +49 -0
  28. data/lib/ruby-lint/ast/builder.rb +17 -0
  29. data/lib/ruby-lint/ast/node.rb +39 -0
  30. data/lib/ruby-lint/cli.rb +0 -19
  31. data/lib/ruby-lint/cli/analyze.rb +54 -28
  32. data/lib/ruby-lint/cli/ast.rb +21 -6
  33. data/lib/ruby-lint/cli/base.rb +0 -23
  34. data/lib/ruby-lint/configuration.rb +112 -42
  35. data/lib/ruby-lint/constant_loader.rb +10 -28
  36. data/lib/ruby-lint/default_names.rb +19 -0
  37. data/lib/ruby-lint/definition/constant_proxy.rb +56 -0
  38. data/lib/ruby-lint/definition/ruby_method.rb +21 -143
  39. data/lib/ruby-lint/definition/ruby_object.rb +142 -246
  40. data/lib/ruby-lint/definition_builder/base.rb +43 -0
  41. data/lib/ruby-lint/definition_builder/primitive.rb +39 -0
  42. data/lib/ruby-lint/definition_builder/ruby_array.rb +77 -0
  43. data/lib/ruby-lint/definition_builder/ruby_block.rb +34 -0
  44. data/lib/ruby-lint/definition_builder/ruby_class.rb +24 -0
  45. data/lib/ruby-lint/definition_builder/ruby_hash.rb +37 -0
  46. data/lib/ruby-lint/definition_builder/ruby_method.rb +84 -0
  47. data/lib/ruby-lint/definition_builder/ruby_module.rb +68 -0
  48. data/lib/ruby-lint/definition_generator.rb +41 -15
  49. data/lib/ruby-lint/definitions/core/arg0.rb +1 -1
  50. data/lib/ruby-lint/definitions/core/argf.rb +1 -1
  51. data/lib/ruby-lint/definitions/core/argument_error.rb +2 -2
  52. data/lib/ruby-lint/definitions/core/argv.rb +1 -1
  53. data/lib/ruby-lint/definitions/core/array.rb +6 -6
  54. data/lib/ruby-lint/definitions/core/autoload.rb +2 -2
  55. data/lib/ruby-lint/definitions/core/basic_object.rb +3 -3
  56. data/lib/ruby-lint/definitions/core/bignum.rb +2 -2
  57. data/lib/ruby-lint/definitions/core/binding.rb +2 -2
  58. data/lib/ruby-lint/definitions/core/class.rb +2 -2
  59. data/lib/ruby-lint/definitions/core/comparable.rb +1 -1
  60. data/lib/ruby-lint/definitions/core/complex.rb +4 -4
  61. data/lib/ruby-lint/definitions/core/condition_variable.rb +2 -2
  62. data/lib/ruby-lint/definitions/core/continuation.rb +2 -2
  63. data/lib/ruby-lint/definitions/core/data.rb +2 -2
  64. data/lib/ruby-lint/definitions/core/date.rb +34 -34
  65. data/lib/ruby-lint/definitions/core/date_time.rb +26 -26
  66. data/lib/ruby-lint/definitions/core/default_record_separator.rb +1 -1
  67. data/lib/ruby-lint/definitions/core/digest.rb +14 -14
  68. data/lib/ruby-lint/definitions/core/dir.rb +34 -34
  69. data/lib/ruby-lint/definitions/core/encoding.rb +237 -237
  70. data/lib/ruby-lint/definitions/core/encoding_error.rb +2 -2
  71. data/lib/ruby-lint/definitions/core/enumerable.rb +15 -15
  72. data/lib/ruby-lint/definitions/core/enumerator.rb +2 -2
  73. data/lib/ruby-lint/definitions/core/env.rb +1 -1
  74. data/lib/ruby-lint/definitions/core/eoferror.rb +2 -2
  75. data/lib/ruby-lint/definitions/core/erb.rb +22 -22
  76. data/lib/ruby-lint/definitions/core/errno.rb +525 -525
  77. data/lib/ruby-lint/definitions/core/etc.rb +6 -6
  78. data/lib/ruby-lint/definitions/core/exception.rb +2 -2
  79. data/lib/ruby-lint/definitions/core/false.rb +1 -1
  80. data/lib/ruby-lint/definitions/core/false_class.rb +2 -2
  81. data/lib/ruby-lint/definitions/core/fatal_error.rb +2 -2
  82. data/lib/ruby-lint/definitions/core/fiber.rb +2 -2
  83. data/lib/ruby-lint/definitions/core/fiber_error.rb +2 -2
  84. data/lib/ruby-lint/definitions/core/file.rb +68 -68
  85. data/lib/ruby-lint/definitions/core/file_list.rb +2 -2
  86. data/lib/ruby-lint/definitions/core/file_test.rb +1 -1
  87. data/lib/ruby-lint/definitions/core/file_utils.rb +16 -16
  88. data/lib/ruby-lint/definitions/core/fixnum.rb +4 -4
  89. data/lib/ruby-lint/definitions/core/float.rb +16 -16
  90. data/lib/ruby-lint/definitions/core/float_domain_error.rb +2 -2
  91. data/lib/ruby-lint/definitions/core/gc.rb +2 -2
  92. data/lib/ruby-lint/definitions/core/gem.rb +119 -119
  93. data/lib/ruby-lint/definitions/core/hash.rb +14 -14
  94. data/lib/ruby-lint/definitions/core/immediate_value.rb +1 -1
  95. data/lib/ruby-lint/definitions/core/index_error.rb +2 -2
  96. data/lib/ruby-lint/definitions/core/integer.rb +2 -2
  97. data/lib/ruby-lint/definitions/core/interrupt.rb +2 -2
  98. data/lib/ruby-lint/definitions/core/io.rb +38 -38
  99. data/lib/ruby-lint/definitions/core/ioerror.rb +2 -2
  100. data/lib/ruby-lint/definitions/core/kernel.rb +3 -3
  101. data/lib/ruby-lint/definitions/core/key_error.rb +2 -2
  102. data/lib/ruby-lint/definitions/core/load_error.rb +6 -6
  103. data/lib/ruby-lint/definitions/core/local_jump_error.rb +2 -2
  104. data/lib/ruby-lint/definitions/core/main.rb +1 -1
  105. data/lib/ruby-lint/definitions/core/marshal.rb +35 -35
  106. data/lib/ruby-lint/definitions/core/match_data.rb +2 -2
  107. data/lib/ruby-lint/definitions/core/math.rb +7 -7
  108. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +2 -2
  109. data/lib/ruby-lint/definitions/core/method.rb +2 -2
  110. data/lib/ruby-lint/definitions/core/module.rb +1 -1
  111. data/lib/ruby-lint/definitions/core/monitor.rb +4 -4
  112. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +5 -5
  113. data/lib/ruby-lint/definitions/core/mutex.rb +2 -2
  114. data/lib/ruby-lint/definitions/core/name_error.rb +2 -2
  115. data/lib/ruby-lint/definitions/core/nil.rb +1 -1
  116. data/lib/ruby-lint/definitions/core/nil_class.rb +2 -2
  117. data/lib/ruby-lint/definitions/core/no_memory_error.rb +2 -2
  118. data/lib/ruby-lint/definitions/core/no_method_error.rb +2 -2
  119. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +2 -2
  120. data/lib/ruby-lint/definitions/core/numeric.rb +2 -2
  121. data/lib/ruby-lint/definitions/core/object.rb +2 -2
  122. data/lib/ruby-lint/definitions/core/object_space.rb +1 -1
  123. data/lib/ruby-lint/definitions/core/open_struct.rb +3 -3
  124. data/lib/ruby-lint/definitions/core/option_parser.rb +83 -83
  125. data/lib/ruby-lint/definitions/core/precision.rb +1 -1
  126. data/lib/ruby-lint/definitions/core/primitive_failure.rb +2 -2
  127. data/lib/ruby-lint/definitions/core/proc.rb +2 -2
  128. data/lib/ruby-lint/definitions/core/process.rb +29 -29
  129. data/lib/ruby-lint/definitions/core/psych.rb +149 -149
  130. data/lib/ruby-lint/definitions/core/queue.rb +2 -2
  131. data/lib/ruby-lint/definitions/core/rake.rb +117 -117
  132. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +1 -1
  133. data/lib/ruby-lint/definitions/core/rakeversion.rb +1 -1
  134. data/lib/ruby-lint/definitions/core/random.rb +2 -2
  135. data/lib/ruby-lint/definitions/core/range.rb +4 -4
  136. data/lib/ruby-lint/definitions/core/range_error.rb +2 -2
  137. data/lib/ruby-lint/definitions/core/rational.rb +2 -2
  138. data/lib/ruby-lint/definitions/core/rb_config.rb +3 -3
  139. data/lib/ruby-lint/definitions/core/regexp.rb +28 -28
  140. data/lib/ruby-lint/definitions/core/regexp_error.rb +2 -2
  141. data/lib/ruby-lint/definitions/core/rubinius.rb +1057 -1057
  142. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +1 -1
  143. data/lib/ruby-lint/definitions/core/ruby_description.rb +1 -1
  144. data/lib/ruby-lint/definitions/core/ruby_engine.rb +1 -1
  145. data/lib/ruby-lint/definitions/core/ruby_lint.rb +9 -9
  146. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +1 -1
  147. data/lib/ruby-lint/definitions/core/ruby_platform.rb +1 -1
  148. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +1 -1
  149. data/lib/ruby-lint/definitions/core/ruby_version.rb +1 -1
  150. data/lib/ruby-lint/definitions/core/runtime_error.rb +2 -2
  151. data/lib/ruby-lint/definitions/core/scan_error.rb +2 -2
  152. data/lib/ruby-lint/definitions/core/script_error.rb +2 -2
  153. data/lib/ruby-lint/definitions/core/security_error.rb +2 -2
  154. data/lib/ruby-lint/definitions/core/shellwords.rb +1 -1
  155. data/lib/ruby-lint/definitions/core/signal.rb +3 -3
  156. data/lib/ruby-lint/definitions/core/signal_exception.rb +2 -2
  157. data/lib/ruby-lint/definitions/core/singleton.rb +2 -2
  158. data/lib/ruby-lint/definitions/core/sized_queue.rb +2 -2
  159. data/lib/ruby-lint/definitions/core/standard_error.rb +2 -2
  160. data/lib/ruby-lint/definitions/core/stderr.rb +1 -1
  161. data/lib/ruby-lint/definitions/core/stdin.rb +1 -1
  162. data/lib/ruby-lint/definitions/core/stdout.rb +1 -1
  163. data/lib/ruby-lint/definitions/core/stop_iteration.rb +2 -2
  164. data/lib/ruby-lint/definitions/core/string.rb +21 -21
  165. data/lib/ruby-lint/definitions/core/string_io.rb +7 -7
  166. data/lib/ruby-lint/definitions/core/string_scanner.rb +4 -4
  167. data/lib/ruby-lint/definitions/core/struct.rb +20 -20
  168. data/lib/ruby-lint/definitions/core/syck.rb +4 -4
  169. data/lib/ruby-lint/definitions/core/symbol.rb +2 -2
  170. data/lib/ruby-lint/definitions/core/syntax_error.rb +2 -2
  171. data/lib/ruby-lint/definitions/core/system_call_error.rb +2 -2
  172. data/lib/ruby-lint/definitions/core/system_exit.rb +2 -2
  173. data/lib/ruby-lint/definitions/core/system_stack_error.rb +2 -2
  174. data/lib/ruby-lint/definitions/core/thread.rb +6 -6
  175. data/lib/ruby-lint/definitions/core/thread_error.rb +2 -2
  176. data/lib/ruby-lint/definitions/core/thread_group.rb +2 -2
  177. data/lib/ruby-lint/definitions/core/time.rb +3 -3
  178. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +1 -1
  179. data/lib/ruby-lint/definitions/core/true.rb +1 -1
  180. data/lib/ruby-lint/definitions/core/true_class.rb +2 -2
  181. data/lib/ruby-lint/definitions/core/type_error.rb +2 -2
  182. data/lib/ruby-lint/definitions/core/unbound_method.rb +2 -2
  183. data/lib/ruby-lint/definitions/core/unmarshalable.rb +1 -1
  184. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +2 -2
  185. data/lib/ruby-lint/definitions/core/weak_ref.rb +4 -4
  186. data/lib/ruby-lint/definitions/core/zero_division_error.rb +2 -2
  187. data/lib/ruby-lint/definitions/rails.rb +12 -0
  188. data/lib/ruby-lint/definitions/rails/abstract_controller.rb +335 -0
  189. data/lib/ruby-lint/definitions/rails/action_controller.rb +1244 -0
  190. data/lib/ruby-lint/definitions/rails/action_dispatch.rb +741 -0
  191. data/lib/ruby-lint/definitions/rails/action_mailer.rb +502 -0
  192. data/lib/ruby-lint/definitions/rails/action_pack.rb +16 -0
  193. data/lib/ruby-lint/definitions/rails/action_view.rb +898 -0
  194. data/lib/ruby-lint/definitions/rails/active_model.rb +437 -0
  195. data/lib/ruby-lint/definitions/rails/active_record.rb +2901 -0
  196. data/lib/ruby-lint/definitions/rails/active_support.rb +1963 -0
  197. data/lib/ruby-lint/definitions/rails/arel.rb +665 -0
  198. data/lib/ruby-lint/definitions/rails/rails.rb +452 -0
  199. data/lib/ruby-lint/definitions/rails/sprockets.rb +968 -0
  200. data/lib/ruby-lint/generated_constant.rb +33 -0
  201. data/lib/ruby-lint/helper/constant_paths.rb +30 -21
  202. data/lib/ruby-lint/inspector.rb +20 -2
  203. data/lib/ruby-lint/iterator.rb +11 -171
  204. data/lib/ruby-lint/nested_stack.rb +46 -0
  205. data/lib/ruby-lint/parser.rb +24 -806
  206. data/lib/ruby-lint/report.rb +2 -30
  207. data/lib/ruby-lint/report/entry.rb +2 -2
  208. data/lib/ruby-lint/runner.rb +81 -0
  209. data/lib/ruby-lint/template/definition.erb +12 -8
  210. data/lib/ruby-lint/variable_predicates.rb +16 -58
  211. data/lib/ruby-lint/version.rb +1 -1
  212. data/lib/ruby-lint/virtual_machine.rb +1044 -0
  213. data/ruby-lint.gemspec +17 -7
  214. data/spec/fixtures/complex/rails/basic_controller.rb +9 -0
  215. data/spec/fixtures/complex/rcap.rb +38 -0
  216. data/spec/fixtures/complex/slop.rb +680 -0
  217. data/spec/fixtures/config.yml +8 -0
  218. data/spec/fixtures/invalid.rb +3 -0
  219. data/spec/fixtures/invalid_2.rb +3 -0
  220. data/spec/fixtures/syntax_error.rb +1 -0
  221. data/spec/fixtures/valid.rb +3 -0
  222. data/spec/helper.rb +6 -0
  223. data/spec/ruby-lint/{analyze → analysis}/argument_amount.rb +7 -7
  224. data/spec/ruby-lint/analysis/confusing_variables.rb +46 -0
  225. data/spec/ruby-lint/analysis/pedantics.rb +43 -0
  226. data/spec/ruby-lint/{analyze → analysis}/shadowing_variables.rb +5 -5
  227. data/spec/ruby-lint/{analyze → analysis}/undefined_methods.rb +18 -18
  228. data/spec/ruby-lint/{analyze → analysis}/undefined_variables.rb +19 -25
  229. data/spec/ruby-lint/{analyze → analysis}/unused_variables.rb +29 -16
  230. data/spec/ruby-lint/ast/node.rb +33 -0
  231. data/spec/ruby-lint/cli/analyze.rb +31 -0
  232. data/spec/ruby-lint/cli/ast.rb +23 -0
  233. data/spec/ruby-lint/configuration.rb +45 -6
  234. data/spec/ruby-lint/definition/constant_proxy.rb +31 -0
  235. data/spec/ruby-lint/definition/dsl.rb +13 -20
  236. data/spec/ruby-lint/definition/ruby_method.rb +65 -148
  237. data/spec/ruby-lint/definition/ruby_object.rb +60 -96
  238. data/spec/ruby-lint/definition_builder/primitive.rb +62 -0
  239. data/spec/ruby-lint/definition_builder/ruby_class.rb +108 -0
  240. data/spec/ruby-lint/definition_builder/ruby_method.rb +53 -0
  241. data/spec/ruby-lint/definition_builder/ruby_module.rb +50 -0
  242. data/spec/ruby-lint/iterator.rb +40 -16
  243. data/spec/ruby-lint/nested_stack.rb +23 -0
  244. data/spec/ruby-lint/parser.rb +14 -0
  245. data/spec/ruby-lint/report.rb +0 -10
  246. data/spec/ruby-lint/report/entry.rb +8 -4
  247. data/spec/ruby-lint/runner.rb +32 -0
  248. data/spec/ruby-lint/virtual_machine/assignments/arrays.rb +87 -0
  249. data/spec/ruby-lint/virtual_machine/assignments/hashes.rb +52 -0
  250. data/spec/ruby-lint/virtual_machine/assignments/optional.rb +41 -0
  251. data/spec/ruby-lint/{definitions_builder → virtual_machine}/assignments/return_values.rb +11 -11
  252. data/spec/ruby-lint/virtual_machine/assignments/variables.rb +85 -0
  253. data/spec/ruby-lint/virtual_machine/associate_nodes.rb +17 -0
  254. data/spec/ruby-lint/virtual_machine/autoloading.rb +31 -0
  255. data/spec/ruby-lint/virtual_machine/blocks.rb +64 -0
  256. data/spec/ruby-lint/virtual_machine/classes/class_methods.rb +21 -0
  257. data/spec/ruby-lint/virtual_machine/classes/extending.rb +104 -0
  258. data/spec/ruby-lint/virtual_machine/classes/redefining.rb +24 -0
  259. data/spec/ruby-lint/virtual_machine/classes/sclass.rb +94 -0
  260. data/spec/ruby-lint/virtual_machine/classes/scoping.rb +60 -0
  261. data/spec/ruby-lint/virtual_machine/complex/rails.rb +18 -0
  262. data/spec/ruby-lint/virtual_machine/complex/rcap.rb +15 -0
  263. data/spec/ruby-lint/virtual_machine/complex/slop.rb +16 -0
  264. data/spec/ruby-lint/{definitions_builder → virtual_machine}/for.rb +2 -2
  265. data/spec/ruby-lint/virtual_machine/freeze.rb +13 -0
  266. data/spec/ruby-lint/virtual_machine/interpolation.rb +12 -0
  267. data/spec/ruby-lint/virtual_machine/methods/defining.rb +40 -0
  268. data/spec/ruby-lint/virtual_machine/methods/exporting.rb +19 -0
  269. data/spec/ruby-lint/virtual_machine/methods/parameters.rb +77 -0
  270. data/spec/ruby-lint/virtual_machine/methods/patching.rb +26 -0
  271. data/spec/ruby-lint/virtual_machine/methods/scoping.rb +63 -0
  272. data/spec/ruby-lint/virtual_machine/methods/visibility.rb +64 -0
  273. data/spec/ruby-lint/{definitions_builder → virtual_machine}/modules.rb +16 -16
  274. data/spec/ruby-lint/virtual_machine/reference_amount.rb +33 -0
  275. data/spec/ruby-lint/virtual_machine/unused.rb +17 -0
  276. data/spec/support/bacon.rb +13 -13
  277. data/spec/support/building.rb +23 -16
  278. data/spec/support/coveralls.rb +5 -0
  279. data/spec/support/fixtures.rb +20 -0
  280. data/spec/support/parsing.rb +3 -5
  281. data/spec/support/simplecov.rb +5 -3
  282. data/task/build.rake +1 -1
  283. data/task/cop.rake +11 -0
  284. data/task/generate.rake +40 -2
  285. data/task/profile.rake +27 -0
  286. data/task/todo.rake +6 -0
  287. data/task/travis.rake +7 -0
  288. metadata +160 -75
  289. metadata.gz.asc +14 -14
  290. data/doc/build/.gitkeep +0 -0
  291. data/lib/ruby-lint/analyze/argument_amount.rb +0 -73
  292. data/lib/ruby-lint/analyze/shadowing_variables.rb +0 -32
  293. data/lib/ruby-lint/analyze/undefined_methods.rb +0 -68
  294. data/lib/ruby-lint/analyze/undefined_variables.rb +0 -72
  295. data/lib/ruby-lint/analyze/unused_variables.rb +0 -48
  296. data/lib/ruby-lint/base.rb +0 -85
  297. data/lib/ruby-lint/definitions_builder.rb +0 -692
  298. data/lib/ruby-lint/helper/conversion.rb +0 -33
  299. data/lib/ruby-lint/helper/current_scope.rb +0 -98
  300. data/lib/ruby-lint/helper/methods.rb +0 -91
  301. data/lib/ruby-lint/node.rb +0 -107
  302. data/lib/ruby-lint/parser_error.rb +0 -30
  303. data/spec/ruby-lint/constant_loader.rb +0 -32
  304. data/spec/ruby-lint/definition/method_calls.rb +0 -26
  305. data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +0 -71
  306. data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +0 -65
  307. data/spec/ruby-lint/definitions_builder/assignments/objects.rb +0 -23
  308. data/spec/ruby-lint/definitions_builder/assignments/optional.rb +0 -22
  309. data/spec/ruby-lint/definitions_builder/assignments/variables.rb +0 -71
  310. data/spec/ruby-lint/definitions_builder/associate_nodes.rb +0 -17
  311. data/spec/ruby-lint/definitions_builder/blocks.rb +0 -40
  312. data/spec/ruby-lint/definitions_builder/classes.rb +0 -230
  313. data/spec/ruby-lint/definitions_builder/methods.rb +0 -147
  314. data/spec/ruby-lint/definitions_builder/reference_amount.rb +0 -31
  315. data/spec/ruby-lint/definitions_builder/unused.rb +0 -15
  316. data/spec/ruby-lint/node.rb +0 -38
  317. data/spec/ruby-lint/parser/assignments.rb +0 -225
  318. data/spec/ruby-lint/parser/classes.rb +0 -110
  319. data/spec/ruby-lint/parser/errors.rb +0 -12
  320. data/spec/ruby-lint/parser/metadata.rb +0 -17
  321. data/spec/ruby-lint/parser/method_definitions.rb +0 -111
  322. data/spec/ruby-lint/parser/methods.rb +0 -217
  323. data/spec/ruby-lint/parser/modules.rb +0 -70
  324. data/spec/ruby-lint/parser/operators.rb +0 -40
  325. data/spec/ruby-lint/parser/statements/begin.rb +0 -55
  326. data/spec/ruby-lint/parser/statements/case.rb +0 -34
  327. data/spec/ruby-lint/parser/statements/defined.rb +0 -11
  328. data/spec/ruby-lint/parser/statements/for.rb +0 -34
  329. data/spec/ruby-lint/parser/statements/if.rb +0 -46
  330. data/spec/ruby-lint/parser/statements/return.rb +0 -14
  331. data/spec/ruby-lint/parser/statements/super.rb +0 -49
  332. data/spec/ruby-lint/parser/statements/unless.rb +0 -42
  333. data/spec/ruby-lint/parser/statements/until.rb +0 -25
  334. data/spec/ruby-lint/parser/statements/while.rb +0 -25
  335. data/spec/ruby-lint/parser/statements/yield.rb +0 -18
  336. data/spec/ruby-lint/parser/types/arrays.rb +0 -47
  337. data/spec/ruby-lint/parser/types/booleans.rb +0 -11
  338. data/spec/ruby-lint/parser/types/constants.rb +0 -32
  339. data/spec/ruby-lint/parser/types/hashes.rb +0 -55
  340. data/spec/ruby-lint/parser/types/nil.rb +0 -7
  341. data/spec/ruby-lint/parser/types/numbers.rb +0 -11
  342. data/spec/ruby-lint/parser/types/procs.rb +0 -11
  343. data/spec/ruby-lint/parser/types/ranges.rb +0 -11
  344. data/spec/ruby-lint/parser/types/regexp.rb +0 -27
  345. data/spec/ruby-lint/parser/types/strings.rb +0 -44
  346. data/spec/ruby-lint/parser/types/symbols.rb +0 -15
  347. data/task/stdlib.rake +0 -23
@@ -0,0 +1,132 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # Base analysis class that provides various helper methods commonly used
5
+ # across analysis classes.
6
+ #
7
+ # @!attribute [r] report
8
+ # @return [RubyLint::Report]
9
+ #
10
+ # @!attribute [r] vm
11
+ # @return [RubyLint::VirtualMachine]
12
+ #
13
+ class Base < Iterator
14
+ include Helper::ConstantPaths
15
+
16
+ attr_reader :report, :vm
17
+
18
+ ##
19
+ # Array containing the callback names for which a new scope should be
20
+ # created.
21
+ #
22
+ # @return [Array<Symbol>]
23
+ #
24
+ SCOPES = [:root, :block, :class, :def, :module, :sclass]
25
+
26
+ ##
27
+ # Called after a new instance of this class is created.
28
+ #
29
+ def after_initialize
30
+ unless vm.is_a?(VirtualMachine)
31
+ raise(
32
+ ArgumentError,
33
+ 'Analysis classes require a valid RubyLint::VirtualMachine ' \
34
+ 'instance to be set using `SomeAnalysisClass.new(:vm => ...)`'
35
+ )
36
+ end
37
+
38
+ @scopes = []
39
+ end
40
+
41
+ SCOPES.each do |type|
42
+ define_method("on_#{type}") do |node|
43
+ set_current_scope(node)
44
+ end
45
+
46
+ define_method("after_#{type}") do |node|
47
+ set_previous_scope
48
+ end
49
+ end
50
+
51
+ protected
52
+
53
+ ##
54
+ # @return [RubyLint::Definition::RubyObject]
55
+ #
56
+ def definitions
57
+ return vm.definitions
58
+ end
59
+
60
+ ##
61
+ # Returns the current scope.
62
+ #
63
+ # @return [RubyLint::Definition::RubyObject]
64
+ #
65
+ def current_scope
66
+ return @scopes[-1]
67
+ end
68
+
69
+ ##
70
+ # Sets the current scope to the definition associated with the given
71
+ # node.
72
+ #
73
+ # @param [RubyLint::Node] node
74
+ #
75
+ def set_current_scope(node)
76
+ unless vm.associations.key?(node)
77
+ raise ArgumentError, "No associations for node #{node}"
78
+ end
79
+
80
+ @scopes << vm.associations[node]
81
+ end
82
+
83
+ ##
84
+ # Sets the current scope back to the previous one.
85
+ #
86
+ def set_previous_scope
87
+ @scopes.pop
88
+ end
89
+
90
+ ##
91
+ # Adds an error message to the report.
92
+ #
93
+ # @param [String] message The message to add.
94
+ # @param [RubyLint::Node] node The node for which to add the message.
95
+ #
96
+ def error(message, node)
97
+ add_message(:error, message, node)
98
+ end
99
+
100
+ ##
101
+ # Adds a warning message to the report.
102
+ #
103
+ # @see RubyLint::Callback#error
104
+ #
105
+ def warning(message, node)
106
+ add_message(:warning, message, node)
107
+ end
108
+
109
+ ##
110
+ # Adds a regular informational message to the report.
111
+ #
112
+ # @see RubyLint::Callback#error
113
+ #
114
+ def info(message, node)
115
+ add_message(:info, message, node)
116
+ end
117
+
118
+ ##
119
+ # Adds a message of the given level.
120
+ #
121
+ # @param [Symbol] level
122
+ # @param [String] message
123
+ # @param [String] node
124
+ #
125
+ def add_message(level, message, node)
126
+ return unless report
127
+
128
+ report.add(level, message, node.line, node.column, node.file)
129
+ end
130
+ end # Base
131
+ end # Analysis
132
+ end # RubyLint
@@ -0,0 +1,26 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # The {RubyLint::Analysis::ConfusingVariables} class checks for local
5
+ # variable assignments where the variable name is the same as an existing
6
+ # method name. Often these kind of assignments can lead to unexpected
7
+ # behaviour.
8
+ #
9
+ class ConfusingVariables < Base
10
+ ##
11
+ # @param [RubyLint::AST::Node] node
12
+ #
13
+ def on_lvasgn(node)
14
+ name = node.name
15
+ method = current_scope.lookup(current_scope.method_call_type, name)
16
+
17
+ if method and method != current_scope
18
+ warning(
19
+ 'variable assignment using the same name as an existing method',
20
+ node
21
+ )
22
+ end
23
+ end
24
+ end # ConfusingVariables
25
+ end # Analysis
26
+ end # RubyLint
@@ -0,0 +1,36 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # The {RubyLint::Analysis::UselessRuby} class checks for various useless
5
+ # Ruby features, the use of redundant tokens such as `then` for `if`
6
+ # statements and various other pedantics.
7
+ #
8
+ class Pedantics < Base
9
+ [:if, :unless, :until, :while].each do |type|
10
+ define_method("on_#{type}") do |node|
11
+ check_begin_token(node)
12
+ end
13
+ end
14
+
15
+ [:on_preexe, :on_postexe].each do |method|
16
+ define_method(method) do |node|
17
+ warning('BEGIN/END is useless', node)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ ##
24
+ # Checks if a node's begin token matches "then" or "do" and if so adds a
25
+ # warning for it.
26
+ #
27
+ # @param [RubyLint::AST::Node] node
28
+ #
29
+ def check_begin_token(node)
30
+ if node.location.begin.is?('then') or node.location.begin.is?('do')
31
+ info('the use of then/do is not needed here', node)
32
+ end
33
+ end
34
+ end # Pedantics
35
+ end # Analysis
36
+ end # RubyLint
@@ -0,0 +1,47 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # The ShadowingVariables class checks for the use of variables in a block
5
+ # that shadow outer variables. "Shadowing" means that a variable is used
6
+ # with the same name as a variable in the surrounding scope. A simple
7
+ # example:
8
+ #
9
+ # number = 10
10
+ #
11
+ # [10, 20, 30].each do |number|
12
+ # puts number # `number` is being shadowed
13
+ # end
14
+ #
15
+ class ShadowingVariables < Base
16
+ ##
17
+ # @param [RubyLint::AST::Node] node
18
+ #
19
+ def on_block(node)
20
+ @outer_scope = current_scope
21
+ @in_block = true
22
+
23
+ super
24
+ end
25
+
26
+ ##
27
+ # @param [RubyLint::AST::Node] node
28
+ #
29
+ def after_block(node)
30
+ @in_block = false
31
+ @outer_scope = nil
32
+
33
+ super
34
+ end
35
+
36
+ ##
37
+ # @param [RubyLint::AST::Node] node
38
+ #
39
+ def on_arg(node)
40
+ if @in_block \
41
+ and @outer_scope.has_definition?(:lvar, node.name)
42
+ warning("shadowing outer local variable #{node.name}", node)
43
+ end
44
+ end
45
+ end # ShadowingVariables
46
+ end # Analysis
47
+ end # RubyLint
@@ -0,0 +1,91 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # The UndefinedMethods class checks for the use of undefined methods/local
5
+ # variables and adds errors whenever needed. Based on the receiver of a
6
+ # method call the corresponding error message differs to make it easier to
7
+ # understand what is going on.
8
+ #
9
+ # A simple example:
10
+ #
11
+ # foobar # => undefined method foobar
12
+ # 'test'.foobar # => undefined method foobar on an instance of String
13
+ #
14
+ class UndefinedMethods < Base
15
+ ##
16
+ # @param [RubyLint::AST::Node] node
17
+ #
18
+ def on_send(node)
19
+ receiver, name, _ = *node
20
+
21
+ name = name.to_s
22
+ scope = current_scope
23
+
24
+ # Abort if the receiver doesn't exist since it will be handled by other
25
+ # analysis classes.
26
+ if receiver and !vm.associations.key?(receiver)
27
+ return
28
+ end
29
+
30
+ if receiver and vm.associations.key?(receiver)
31
+ scope = vm.associations[receiver]
32
+
33
+ # TODO: this should be handled in a more generic and especially in a
34
+ # more nicer way.
35
+ return if scope.parents.empty?
36
+ end
37
+
38
+ exists = scope.has_definition?(scope.method_call_type, name)
39
+
40
+ unless exists
41
+ message = error_for(name, receiver, scope)
42
+
43
+ error(message, node)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ ##
50
+ # Determines what error message to use for a method call.
51
+ #
52
+ # @param [String] name The name of the method.
53
+ # @param [RubyLint::AST::Node] receiver The receiver node, if any.
54
+ # @param [RubyLint::Definition::RubyObject] scope The scope the method
55
+ # was called on.
56
+ # @return [String]
57
+ #
58
+ def error_for(name, receiver, scope)
59
+ return receiver ? receiver_error(name, scope) : method_error(name)
60
+ end
61
+
62
+ ##
63
+ # @param [String] name
64
+ # @return [String]
65
+ #
66
+ def method_error(name)
67
+ return "undefined method #{name}"
68
+ end
69
+
70
+ ##
71
+ # Returns a String containing the error message to use when calling an
72
+ # undefined method on a receiver.
73
+ #
74
+ # @param [String] name
75
+ # @param [RubyLint::Definition::RubyObject] scope
76
+ # @return [String]
77
+ #
78
+ def receiver_error(name, scope)
79
+ klass = scope.ruby_class ? scope.ruby_class : scope.name
80
+
81
+ if scope.instance?
82
+ error = "undefined method #{name} on an instance of #{klass}"
83
+ else
84
+ error = "undefined method #{name} on #{scope.name}"
85
+ end
86
+
87
+ return error
88
+ end
89
+ end # UndefinedMethods
90
+ end # Analysis
91
+ end # RubyLint
@@ -0,0 +1,46 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # The UndefinedVariables class checks for the use of undefined variables
5
+ # (such as instance variables and constants). The order of definition and
6
+ # use of a variable does not matter.
7
+ #
8
+ # This analysis class does *not* check for undefined local variables. Ruby
9
+ # treats these as method calls and as result they are handled by
10
+ # {RubyLint::Analysis::UndefinedMethods} instead.
11
+ #
12
+ class UndefinedVariables < Base
13
+ ##
14
+ # Hash containing the various variable types to add errors for whenever
15
+ # they are used but not defined.
16
+ #
17
+ # @return [Hash]
18
+ #
19
+ VARIABLE_TYPES = {
20
+ :gvar => 'global variable',
21
+ :ivar => 'instance variable',
22
+ :cvar => 'class variable'
23
+ }
24
+
25
+ VARIABLE_TYPES.each do |type, label|
26
+ define_method("on_#{type}") do |node|
27
+ unless current_scope.has_definition?(type, node.name)
28
+ error("undefined #{label} #{node.name}", node)
29
+ end
30
+ end
31
+ end
32
+
33
+ ##
34
+ # Handles regular constants as well as constant paths.
35
+ #
36
+ # @param [RubyLint::AST::Node] node
37
+ #
38
+ def on_const(node)
39
+ variable = resolve_constant_path(node)
40
+ name = constant_segments(node).join('::')
41
+
42
+ error("undefined constant #{name}", node) unless variable
43
+ end
44
+ end # UndefinedVariables
45
+ end # Analysis
46
+ end # RubyLint
@@ -0,0 +1,49 @@
1
+ module RubyLint
2
+ module Analysis
3
+ ##
4
+ # The UnusedVariables class checks for variables that are defined but never
5
+ # used. Whenever it finds one of these variables it will add a
6
+ # corresponding warning message.
7
+ #
8
+ class UnusedVariables < Base
9
+ ##
10
+ # Hash containing the various variable types for which to add warnings
11
+ # and human readable names for these types.
12
+ #
13
+ # @return [Hash]
14
+ #
15
+ VARIABLE_TYPES = {
16
+ :lvasgn => 'local variable',
17
+ :gvasgn => 'global variable',
18
+ :ivasgn => 'instance variable',
19
+ :cvasgn => 'class variable'
20
+ }
21
+
22
+ VARIABLE_TYPES.each do |type, label|
23
+ define_method("on_#{type}") do |node|
24
+ type = VirtualMachine::ASSIGNMENT_TYPES[node.type]
25
+ name = node.name
26
+ variable = current_scope.lookup(type, name)
27
+
28
+ if variable and !variable.used?
29
+ warning("unused #{label} #{name}", node)
30
+ end
31
+ end
32
+ end
33
+
34
+ ##
35
+ # Handles regular constants as well as constant paths.
36
+ #
37
+ # @param [RubyLint::AST::Node] node
38
+ #
39
+ def on_casgn(node)
40
+ variable = resolve_constant_path(node)
41
+ name = constant_segments(node).join('::')
42
+
43
+ if variable and !variable.used?
44
+ warning("unused constant #{name}", node)
45
+ end
46
+ end
47
+ end # UnusedVariables
48
+ end # Analysis
49
+ end # RubyLint
@@ -0,0 +1,17 @@
1
+ module RubyLint
2
+ module AST
3
+ ##
4
+ # Custom AST builder class used to provide some extra additions/changes to
5
+ # the AST such as the use of a custom node class.
6
+ #
7
+ class Builder < ::Parser::Builders::Default
8
+ ##
9
+ # @see Parser::Builders::Default#n
10
+ # @return [RubyLint::AST::Node]
11
+ #
12
+ def n(type, children, location)
13
+ return Node.new(type, children, :location => location)
14
+ end
15
+ end # Builder
16
+ end # AST
17
+ end # RubyLint