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
@@ -1,104 +0,0 @@
1
- module RubyLint
2
- module Analyze
3
- ##
4
- # {RubyLint::Analyze::MethodValidation} is used to validate method calls.
5
- # Errors are added for calling undefined methods, calling methods with
6
- # invalid parameters and so on.
7
- #
8
- class MethodValidation < RubyLint::Callback
9
- include Helper::DefinitionResolver
10
-
11
- ##
12
- # A short description of this class.
13
- #
14
- # @return [String]
15
- #
16
- DESCRIPTION = 'Validates method calls and the specified parameters.'
17
-
18
- ##
19
- # Hash containing the various Ruby classes that are used to represent
20
- # various types.
21
- #
22
- # @return [Hash]
23
- #
24
- TYPE_CLASSES = {
25
- :string => 'String',
26
- :integer => 'Fixnum', # Fixnum and Bignum share the same methods.
27
- :float => 'Float',
28
- :symbol => 'Symbol',
29
- :array => 'Array',
30
- :hash => 'Hash',
31
- :brace_block => 'Proc',
32
- :lambda => 'Proc',
33
- :regexp => 'Regexp',
34
- :range => 'Range'
35
- }
36
-
37
- ##
38
- # Called when a method call is found.
39
- #
40
- # @param [RubyLint::Token::MethodToken] token
41
- #
42
- def on_method(token)
43
- # Method called on a receiver (e.g. `String.new`).
44
- if token.receiver
45
- receiver_name = token.receiver.name
46
- receiver_scope = scope
47
- receiver_type = token.receiver.type
48
- method_type = :instance_method
49
-
50
- if receiver_name.is_a?(Array)
51
- return unless valid_constant_path?(token.receiver)
52
-
53
- receiver_scope = resolve_definition(receiver_name)
54
- end
55
-
56
- # Method calls on variables such as `name.upcase`.
57
- if token.receiver.is_a?(Token::VariableToken) \
58
- and receiver_type != :constant \
59
- and receiver_type != :constant_path
60
- value = receiver_scope.lookup(receiver_type, receiver_name)
61
-
62
- if !value.nil? and !value.token.value.nil?
63
- value = value.token.value
64
- receiver_type = TYPE_CLASSES[value.type]
65
- end
66
-
67
- # Extract the class from a method call.
68
- if value.respond_to?(:receiver)
69
- while value.respond_to?(:receiver)
70
- value = value.receiver
71
- end
72
-
73
- receiver_type = value.name
74
- end
75
-
76
- # Methods called directly on a type such as `'name'.upcase`.
77
- elsif TYPE_CLASSES[receiver_type]
78
- receiver_type = TYPE_CLASSES[receiver_type]
79
-
80
- # Everything else.
81
- else
82
- method_type = :method
83
- receiver_type = receiver_name.is_a?(Array) \
84
- ? receiver_name[-1] \
85
- : receiver_name
86
- end
87
-
88
- # Retrieve the constant to check for the existence of the method.
89
- found = receiver_scope.lookup(:constant, receiver_type)
90
-
91
- if found and !definition_exists?(method_type, token, found)
92
- if method_type == :instance_method
93
- error = "undefined instance method #{token.name}"
94
- else
95
- error = "undefined class method #{token.name}"
96
- end
97
-
98
- error(error, token.line, token.column)
99
- end
100
- end
101
- end
102
- end # MethodValidation
103
- end # Analyze
104
- end # RubyLint
@@ -1,67 +0,0 @@
1
- module RubyLint
2
- ##
3
- # {RubyLint::Callback} is a class that can be used (but you're not required to)
4
- # to remove some common boilerplate code from custom callback classes.
5
- #
6
- # Using this class can be done by simply extending it:
7
- #
8
- # class MyCallback < RubyLint::Callback
9
- #
10
- # end
11
- #
12
- # Once extended the following helper methods are provided:
13
- #
14
- # * {RubyLint::Callback#error}
15
- # * {RubyLint::Callback#warning}
16
- # * {RubyLint::Callback#info}
17
- #
18
- # These 3 methods can be used to add data to a report. If no report is set
19
- # the methods will not execute any code. This means your own code does not
20
- # have to check for a valid instance of {RubyLint::Report} in the `@report`
21
- # instance variable every time you want to add data to it.
22
- #
23
- class Callback
24
- ##
25
- # Creates a new instance of the class and stores the report.
26
- #
27
- # @param [RubyLint::Report|NilClass] report The report instance to use.
28
- # @param [Hash] options A hash containing custom options to set for the
29
- # callback.
30
- #
31
- def initialize(report = nil, storage = {})
32
- @report = report
33
- @storage = storage
34
- end
35
-
36
- protected
37
-
38
- ##
39
- # Adds an error message to the report.
40
- #
41
- # @param [String] message The message to add.
42
- # @param [Fixnum] line The line number of the message.
43
- # @param [Fixnum] column The column number of the message.
44
- #
45
- def error(message, line, column)
46
- @report.add(:error, message, line, column) if @report
47
- end
48
-
49
- ##
50
- # Adds a warning message to the report.
51
- #
52
- # @see RubyLint::Callback#error
53
- #
54
- def warning(message, line, column)
55
- @report.add(:warning, message, line, column) if @report
56
- end
57
-
58
- ##
59
- # Adds a regular informational message to the report.
60
- #
61
- # @see RubyLint::Callback#error
62
- #
63
- def info(message, line, column)
64
- @report.add(:info, message, line, column) if @report
65
- end
66
- end # Callback
67
- end # RubyLint
@@ -1,112 +0,0 @@
1
- module RubyLint
2
- ##
3
- # {RubyLint::ConstantImporter} is a module that can be used to create a list of
4
- # method definitions (using {RubyLint::Token::MethodDefinitionToken} for a
5
- # supplied list of constant names.
6
- #
7
- module ConstantImporter
8
- ##
9
- # Boolean that indicates if the Config constant should be ignored or not.
10
- #
11
- # @return [TrueClass|FalseClass]
12
- #
13
- IGNORE_CONFIG = Object.const_defined?(:RbConfig)
14
-
15
- ##
16
- # Hash containing all the source Ruby methods to retrieve methods and the
17
- # keys to store them under.
18
- #
19
- # @return [Hash]
20
- #
21
- METHOD_KEYS = {
22
- :methods => :method,
23
- :instance_methods => :instance_method,
24
- :private_methods => :method,
25
- :private_instance_methods => :instance_method
26
- }
27
-
28
- ##
29
- # Hash containing the parameter types as returned by `Method#parameters`
30
- # and the attributes they should be stored in in an instance of
31
- # {RubyLint::Token::ParametersToken}.
32
- #
33
- # @return [Hash]
34
- #
35
- PARAMETER_KEYS = {
36
- :req => :value,
37
- :opt => :optional,
38
- :rest => :rest,
39
- :block => :block
40
- }
41
-
42
- ##
43
- # Imports the methods of a given list of constant names and returns a Hash
44
- # containing instances of {RubyLint::Definition} for each imported constant.
45
- #
46
- # @param [Array] constants An array of constant to import.
47
- # @param [Mixed] source_constant The source constant to use for the
48
- # `const_get` call. Set to `Object` by default.
49
- # @return [Hash]
50
- #
51
- def self.import(constants, source_constant = Object)
52
- imported = {}
53
-
54
- constants.each do |name|
55
- next if name == :Config and IGNORE_CONFIG
56
-
57
- const = source_constant.const_get(name)
58
-
59
- next unless const
60
-
61
- name = name.to_s
62
- const_token = Token::VariableToken.new(
63
- :type => :constant,
64
- :name => name
65
- )
66
-
67
- scope = Definition.new(
68
- nil,
69
- :lazy => true,
70
- :constant => const,
71
- :token => const_token
72
- )
73
-
74
- METHOD_KEYS.each do |source, target|
75
- next unless const.respond_to?(source)
76
-
77
- const.send(source).each do |method|
78
- token = Token::MethodDefinitionToken.new(:name => method.to_s)
79
-
80
- if source =~ /^private/
81
- token.visibility = :private
82
- end
83
-
84
- # Import all the parameters.
85
- const.send(target, method).parameters.each do |param|
86
- param_target = PARAMETER_KEYS[param[0]]
87
-
88
- variable = Token::VariableToken.new(
89
- :name => param[1].to_s,
90
- :type => :local_variable
91
- )
92
-
93
- # Determine if the parameter should be appended to a list or set
94
- # as the sole parameter.
95
- if token.parameters.send(param_target).is_a?(Array)
96
- token.parameters.send(param_target).push(variable)
97
- else
98
- token.parameters.send("#{param_target}=", variable)
99
- end
100
- end
101
-
102
- scope.add(target, method.to_s, Definition.new(nil, :token => token))
103
- end
104
- end
105
-
106
- imported[name] = scope
107
- end
108
-
109
- return imported
110
- end
111
- end # ConstantImporter
112
- end # RubyLint
@@ -1,230 +0,0 @@
1
- module RubyLint
2
- ##
3
- # {RubyLint::Definition} is a class used for storing scoping/definition related
4
- # information such as the methods that are available for various constants,
5
- # variables that have been defined, etc.
6
- #
7
- # Each instance of this class can also have a number of parent scopes. These
8
- # parent scopes can be used to look up data that is inherited in Ruby code
9
- # (e.g. constants).
10
- #
11
- # Basic example of using this class:
12
- #
13
- # scope = RubyLint::Definition.new
14
- #
15
- # scope.lookup(:local_variable, 'name') # => nil
16
- #
17
- # scope.add(:local_variable, 'name', 'Ruby')
18
- #
19
- # scope.lookup(:local_variable, 'name') # => "Ruby"
20
- #
21
- class Definition
22
- ##
23
- # Array containing symbol names that should be looked up in the parent
24
- # scopes if they're not found in the current scope.
25
- #
26
- # @return [Array]
27
- #
28
- LOOKUP_PARENT = [
29
- :instance_variable,
30
- :class_variable,
31
- :global_variable,
32
- :method,
33
- :instance_method,
34
- :constant
35
- ]
36
-
37
- ##
38
- # Hash containing the default options and values to use when creating a new
39
- # instance of this class.
40
- #
41
- # @return [Hash]
42
- #
43
- DEFAULT_OPTIONS = {
44
- :lazy => false,
45
- :kernel => false,
46
- :constant => Object,
47
- :reset => true
48
- }
49
-
50
- ##
51
- # Array containing the parent scopes, set to an empty Array by default.
52
- #
53
- # @return [Array]
54
- #
55
- attr_reader :parent
56
-
57
- ##
58
- # Hash containing all the symbols (local variables, methods, etc) for the
59
- # current scope instance.
60
- #
61
- # @return [Hash]
62
- #
63
- attr_reader :symbols
64
-
65
- ##
66
- # The constant to lazy import child constants from, set to `Object` by
67
- # default.
68
- #
69
- # @return [Mixed]
70
- #
71
- attr_reader :constant
72
-
73
- ##
74
- # An array containing all the constant names that belong to the constant
75
- # set in {RubyLint::Definition#constant}. Each name is saved as a String.
76
- #
77
- # @return [Array]
78
- #
79
- attr_reader :constants
80
-
81
- ##
82
- # Creates a new instance of the scope class and sets the default symbols.
83
- #
84
- # @param [Array|RubyLint::Definition] parent The parent scope(s). Set this to
85
- # an Array of {RubyLint::Definition} instances to use multiple parent scopes.
86
- # @param [Hash] options A hash containing custom options.
87
- #
88
- # @option options [TrueClass|FalseClass] :lazy When set to `true` missing
89
- # constants will be lazy loaded.
90
- # @option options [TrueClass|FalseClass] :kernel When set to `true` the
91
- # Kernel constant will be loaded by default.
92
- # @option options [Class] :constant The constant to use for importing other
93
- # constants, set to `Object` by default.
94
- # @option options [TrueClass|FalseClass] :reset When set to `true` the
95
- # `value` attribute of the token will be set to `nil`
96
- # @option options [RubyLint::Token::Token] :token The token to set for the
97
- # scope.
98
- #
99
- def initialize(parent = [], options = {})
100
- parent = [parent] unless parent.is_a?(Array)
101
-
102
- @options = DEFAULT_OPTIONS.merge(options)
103
- @parent = parent.select { |p| p.is_a?(Definition) }
104
- @symbols = {
105
- :local_variable => {},
106
- :instance_variable => {},
107
- :class_variable => {},
108
- :global_variable => {},
109
- :constant => {},
110
- :method => {},
111
- :instance_method => {}
112
- }
113
-
114
- if @options[:token]
115
- self.token = @options[:token]
116
- end
117
-
118
- if options[:lazy] and options[:kernel]
119
- @symbols[:constant] = ConstantImporter.import(['Kernel'])
120
- end
121
-
122
- # Import the default global variables.
123
- if options[:kernel]
124
- Kernel.global_variables.each do |name|
125
- name = name.to_s
126
- token = Token::VariableToken.new(
127
- :name => name,
128
- :type => :global_variable
129
- )
130
-
131
- add(:global_variable, name, Definition.new([], :token => token))
132
- end
133
- end
134
- end
135
-
136
- ##
137
- # Adds a new symbol to the scope.
138
- #
139
- # @param [#to_sym] type The type of symbol to add.
140
- # @param [String] name The name of the symbol.
141
- # @param [Mixed] value The value to store under the specified name.
142
- #
143
- def add(type, name, value = nil)
144
- @symbols[type.to_sym][name] = value
145
- end
146
-
147
- ##
148
- # Looks up a symbol in the current and parent scopes (if there are any).
149
- #
150
- # @param [#to_sym] type The type of symbol to look up.
151
- # @param [String] name The name of the symbol to look up.
152
- #
153
- def lookup(type, name)
154
- name = name.to_s unless name.is_a?(String)
155
- symbol = nil
156
- type = type.to_sym
157
-
158
- if @symbols[type] and @symbols[type][name]
159
- symbol = @symbols[type][name]
160
- # Look up the variable in the parent scope(s) (if any are set).
161
- elsif lookup_parent?(type)
162
- @parent.each do |parent|
163
- parent_symbol = parent.lookup(type, name)
164
-
165
- if parent_symbol
166
- symbol = parent_symbol
167
- break
168
- end
169
- end
170
- end
171
-
172
- # Lazy import the constant if it exists.
173
- if !symbol and lazy_load?(name, type)
174
- @symbols[:constant] = @symbols[:constant].merge(
175
- ConstantImporter.import([name], @options[:constant])
176
- )
177
-
178
- symbol = lookup(type, name)
179
- end
180
-
181
- return symbol
182
- end
183
-
184
- ##
185
- # Returns the token associated with the scope.
186
- #
187
- # @return [RubyLint::Token::Token|NilClass]
188
- #
189
- def token
190
- return @options[:token]
191
- end
192
-
193
- ##
194
- # Sets the token of the scope.
195
- #
196
- # @param [RubyLint::Token::Token] token The token to use.
197
- #
198
- def token=(token)
199
- @options[:token] = token.dup
200
- @options[:token].value = nil if @options[:reset]
201
- end
202
-
203
- private
204
-
205
- ##
206
- # Returns a boolean that indicates if the specified symbol should be lazy
207
- # loaded.
208
- #
209
- # @param [#to_sym] name The name of the symbol.
210
- # @param [Symbol] type The type of the symbol.
211
- # @return [TrueClass|FalseClass]
212
- #
213
- def lazy_load?(name, type)
214
- return @options[:lazy] \
215
- && type == :constant \
216
- && @options[:constant].constants.include?(name.to_sym)
217
- end
218
-
219
- ##
220
- # Returns a boolean that indicates if the current symbol type should be
221
- # looked up in a parent definition.
222
- #
223
- # @param [Symbol] type The type of symbol.
224
- # @return [Trueclass|FalseClass]
225
- #
226
- def lookup_parent?(type)
227
- return LOOKUP_PARENT.include?(type) && !@parent.empty?
228
- end
229
- end # Definition
230
- end # RubyLint