ruby-lint 0.0.2 → 0.0.3

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 (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
@@ -0,0 +1,15 @@
1
+ class String
2
+ unless method_defined?(:snake_case)
3
+ ##
4
+ # Creates a new string that is `snake_cased`.
5
+ #
6
+ # @example
7
+ # "FooBar".snake_case # => "foo_bar"
8
+ #
9
+ # @return [String]
10
+ #
11
+ def snake_case
12
+ return self.gsub(/([a-z])([A-Z])/, '\\1_\\2').gsub('::', '_').downcase
13
+ end
14
+ end
15
+ end # String
@@ -0,0 +1,41 @@
1
+ module RubyLint
2
+ module Helper
3
+ ##
4
+ # The ConstantPaths helper module can be used to easily iterate over the
5
+ # segments of a constant path and perform lookups on each segment.
6
+ #
7
+ module ConstantPaths
8
+ ##
9
+ # Iterates over each segment of the constant path and yields the supplied
10
+ # block.
11
+ #
12
+ # @example
13
+ # path = s(:constant_path, s(:constant, 'A'), s(:constant, 'B')
14
+ #
15
+ # iterate_constant_path(path) do |name, segment, definition|
16
+ # puts name
17
+ # end
18
+ #
19
+ # @param [RubyLint::Node] node The constant path to iterate over.
20
+ #
21
+ # @yieldparam [String] name The name of the current segment.
22
+ # @yieldparam [RubyLint::Node] node The raw AST node of the current
23
+ # segment.
24
+ # @yieldparam [RubyLint::Definition::RubyObject] definition The
25
+ # definition object of the current segment.
26
+ #
27
+ def iterate_constant_path(node)
28
+ definitions = current_scope
29
+
30
+ node.children.each do |segment|
31
+ name = segment.children[0]
32
+ definition = definitions.lookup(:constant, name)
33
+
34
+ yield name, segment, definition
35
+
36
+ definition ? definitions = definition : break
37
+ end
38
+ end
39
+ end # ConstantPaths
40
+ end # Helper
41
+ end # RubyLint
@@ -0,0 +1,33 @@
1
+ module RubyLint
2
+ module Helper
3
+ ##
4
+ # The Conversion helper can be used to easily convert {RubyLint::Node}
5
+ # instances into specific definition objects.
6
+ #
7
+ module Conversion
8
+ ##
9
+ # Returns a {RubyLint::Definition::RubyObject} instance that represents
10
+ # an instance of the Node's corresponding Ruby class.
11
+ #
12
+ # @param [RubyLint::Node] node
13
+ # @return [RubyLint::Definition::RubyObject]
14
+ #
15
+ def instance_for_ruby_type(node)
16
+ return unless node.ruby_class
17
+
18
+ definition = nil
19
+ class_def = RubyLint.global_constant(node.ruby_class)
20
+
21
+ if class_def
22
+ definition = Definition::RubyObject.new_from_node(
23
+ node,
24
+ :instance_type => :instance,
25
+ :parents => [class_def]
26
+ )
27
+ end
28
+
29
+ return definition
30
+ end
31
+ end # Conversion
32
+ end # Helper
33
+ end # RubyLint
@@ -0,0 +1,98 @@
1
+ module RubyLint
2
+ module Helper
3
+ ##
4
+ # {RubyLint::Helper::CurrentScope} is a helper module that makes it easier
5
+ # to retrieve the current scope in callback methods. Instead of having to
6
+ # manually retrieve the scope to use based on the current node all you have
7
+ # to do is include this module and call `current_scope`.
8
+ #
9
+ # ## Inheritance
10
+ #
11
+ # Due to this module defining a few common callback methods such as
12
+ # `on_class` you should **always** call `super` if you override these
13
+ # methods in a class. For example, this will prevent the helper from
14
+ # working properly:
15
+ #
16
+ # class MyIterator < RubyLint::Iterator
17
+ # include RubyLint::Helper::CurrentScope
18
+ #
19
+ # def on_class(node)
20
+ # # ...
21
+ # end
22
+ # end
23
+ #
24
+ # This however will not:
25
+ #
26
+ # class MyIterator < RubyLint::Iterator
27
+ # include RubyLint::Helper::CurrentScope
28
+ #
29
+ # def on_class(node)
30
+ # super
31
+ #
32
+ # # ...
33
+ # end
34
+ # end
35
+ #
36
+ module CurrentScope
37
+ ##
38
+ # @see RubyLint::Iterator#initialize
39
+ #
40
+ def initialize(*args)
41
+ super
42
+
43
+ @scopes = []
44
+ end
45
+
46
+ ##
47
+ # Array containing the callback names for which a new scope should be
48
+ # created.
49
+ #
50
+ # @return [Array<Symbol>]
51
+ #
52
+ SCOPES = [
53
+ :block,
54
+ :class,
55
+ :method_definition,
56
+ :module,
57
+ :root,
58
+ :sclass
59
+ ]
60
+
61
+ SCOPES.each do |type|
62
+ define_method("on_#{type}") do |node|
63
+ set_current_scope(node)
64
+ end
65
+
66
+ define_method("after_#{type}") do |node|
67
+ set_previous_scope
68
+ end
69
+ end
70
+
71
+ ##
72
+ # Returns the current scope.
73
+ #
74
+ # @return [RubyLint::Definition::RubyObject]
75
+ #
76
+ def current_scope
77
+ return @scopes[-1]
78
+ end
79
+
80
+ ##
81
+ # Sets the current scope to the definition associated with the given
82
+ # node.
83
+ #
84
+ # @param [RubyLint::Node] node
85
+ #
86
+ def set_current_scope(node)
87
+ @scopes << associated_definition(node)
88
+ end
89
+
90
+ ##
91
+ # Sets the current scope back to the previous one.
92
+ #
93
+ def set_previous_scope
94
+ @scopes.pop
95
+ end
96
+ end # CurrentScope
97
+ end # Helper
98
+ end # RubyLint
@@ -0,0 +1,91 @@
1
+ module RubyLint
2
+ module Helper
3
+ ##
4
+ # Helper module that provides various methods for looking up methods,
5
+ # checking if they exist, etc.
6
+ #
7
+ module Methods
8
+ include CurrentScope
9
+ include Conversion
10
+
11
+ ##
12
+ # Checks if the method for the given node is defined or not.
13
+ #
14
+ # @param [RubyLint::Node] node
15
+ # @return [TrueClass|FalseClass]
16
+ #
17
+ def method_defined?(node)
18
+ scope = method_scope(node)
19
+
20
+ if scope
21
+ return scope.has_definition?(scope.method_call_type, node.name)
22
+ else
23
+ return false
24
+ end
25
+ end
26
+
27
+ ##
28
+ # Returns a boolean that indicates if the receiver is valid or not.
29
+ #
30
+ # @param [RubyLint::Node] node
31
+ # @return [TrueClass|FalseClass]
32
+ #
33
+ def invalid_receiver?(node)
34
+ invalid = false
35
+
36
+ if node.receiver
37
+ receiver = method_receiver(node.receiver)
38
+ invalid = !receiver || (receiver.variable? && receiver.value.nil?)
39
+ end
40
+
41
+ return invalid
42
+ end
43
+
44
+ ##
45
+ # Looks up the method definition for the specified method call.
46
+ #
47
+ # @param [RubyLint::Node] node
48
+ # @return [RubyLint::Definition::RubyMethod]
49
+ #
50
+ def lookup_method(node)
51
+ scope = method_scope(node)
52
+
53
+ return scope.lookup(scope.method_call_type, node.name)
54
+ end
55
+
56
+ ##
57
+ # Determines the scope to use for a method call.
58
+ #
59
+ # @param [RubyLint::Node] node
60
+ # @return [RubyLint::Definition::RubyObject]
61
+ #
62
+ def method_scope(node)
63
+ scope = node.receiver ? method_receiver(node.receiver) : current_scope
64
+
65
+ return scope.variable? && scope.value ? scope.value : scope
66
+ end
67
+
68
+ ##
69
+ # Tries to determine the receiver definition of a method call.
70
+ #
71
+ # @param [RubyLint::Node|Array] receiver
72
+ # @return [RubyLint::Definition::RubyObject]
73
+ #
74
+ def method_receiver(receiver)
75
+ receiver = receiver.is_a?(Array) ? receiver[0] : receiver
76
+ scope = instance_for_ruby_type(receiver)
77
+
78
+ if !scope
79
+ scope = current_scope.lookup(receiver.type, receiver.name)
80
+ end
81
+
82
+ # Last resort, try to load the receiver as a global constant.
83
+ if !scope and receiver.constant?
84
+ scope = RubyLint.global_constant(receiver.name)
85
+ end
86
+
87
+ return scope
88
+ end
89
+ end # Methods
90
+ end # Helper
91
+ end # RubyLint
@@ -0,0 +1,191 @@
1
+ module RubyLint
2
+ ##
3
+ # The Inspector class is a debugging related class primarily used for making
4
+ # it easy to display a list of methods/constants of a given source constant.
5
+ #
6
+ # Note that this class is considered to be a private API and as such may
7
+ # change without any notice.
8
+ #
9
+ # @!attribute [r] constant
10
+ # @return [Class]
11
+ # @!attribute [r] constant_name
12
+ # @return [String]
13
+ #
14
+ class Inspector
15
+ attr_reader :constant, :constant_name
16
+
17
+ ##
18
+ # @param [String|Class] constant
19
+ #
20
+ def initialize(constant)
21
+ @constant_name = constant
22
+
23
+ if constant.is_a?(String)
24
+ constant = resolve_constant(constant)
25
+ end
26
+
27
+ @constant = constant
28
+ end
29
+
30
+ ##
31
+ # Returns an Array containing all child constants and their childrne
32
+ # (recursively).
33
+ #
34
+ # The constants returned by this method are returned as String instances
35
+ # containing the full path (e.g. `Encoding::BINARY` instead of `BINARY`).
36
+ #
37
+ # @param [Class] source
38
+ # @param [Array] ignore
39
+ # @return [Array<String>]
40
+ #
41
+ def inspect_constants(source = constant, ignore = [])
42
+ source_name = source.to_s
43
+ constants = []
44
+ have_children = []
45
+ include_source = source != Object
46
+
47
+ if include_source
48
+ constants << source_name
49
+ ignore = ignore + [source.to_s]
50
+ end
51
+
52
+ source.constants.each do |name|
53
+ next unless source.const_defined?(name)
54
+
55
+ constant = source.const_get(name)
56
+ name = name.to_s
57
+ full_name = include_source ? "#{source_name}::#{name}" : name
58
+
59
+ next if ignore.include?(full_name)
60
+
61
+ ignore << constant
62
+ constants << full_name
63
+
64
+ if process_child_constants?(source, constant)
65
+ have_children << constant
66
+ end
67
+ end
68
+
69
+ have_children.each do |constant|
70
+ inspect_constants(constant, ignore).each do |child|
71
+ constants << child unless constants.include?(child)
72
+ end
73
+ end
74
+
75
+ return constants
76
+ end
77
+
78
+ ##
79
+ # Returns an Array containing all method objects sorted by their names.
80
+ #
81
+ # @return [Array]
82
+ #
83
+ def inspect_methods
84
+ return [] unless constant.respond_to?(:methods)
85
+
86
+ methods = constant.methods(false).map do |name|
87
+ method_information(:method, name)
88
+ end
89
+
90
+ return methods.sort_by(&:name)
91
+ end
92
+
93
+ ##
94
+ # Returns an Array containing all instance methods sorted by their names.
95
+ #
96
+ # @return [Array]
97
+ #
98
+ def inspect_instance_methods
99
+ return [] unless constant.respond_to?(:instance_methods)
100
+
101
+ methods = constant.instance_methods(false).map do |name|
102
+ method_information(:instance_method, name)
103
+ end
104
+
105
+ return methods.sort_by(&:name)
106
+ end
107
+
108
+ ##
109
+ # Formats the list of methods in a human readable format.
110
+ #
111
+ # @param [Array] methods
112
+ # @return [String]
113
+ #
114
+ def format_methods(methods)
115
+ output = []
116
+ longest = 0
117
+
118
+ methods.each do |method|
119
+ longest = method.name.length if method.name.length > longest
120
+ end
121
+
122
+ methods.each do |method|
123
+ output << "%-#{longest}s: %s" % [
124
+ method.name,
125
+ method.parameters.inspect
126
+ ]
127
+ end
128
+
129
+ return output.join("\n")
130
+ end
131
+
132
+ ##
133
+ # Formats a list of constants in a human readable format.
134
+ #
135
+ # @param [Array] constants
136
+ # @return [String]
137
+ #
138
+ def format_constants(constants)
139
+ return constants.join("\n")
140
+ end
141
+
142
+ private
143
+
144
+ ##
145
+ # @param [Class] source
146
+ # @param [Class] constant
147
+ # @return [TrueClass|FalseClass]
148
+ #
149
+ def process_child_constants?(source, constant)
150
+ return constant.respond_to?(:constants) \
151
+ && constant != source \
152
+ && !constant.constants.empty?
153
+ end
154
+
155
+ ##
156
+ # Returns the method object for the given type and name.
157
+ #
158
+ # @param [Symbol] type
159
+ # @param [Symbol] name
160
+ # @return [UnboundMethod]
161
+ #
162
+ def method_information(type, name)
163
+ return constant.send(type, name)
164
+ end
165
+
166
+ ##
167
+ # Converts a String based constant path into an actual constant.
168
+ #
169
+ # @param [String] constant
170
+ # @return [Class]
171
+ # @raise [ArgumentError] Raised when one of the segments doesn't exist.
172
+ #
173
+ def resolve_constant(constant)
174
+ current = Object
175
+ final = nil
176
+
177
+ constant.split('::').each do |segment|
178
+ if current.const_defined?(segment)
179
+ current = final = current.const_get(segment)
180
+ else
181
+ raise(
182
+ ArgumentError,
183
+ "Constant #{segment} does not exist in #{constant}"
184
+ )
185
+ end
186
+ end
187
+
188
+ return final
189
+ end
190
+ end # Inspector
191
+ end # RubyLint