ruby-lint 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (321) hide show
  1. data.tar.gz.asc +17 -0
  2. data/.gitignore +1 -0
  3. data/.travis.yml +25 -0
  4. data/.yardopts +4 -0
  5. data/Gemfile +1 -1
  6. data/LICENSE +1 -1
  7. data/MANIFEST +238 -49
  8. data/README.md +84 -131
  9. data/Rakefile +6 -0
  10. data/bin/ruby-lint +2 -2
  11. data/checksum/.gitkeep +0 -0
  12. data/doc/DCO.md +26 -0
  13. data/doc/architecture.md +63 -0
  14. data/doc/code_analysis.md +90 -0
  15. data/doc/configuration.md +86 -0
  16. data/doc/contributing.md +16 -0
  17. data/doc/graphviz/flow.dot +7 -0
  18. data/doc/images/.gitkeep +0 -0
  19. data/doc/images/flow.png +0 -0
  20. data/lib/ruby-lint.rb +35 -35
  21. data/lib/ruby-lint/analyze/argument_amount.rb +73 -0
  22. data/lib/ruby-lint/analyze/shadowing_variables.rb +19 -24
  23. data/lib/ruby-lint/analyze/undefined_methods.rb +68 -0
  24. data/lib/ruby-lint/analyze/undefined_variables.rb +42 -69
  25. data/lib/ruby-lint/analyze/unused_variables.rb +23 -78
  26. data/lib/ruby-lint/base.rb +85 -0
  27. data/lib/ruby-lint/cli.rb +23 -167
  28. data/lib/ruby-lint/cli/analyze.rb +99 -0
  29. data/lib/ruby-lint/cli/ast.rb +35 -0
  30. data/lib/ruby-lint/cli/base.rb +120 -0
  31. data/lib/ruby-lint/configuration.rb +112 -0
  32. data/lib/ruby-lint/constant_loader.rb +92 -0
  33. data/lib/ruby-lint/definition/ruby_method.rb +248 -0
  34. data/lib/ruby-lint/definition/ruby_object.rb +757 -0
  35. data/lib/ruby-lint/definition_generator.rb +155 -0
  36. data/lib/ruby-lint/definitions/core.rb +5 -0
  37. data/lib/ruby-lint/definitions/core/arg0.rb +7 -0
  38. data/lib/ruby-lint/definitions/core/argf.rb +7 -0
  39. data/lib/ruby-lint/definitions/core/argument_error.rb +12 -0
  40. data/lib/ruby-lint/definitions/core/argv.rb +7 -0
  41. data/lib/ruby-lint/definitions/core/array.rb +414 -0
  42. data/lib/ruby-lint/definitions/core/autoload.rb +39 -0
  43. data/lib/ruby-lint/definitions/core/basic_object.rb +46 -0
  44. data/lib/ruby-lint/definitions/core/bignum.rb +128 -0
  45. data/lib/ruby-lint/definitions/core/binding.rb +52 -0
  46. data/lib/ruby-lint/definitions/core/class.rb +23 -0
  47. data/lib/ruby-lint/definitions/core/comparable.rb +38 -0
  48. data/lib/ruby-lint/definitions/core/complex.rb +195 -0
  49. data/lib/ruby-lint/definitions/core/condition_variable.rb +19 -0
  50. data/lib/ruby-lint/definitions/core/continuation.rb +8 -0
  51. data/lib/ruby-lint/definitions/core/data.rb +8 -0
  52. data/lib/ruby-lint/definitions/core/date.rb +706 -0
  53. data/lib/ruby-lint/definitions/core/date_time.rb +381 -0
  54. data/lib/ruby-lint/definitions/core/default_record_separator.rb +7 -0
  55. data/lib/ruby-lint/definitions/core/digest.rb +166 -0
  56. data/lib/ruby-lint/definitions/core/dir.rb +496 -0
  57. data/lib/ruby-lint/definitions/core/encoding.rb +2030 -0
  58. data/lib/ruby-lint/definitions/core/encoding_error.rb +8 -0
  59. data/lib/ruby-lint/definitions/core/enumerable.rb +352 -0
  60. data/lib/ruby-lint/definitions/core/enumerator.rb +37 -0
  61. data/lib/ruby-lint/definitions/core/env.rb +7 -0
  62. data/lib/ruby-lint/definitions/core/eoferror.rb +8 -0
  63. data/lib/ruby-lint/definitions/core/erb.rb +304 -0
  64. data/lib/ruby-lint/definitions/core/errno.rb +3331 -0
  65. data/lib/ruby-lint/definitions/core/etc.rb +138 -0
  66. data/lib/ruby-lint/definitions/core/exception.rb +72 -0
  67. data/lib/ruby-lint/definitions/core/false.rb +7 -0
  68. data/lib/ruby-lint/definitions/core/false_class.rb +30 -0
  69. data/lib/ruby-lint/definitions/core/fatal_error.rb +8 -0
  70. data/lib/ruby-lint/definitions/core/fiber.rb +35 -0
  71. data/lib/ruby-lint/definitions/core/fiber_error.rb +8 -0
  72. data/lib/ruby-lint/definitions/core/file.rb +1277 -0
  73. data/lib/ruby-lint/definitions/core/file_list.rb +727 -0
  74. data/lib/ruby-lint/definitions/core/file_test.rb +106 -0
  75. data/lib/ruby-lint/definitions/core/file_utils.rb +1027 -0
  76. data/lib/ruby-lint/definitions/core/fixnum.rb +156 -0
  77. data/lib/ruby-lint/definitions/core/float.rb +307 -0
  78. data/lib/ruby-lint/definitions/core/float_domain_error.rb +8 -0
  79. data/lib/ruby-lint/definitions/core/gc.rb +57 -0
  80. data/lib/ruby-lint/definitions/core/gem.rb +3161 -0
  81. data/lib/ruby-lint/definitions/core/hash.rb +512 -0
  82. data/lib/ruby-lint/definitions/core/immediate_value.rb +19 -0
  83. data/lib/ruby-lint/definitions/core/index_error.rb +8 -0
  84. data/lib/ruby-lint/definitions/core/integer.rb +100 -0
  85. data/lib/ruby-lint/definitions/core/interrupt.rb +14 -0
  86. data/lib/ruby-lint/definitions/core/io.rb +928 -0
  87. data/lib/ruby-lint/definitions/core/ioerror.rb +8 -0
  88. data/lib/ruby-lint/definitions/core/kernel.rb +504 -0
  89. data/lib/ruby-lint/definitions/core/key_error.rb +8 -0
  90. data/lib/ruby-lint/definitions/core/load_error.rb +28 -0
  91. data/lib/ruby-lint/definitions/core/local_jump_error.rb +8 -0
  92. data/lib/ruby-lint/definitions/core/main.rb +25 -0
  93. data/lib/ruby-lint/definitions/core/marshal.rb +466 -0
  94. data/lib/ruby-lint/definitions/core/match_data.rb +73 -0
  95. data/lib/ruby-lint/definitions/core/math.rb +205 -0
  96. data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +8 -0
  97. data/lib/ruby-lint/definitions/core/method.rb +61 -0
  98. data/lib/ruby-lint/definitions/core/module.rb +262 -0
  99. data/lib/ruby-lint/definitions/core/monitor.rb +39 -0
  100. data/lib/ruby-lint/definitions/core/monitor_mixin.rb +59 -0
  101. data/lib/ruby-lint/definitions/core/mutex.rb +32 -0
  102. data/lib/ruby-lint/definitions/core/name_error.rb +16 -0
  103. data/lib/ruby-lint/definitions/core/nil.rb +7 -0
  104. data/lib/ruby-lint/definitions/core/nil_class.rb +46 -0
  105. data/lib/ruby-lint/definitions/core/no_memory_error.rb +8 -0
  106. data/lib/ruby-lint/definitions/core/no_method_error.rb +18 -0
  107. data/lib/ruby-lint/definitions/core/not_implemented_error.rb +8 -0
  108. data/lib/ruby-lint/definitions/core/numeric.rb +123 -0
  109. data/lib/ruby-lint/definitions/core/object.rb +31 -0
  110. data/lib/ruby-lint/definitions/core/object_space.rb +41 -0
  111. data/lib/ruby-lint/definitions/core/open_struct.rb +49 -0
  112. data/lib/ruby-lint/definitions/core/option_parser.rb +1355 -0
  113. data/lib/ruby-lint/definitions/core/precision.rb +21 -0
  114. data/lib/ruby-lint/definitions/core/primitive_failure.rb +8 -0
  115. data/lib/ruby-lint/definitions/core/proc.rb +109 -0
  116. data/lib/ruby-lint/definitions/core/process.rb +602 -0
  117. data/lib/ruby-lint/definitions/core/psych.rb +2231 -0
  118. data/lib/ruby-lint/definitions/core/queue.rb +44 -0
  119. data/lib/ruby-lint/definitions/core/rake.rb +4784 -0
  120. data/lib/ruby-lint/definitions/core/rake_file_utils.rb +203 -0
  121. data/lib/ruby-lint/definitions/core/rakeversion.rb +7 -0
  122. data/lib/ruby-lint/definitions/core/random.rb +38 -0
  123. data/lib/ruby-lint/definitions/core/range.rb +104 -0
  124. data/lib/ruby-lint/definitions/core/range_error.rb +8 -0
  125. data/lib/ruby-lint/definitions/core/rational.rb +96 -0
  126. data/lib/ruby-lint/definitions/core/rb_config.rb +36 -0
  127. data/lib/ruby-lint/definitions/core/regexp.rb +396 -0
  128. data/lib/ruby-lint/definitions/core/regexp_error.rb +8 -0
  129. data/lib/ruby-lint/definitions/core/rubinius.rb +16637 -0
  130. data/lib/ruby-lint/definitions/core/ruby_copyright.rb +7 -0
  131. data/lib/ruby-lint/definitions/core/ruby_description.rb +7 -0
  132. data/lib/ruby-lint/definitions/core/ruby_engine.rb +7 -0
  133. data/lib/ruby-lint/definitions/core/ruby_lint.rb +93 -0
  134. data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +7 -0
  135. data/lib/ruby-lint/definitions/core/ruby_platform.rb +7 -0
  136. data/lib/ruby-lint/definitions/core/ruby_release_date.rb +7 -0
  137. data/lib/ruby-lint/definitions/core/ruby_version.rb +7 -0
  138. data/lib/ruby-lint/definitions/core/runtime_error.rb +8 -0
  139. data/lib/ruby-lint/definitions/core/scan_error.rb +8 -0
  140. data/lib/ruby-lint/definitions/core/script_error.rb +8 -0
  141. data/lib/ruby-lint/definitions/core/security_error.rb +8 -0
  142. data/lib/ruby-lint/definitions/core/shellwords.rb +37 -0
  143. data/lib/ruby-lint/definitions/core/signal.rb +37 -0
  144. data/lib/ruby-lint/definitions/core/signal_exception.rb +19 -0
  145. data/lib/ruby-lint/definitions/core/singleton.rb +37 -0
  146. data/lib/ruby-lint/definitions/core/sized_queue.rb +42 -0
  147. data/lib/ruby-lint/definitions/core/standard_error.rb +8 -0
  148. data/lib/ruby-lint/definitions/core/stderr.rb +7 -0
  149. data/lib/ruby-lint/definitions/core/stdin.rb +7 -0
  150. data/lib/ruby-lint/definitions/core/stdout.rb +7 -0
  151. data/lib/ruby-lint/definitions/core/stop_iteration.rb +8 -0
  152. data/lib/ruby-lint/definitions/core/string.rb +713 -0
  153. data/lib/ruby-lint/definitions/core/string_io.rb +287 -0
  154. data/lib/ruby-lint/definitions/core/string_scanner.rb +158 -0
  155. data/lib/ruby-lint/definitions/core/struct.rb +357 -0
  156. data/lib/ruby-lint/definitions/core/syck.rb +30 -0
  157. data/lib/ruby-lint/definitions/core/symbol.rb +90 -0
  158. data/lib/ruby-lint/definitions/core/syntax_error.rb +44 -0
  159. data/lib/ruby-lint/definitions/core/system_call_error.rb +31 -0
  160. data/lib/ruby-lint/definitions/core/system_exit.rb +19 -0
  161. data/lib/ruby-lint/definitions/core/system_stack_error.rb +8 -0
  162. data/lib/ruby-lint/definitions/core/thread.rb +209 -0
  163. data/lib/ruby-lint/definitions/core/thread_error.rb +8 -0
  164. data/lib/ruby-lint/definitions/core/thread_group.rb +22 -0
  165. data/lib/ruby-lint/definitions/core/time.rb +233 -0
  166. data/lib/ruby-lint/definitions/core/toplevel_binding.rb +7 -0
  167. data/lib/ruby-lint/definitions/core/true.rb +7 -0
  168. data/lib/ruby-lint/definitions/core/true_class.rb +30 -0
  169. data/lib/ruby-lint/definitions/core/type_error.rb +8 -0
  170. data/lib/ruby-lint/definitions/core/unbound_method.rb +51 -0
  171. data/lib/ruby-lint/definitions/core/unmarshalable.rb +13 -0
  172. data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +8 -0
  173. data/lib/ruby-lint/definitions/core/weak_ref.rb +42 -0
  174. data/lib/ruby-lint/definitions/core/zero_division_error.rb +8 -0
  175. data/lib/ruby-lint/definitions_builder.rb +692 -0
  176. data/lib/ruby-lint/extensions/string.rb +15 -0
  177. data/lib/ruby-lint/helper/constant_paths.rb +41 -0
  178. data/lib/ruby-lint/helper/conversion.rb +33 -0
  179. data/lib/ruby-lint/helper/current_scope.rb +98 -0
  180. data/lib/ruby-lint/helper/methods.rb +91 -0
  181. data/lib/ruby-lint/inspector.rb +191 -0
  182. data/lib/ruby-lint/iterator.rb +187 -127
  183. data/lib/ruby-lint/node.rb +107 -0
  184. data/lib/ruby-lint/parser.rb +510 -1137
  185. data/lib/ruby-lint/parser_error.rb +15 -27
  186. data/lib/ruby-lint/presenter/json.rb +19 -0
  187. data/lib/ruby-lint/presenter/text.rb +37 -0
  188. data/lib/ruby-lint/report.rb +95 -53
  189. data/lib/ruby-lint/report/entry.rb +71 -0
  190. data/lib/ruby-lint/template/definition.erb +24 -0
  191. data/lib/ruby-lint/template/scope.rb +25 -0
  192. data/lib/ruby-lint/variable_predicates.rb +109 -0
  193. data/lib/ruby-lint/version.rb +1 -1
  194. data/ruby-lint.gemspec +19 -8
  195. data/spec/helper.rb +10 -2
  196. data/spec/ruby-lint/analyze/argument_amount.rb +91 -0
  197. data/spec/ruby-lint/analyze/shadowing_variables.rb +69 -14
  198. data/spec/ruby-lint/analyze/undefined_methods.rb +174 -0
  199. data/spec/ruby-lint/analyze/undefined_variables.rb +70 -179
  200. data/spec/ruby-lint/analyze/unused_variables.rb +63 -183
  201. data/spec/ruby-lint/configuration.rb +15 -0
  202. data/spec/ruby-lint/constant_loader.rb +32 -0
  203. data/spec/ruby-lint/definition/dsl.rb +142 -0
  204. data/spec/ruby-lint/definition/method_calls.rb +26 -0
  205. data/spec/ruby-lint/definition/ruby_method.rb +175 -0
  206. data/spec/ruby-lint/definition/ruby_object.rb +228 -0
  207. data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +71 -0
  208. data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +65 -0
  209. data/spec/ruby-lint/definitions_builder/assignments/objects.rb +23 -0
  210. data/spec/ruby-lint/definitions_builder/assignments/optional.rb +22 -0
  211. data/spec/ruby-lint/definitions_builder/assignments/return_values.rb +78 -0
  212. data/spec/ruby-lint/definitions_builder/assignments/variables.rb +71 -0
  213. data/spec/ruby-lint/definitions_builder/associate_nodes.rb +17 -0
  214. data/spec/ruby-lint/definitions_builder/blocks.rb +40 -0
  215. data/spec/ruby-lint/definitions_builder/classes.rb +230 -0
  216. data/spec/ruby-lint/definitions_builder/for.rb +16 -0
  217. data/spec/ruby-lint/definitions_builder/methods.rb +147 -0
  218. data/spec/ruby-lint/definitions_builder/modules.rb +175 -0
  219. data/spec/ruby-lint/definitions_builder/reference_amount.rb +31 -0
  220. data/spec/ruby-lint/definitions_builder/unused.rb +15 -0
  221. data/spec/ruby-lint/extensions/string.rb +7 -0
  222. data/spec/ruby-lint/iterator.rb +42 -417
  223. data/spec/ruby-lint/node.rb +38 -0
  224. data/spec/ruby-lint/parser/assignments.rb +225 -0
  225. data/spec/ruby-lint/parser/classes.rb +80 -122
  226. data/spec/ruby-lint/parser/errors.rb +7 -14
  227. data/spec/ruby-lint/parser/metadata.rb +17 -0
  228. data/spec/ruby-lint/parser/method_definitions.rb +111 -0
  229. data/spec/ruby-lint/parser/methods.rb +184 -216
  230. data/spec/ruby-lint/parser/modules.rb +54 -33
  231. data/spec/ruby-lint/parser/operators.rb +30 -65
  232. data/spec/ruby-lint/parser/statements/begin.rb +55 -0
  233. data/spec/ruby-lint/parser/statements/case.rb +34 -0
  234. data/spec/ruby-lint/parser/statements/defined.rb +11 -0
  235. data/spec/ruby-lint/parser/statements/for.rb +34 -0
  236. data/spec/ruby-lint/parser/statements/if.rb +46 -0
  237. data/spec/ruby-lint/parser/statements/return.rb +14 -0
  238. data/spec/ruby-lint/parser/statements/super.rb +49 -0
  239. data/spec/ruby-lint/parser/statements/unless.rb +42 -0
  240. data/spec/ruby-lint/parser/statements/until.rb +25 -0
  241. data/spec/ruby-lint/parser/statements/while.rb +25 -0
  242. data/spec/ruby-lint/parser/statements/yield.rb +18 -0
  243. data/spec/ruby-lint/parser/types/arrays.rb +47 -0
  244. data/spec/ruby-lint/parser/types/booleans.rb +11 -0
  245. data/spec/ruby-lint/parser/types/constants.rb +32 -0
  246. data/spec/ruby-lint/parser/types/hashes.rb +55 -0
  247. data/spec/ruby-lint/parser/types/nil.rb +7 -0
  248. data/spec/ruby-lint/parser/types/numbers.rb +11 -0
  249. data/spec/ruby-lint/parser/types/procs.rb +11 -0
  250. data/spec/ruby-lint/parser/types/ranges.rb +11 -0
  251. data/spec/ruby-lint/parser/types/regexp.rb +27 -0
  252. data/spec/ruby-lint/parser/types/strings.rb +44 -0
  253. data/spec/ruby-lint/parser/types/symbols.rb +15 -0
  254. data/spec/ruby-lint/presenter/json.rb +31 -0
  255. data/spec/ruby-lint/presenter/text.rb +22 -0
  256. data/spec/ruby-lint/report.rb +45 -15
  257. data/spec/ruby-lint/report/entry.rb +24 -0
  258. data/spec/support/bacon.rb +33 -0
  259. data/spec/support/building.rb +43 -0
  260. data/spec/support/definitions.rb +23 -0
  261. data/spec/support/parsing.rb +23 -0
  262. data/spec/support/simplecov.rb +16 -0
  263. data/task/build.rake +9 -0
  264. data/task/checksum.rake +13 -0
  265. data/task/coverage.rake +6 -0
  266. data/task/doc.rake +5 -0
  267. data/task/generate.rake +34 -0
  268. data/task/graphviz.rake +12 -0
  269. data/task/stdlib.rake +2 -9
  270. data/task/tag.rake +6 -0
  271. metadata +337 -68
  272. metadata.gz.asc +17 -0
  273. data/.rbenv-version +0 -1
  274. data/lib/ruby-lint/analyze/coding_style.rb +0 -407
  275. data/lib/ruby-lint/analyze/definitions.rb +0 -244
  276. data/lib/ruby-lint/analyze/method_validation.rb +0 -104
  277. data/lib/ruby-lint/callback.rb +0 -67
  278. data/lib/ruby-lint/constant_importer.rb +0 -112
  279. data/lib/ruby-lint/definition.rb +0 -230
  280. data/lib/ruby-lint/formatter/text.rb +0 -54
  281. data/lib/ruby-lint/helper/definition_resolver.rb +0 -143
  282. data/lib/ruby-lint/helper/scoping.rb +0 -138
  283. data/lib/ruby-lint/options.rb +0 -58
  284. data/lib/ruby-lint/token/assignment_token.rb +0 -35
  285. data/lib/ruby-lint/token/begin_rescue_token.rb +0 -57
  286. data/lib/ruby-lint/token/block_token.rb +0 -26
  287. data/lib/ruby-lint/token/case_token.rb +0 -44
  288. data/lib/ruby-lint/token/class_token.rb +0 -24
  289. data/lib/ruby-lint/token/keyword_token.rb +0 -43
  290. data/lib/ruby-lint/token/method_definition_token.rb +0 -64
  291. data/lib/ruby-lint/token/method_token.rb +0 -56
  292. data/lib/ruby-lint/token/parameters_token.rb +0 -99
  293. data/lib/ruby-lint/token/regexp_token.rb +0 -15
  294. data/lib/ruby-lint/token/statement_token.rb +0 -69
  295. data/lib/ruby-lint/token/token.rb +0 -176
  296. data/lib/ruby-lint/token/variable_token.rb +0 -18
  297. data/spec/benchmarks/memory.rb +0 -52
  298. data/spec/benchmarks/parse_parser.rb +0 -16
  299. data/spec/fixtures/stdlib/un.rb +0 -348
  300. data/spec/ruby-lint/analyze/coding_style.rb +0 -224
  301. data/spec/ruby-lint/analyze/complex/un.rb +0 -29
  302. data/spec/ruby-lint/analyze/definitions/classes.rb +0 -114
  303. data/spec/ruby-lint/analyze/definitions/methods.rb +0 -91
  304. data/spec/ruby-lint/analyze/definitions/modules.rb +0 -207
  305. data/spec/ruby-lint/analyze/definitions/variables.rb +0 -103
  306. data/spec/ruby-lint/analyze/method_validation.rb +0 -177
  307. data/spec/ruby-lint/callback.rb +0 -28
  308. data/spec/ruby-lint/constant_importer.rb +0 -27
  309. data/spec/ruby-lint/definition.rb +0 -96
  310. data/spec/ruby-lint/formatter/text.rb +0 -21
  311. data/spec/ruby-lint/parser/arrays.rb +0 -147
  312. data/spec/ruby-lint/parser/expander_assignments.rb +0 -183
  313. data/spec/ruby-lint/parser/hashes.rb +0 -136
  314. data/spec/ruby-lint/parser/keywords.rb +0 -89
  315. data/spec/ruby-lint/parser/objects.rb +0 -39
  316. data/spec/ruby-lint/parser/procs.rb +0 -113
  317. data/spec/ruby-lint/parser/ranges.rb +0 -49
  318. data/spec/ruby-lint/parser/regexp.rb +0 -31
  319. data/spec/ruby-lint/parser/scalars.rb +0 -93
  320. data/spec/ruby-lint/parser/statements.rb +0 -591
  321. data/spec/ruby-lint/parser/variables.rb +0 -230
@@ -1,36 +1,31 @@
1
1
  module RubyLint
2
2
  module Analyze
3
3
  ##
4
- # {RubyLint::Analyze::ShadowingVariables} is used to add warnings when block
5
- # parameters shadow outer local variables.
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:
6
8
  #
7
- class ShadowingVariables < RubyLint::Callback
8
- include Helper::DefinitionResolver
9
-
10
- ##
11
- # A short description of this class.
12
- #
13
- # @return [String]
14
- #
15
- DESCRIPTION = 'Checks for variables that shadow other variables.'
9
+ # number = 10
10
+ #
11
+ # [10, 20, 30].each do |number|
12
+ # puts number # `number` is being shadowed
13
+ # end
14
+ #
15
+ class ShadowingVariables < Iterator
16
+ include Helper::CurrentScope
16
17
 
17
18
  ##
18
- # Called when a block is found. This callback is used to check if the
19
- # parameters of the block shadow existing local variables defined in the
20
- # outer scope.
19
+ # @param [RubyLint::Node] node
21
20
  #
22
- # @param [RubyLint::Token::BlockToken] token The token of the block.
23
- #
24
- def on_block(token)
25
- token.parameters.each do |param|
26
- if scope.lookup(param.type, param.name)
27
- warning(
28
- "shadowing outer local variable #{param.name}",
29
- param.line,
30
- param.column
31
- )
21
+ def on_block(node)
22
+ node.each_argument do |param|
23
+ if current_scope.has_definition?(param.type, param.name)
24
+ warning("shadowing outer local variable #{param.name}", param)
32
25
  end
33
26
  end
27
+
28
+ super
34
29
  end
35
30
  end # ShadowingVariables
36
31
  end # Analyze
@@ -0,0 +1,68 @@
1
+ module RubyLint
2
+ module Analyze
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 < Iterator
15
+ include Helper::Methods
16
+
17
+ ##
18
+ # @param [RubyLint::Node] node
19
+ #
20
+ def on_method(node)
21
+ # Don't add errors for non existing receivers as these are handled by
22
+ # classes such as UndefinedVariables.
23
+ return if invalid_receiver?(node)
24
+
25
+ valid = method_defined?(node)
26
+ error = "undefined method #{node.name}"
27
+
28
+ # Methods called on block variables should be ignored since these
29
+ # variables don't carry any class information with them.
30
+ if !valid and node.receiver
31
+ receiver = method_receiver(node.receiver)
32
+ valid = receiver && receiver.ignore
33
+
34
+ if receiver.variable? and receiver.value
35
+ receiver = receiver.value
36
+ end
37
+
38
+ if receiver
39
+ error = receiver_error(node.name, receiver)
40
+ end
41
+ end
42
+
43
+ error(error, node) unless valid
44
+ end
45
+
46
+ private
47
+
48
+ ##
49
+ # Creates an error message for a method call on a receiver.
50
+ #
51
+ # @param [String] name
52
+ # @param [RubyLint::Definition::RubyObject] receiver
53
+ # @return [String]
54
+ #
55
+ def receiver_error(name, receiver)
56
+ error = "undefined method #{name} on #{receiver.name}"
57
+ receiver_name = receiver.ruby_class || receiver.name
58
+
59
+ if receiver.instance?
60
+ error = "undefined method #{name} on an instance " \
61
+ "of #{receiver_name}"
62
+ end
63
+
64
+ return error
65
+ end
66
+ end # UndefinedMethods
67
+ end # Analyze
68
+ end # RubyLint
@@ -1,98 +1,71 @@
1
1
  module RubyLint
2
2
  module Analyze
3
3
  ##
4
- # {RubyLint::Analyze::UndefinedVariables} is used to add errors for the use of
5
- # undefined variables.
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.
6
7
  #
7
- class UndefinedVariables < RubyLint::Callback
8
- include Helper::DefinitionResolver
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::Analyze::UndefinedMethods} instead.
11
+ #
12
+ class UndefinedVariables < Iterator
13
+ include Helper::CurrentScope
9
14
 
10
15
  ##
11
- # A short description of this class.
16
+ # Hash containing the various variable types to add errors for whenever
17
+ # they are used but not defined.
12
18
  #
13
- # @return [String]
19
+ # @return [Hash]
14
20
  #
15
- DESCRIPTION = 'Checks for the use of undefined variables.'
16
-
17
- [
18
- 'instance_variable',
19
- 'class_variable',
20
- 'global_variable',
21
- 'constant'
22
- ].each do |name|
23
- readable = name.gsub('_', ' ')
21
+ VARIABLE_TYPES = {
22
+ :global_variable => 'global variable',
23
+ :instance_variable => 'instance variable',
24
+ :class_variable => 'class variable',
25
+ :constant => 'constant'
26
+ }
24
27
 
25
- define_method('on_' + name) do |token|
26
- unless definition_exists?(token.type, token)
27
- error(
28
- "undefined #{readable} #{token.name}",
29
- token.line,
30
- token.column
31
- )
28
+ VARIABLE_TYPES.each do |type, label|
29
+ define_method("on_#{type}") do |node|
30
+ if !current_scope.has_definition?(type, node.name) \
31
+ and !@in_constant_path
32
+ error("undefined #{label} #{node.name}", node)
32
33
  end
33
34
  end
34
35
  end
35
36
 
36
37
  ##
37
- # Called when a variable assignment is found. Used to validate constant
38
- # paths before assigning data to them.
38
+ # Validates each segment of a constant path in the correct scope.
39
39
  #
40
- # @param [RubyLint::Token::AssignmentToken] token
40
+ # @param [RubyLint::Node] node
41
41
  #
42
- def on_assignment(token)
43
- on_constant_path(token) if token.name.is_a?(Array)
44
- end
42
+ def on_constant_path(node)
43
+ definitions = current_scope
44
+ @in_constant_path = true
45
45
 
46
- ##
47
- # Called when a constant path is found.
48
- #
49
- # @param [RubyLint::Token::VariableToken] token
50
- #
51
- def on_constant_path(token)
52
- current = scope
53
- segments = []
46
+ # The first constant check should take data from parent scopes into
47
+ # account. The following segments should not.
48
+ method = :has_definition?
54
49
 
55
- token.name.each do |segment|
56
- segments << segment
57
- found = current.lookup(:constant, segment)
50
+ node.children.each do |segment|
51
+ name = segment.name
58
52
 
59
- if found and found.token.line < token.line
60
- current = found
61
- else
62
- error(
63
- "undefined constant #{segments.join('::')}",
64
- token.line,
65
- token.column
66
- )
53
+ unless definitions.send(method, :constant, name)
54
+ error("undefined constant #{name}", segment)
67
55
 
68
- return
56
+ break
69
57
  end
58
+
59
+ definitions = definitions.lookup(:constant, name)
60
+ method = :defines?
70
61
  end
71
62
  end
72
63
 
73
64
  ##
74
- # Called when a method call is found.
75
- #
76
- # @param [RubyLint::Token::MethodToken] token
65
+ # @param [RubyLint::Node] node
77
66
  #
78
- def on_method(token)
79
- kernel_method = false
80
- kernel = scope.lookup(:constant, 'Kernel')
81
-
82
- if kernel.lookup(:method, token.name) \
83
- or kernel.lookup(:instance_method, token.name)
84
- kernel_method = true
85
- end
86
-
87
- if !token.receiver \
88
- and !kernel_method \
89
- and !definition_exists?(:instance_method, token)
90
- error(
91
- "undefined local variable or method #{token.name}",
92
- token.line,
93
- token.column
94
- )
95
- end
67
+ def after_constant_path(node)
68
+ @in_constant_path = false
96
69
  end
97
70
  end # UndefinedVariables
98
71
  end # Analyze
@@ -1,102 +1,47 @@
1
1
  module RubyLint
2
2
  module Analyze
3
3
  ##
4
- # {RubyLint::Analyze::UnusedVariables} is used to check for unused local,
5
- # instance, class and global variables.
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.
6
7
  #
7
- class UnusedVariables < RubyLint::Callback
8
- include Helper::DefinitionResolver
8
+ class UnusedVariables < Iterator
9
+ include Helper::CurrentScope
10
+ include Helper::ConstantPaths
9
11
 
10
12
  ##
11
- # A short description of this class.
12
- #
13
- # @return [String]
14
- #
15
- DESCRIPTION = 'Checks for variables that are assigned but unused.'
16
-
17
- ##
18
- # Hash containing the human readable names for various variable types.
13
+ # Hash containing the various variable types for which to add warnings
14
+ # and human readable names for these types.
19
15
  #
20
16
  # @return [Hash]
21
17
  #
22
- HUMAN_READABLE = {
18
+ VARIABLE_TYPES = {
23
19
  :local_variable => 'local variable',
20
+ :global_variable => 'global variable',
24
21
  :instance_variable => 'instance variable',
25
22
  :class_variable => 'class variable',
26
- :global_variable => 'global variable'
23
+ :constant => 'constant'
27
24
  }
28
25
 
29
- ##
30
- # Array containing the variable callback methods to define.
31
- #
32
- # @return [Array]
33
- #
34
- UNUSED_VARIABLES = [
35
- :on_local_variable,
36
- :on_instance_variable,
37
- :on_class_variable,
38
- :on_global_variable
39
- ]
26
+ VARIABLE_TYPES.each do |type, label|
27
+ define_method("on_#{type}") do |node|
28
+ variable = current_scope.lookup(node.type, node.name)
40
29
 
41
- UNUSED_VARIABLES.each do |name|
42
- define_method(name) do |token|
43
- unused_variables.delete(token.name)
30
+ if variable and !variable.used?
31
+ warning("unused #{label} #{node.name}", node)
32
+ end
44
33
  end
45
34
  end
46
35
 
47
36
  ##
48
- # @see RubyLint::Callback#initialize
49
- #
50
- def initialize(*args)
51
- super
52
-
53
- @unused_variables = [{}]
54
- end
55
-
56
- ##
57
- # Called when a new scope is found.
58
- #
59
- def on_new_scope
60
- @unused_variables << {}
61
- end
62
-
63
- ##
64
- # Called after a new scope has ended.
37
+ # @param [RubyLint::Node] node
65
38
  #
66
- def after_new_scope
67
- # Add the warnings for all the unused variables.
68
- unused_variables.each do |name, token|
69
- readable = HUMAN_READABLE[token.type]
70
-
71
- warning(
72
- "assigned but unused #{readable} #{token.name}",
73
- token.line,
74
- token.column
75
- )
39
+ def on_constant_path(node)
40
+ iterate_constant_path(node) do |name, segment, definition|
41
+ if definition and !definition.used?
42
+ warning("unused constant #{name}", segment)
43
+ end
76
44
  end
77
-
78
- @unused_variables.pop
79
- end
80
-
81
- ##
82
- # Called when a variable is assigned.
83
- #
84
- # @param [RubyLint::Token::AssignmentToken] token
85
- #
86
- def on_assignment(token)
87
- unused_variables[token.name] = token
88
- end
89
-
90
- private
91
-
92
- ##
93
- # Returns the Hash to use for storing unused variables for the current
94
- # scope.
95
- #
96
- # @return [Hash]
97
- #
98
- def unused_variables
99
- return @unused_variables[-1]
100
45
  end
101
46
  end # UnusedVariables
102
47
  end # Analyze
@@ -0,0 +1,85 @@
1
+ module RubyLint
2
+ ##
3
+ # @return [RubyLint::GlobalScope]
4
+ #
5
+ def self.global_scope
6
+ return @global_scope ||= Definition::RubyObject.new(
7
+ :name => 'global',
8
+ :type => :global
9
+ )
10
+ end
11
+
12
+ ##
13
+ # Looks up the given constant in the global scope. If it does not exist this
14
+ # method will try to load it from one of the existing definitions.
15
+ #
16
+ # @param [String] name
17
+ # @return [RubyLint::Definition::RubyObject]
18
+ #
19
+ def self.global_constant(name)
20
+ found = global_scope.lookup(:constant, name)
21
+
22
+ if !found and !constant_loader.loaded?(name)
23
+ constant_loader.load(name)
24
+
25
+ found = global_scope.lookup(:constant, name)
26
+ end
27
+
28
+ return found
29
+ end
30
+
31
+ ##
32
+ # Provides a simple DSL for configuring ruby-lint.
33
+ #
34
+ # @yieldparam [RubyLint::Configuration]
35
+ #
36
+ def self.configure
37
+ yield configuration
38
+ end
39
+
40
+ ##
41
+ # @return [RubyLint::Configuration]
42
+ #
43
+ def self.configuration
44
+ return @configuration ||= Configuration.new
45
+ end
46
+
47
+ ##
48
+ # @param [RubyLint::Configuration] config
49
+ #
50
+ def self.configuration=(config)
51
+ @configuration = config
52
+ end
53
+
54
+ ##
55
+ # @return [RubyLint::ConstantLoader]
56
+ #
57
+ def self.constant_loader
58
+ return @constant_loader ||= ConstantLoader.new
59
+ end
60
+
61
+ ##
62
+ # Returns an Array of locations from which to load configuration files.
63
+ #
64
+ # @return [Array]
65
+ #
66
+ def self.configuration_files
67
+ return [
68
+ File.join(Dir.pwd, 'ruby-lint.rb'),
69
+ File.expand_path('~/.ruby-lint.rb', __FILE__)
70
+ ]
71
+ end
72
+
73
+ ##
74
+ # Tries to load a configuration file from one of the locations in
75
+ # {RubyLint.configuration_files}.
76
+ #
77
+ def self.load_configuration
78
+ configuration_files.each do |path|
79
+ if File.file?(path)
80
+ require(path)
81
+ break
82
+ end
83
+ end
84
+ end
85
+ end # RubyLint