rubocop 0.12.0 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rubocop might be problematic. Click here for more details.

Files changed (279) hide show
  1. data/CHANGELOG.md +40 -0
  2. data/README.md +49 -8
  3. data/config/default.yml +40 -0
  4. data/config/enabled.yml +37 -9
  5. data/lib/rubocop.rb +24 -10
  6. data/lib/rubocop/cli.rb +41 -106
  7. data/lib/rubocop/config.rb +3 -2
  8. data/lib/rubocop/cop/commissioner.rb +15 -5
  9. data/lib/rubocop/cop/cop.rb +47 -32
  10. data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
  11. data/lib/rubocop/cop/lint/block_alignment.rb +30 -9
  12. data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
  13. data/lib/rubocop/cop/lint/end_alignment.rb +4 -4
  14. data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
  15. data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
  16. data/lib/rubocop/cop/lint/eval.rb +1 -3
  17. data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
  18. data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -4
  19. data/lib/rubocop/cop/lint/loop.rb +1 -1
  20. data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
  21. data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
  22. data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +5 -8
  23. data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
  24. data/lib/rubocop/cop/lint/useless_assignment.rb +57 -60
  25. data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
  26. data/lib/rubocop/cop/lint/useless_setter_call.rb +85 -0
  27. data/lib/rubocop/cop/lint/void.rb +6 -8
  28. data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
  29. data/lib/rubocop/cop/rails/read_attribute.rb +1 -1
  30. data/lib/rubocop/cop/rails/validation.rb +1 -1
  31. data/lib/rubocop/cop/style/access_control.rb +4 -6
  32. data/lib/rubocop/cop/style/alias.rb +1 -3
  33. data/lib/rubocop/cop/style/align_array.rb +47 -0
  34. data/lib/rubocop/cop/style/align_hash.rb +145 -0
  35. data/lib/rubocop/cop/style/align_parameters.rb +9 -3
  36. data/lib/rubocop/cop/style/and_or.rb +3 -4
  37. data/lib/rubocop/cop/style/ascii_comments.rb +1 -3
  38. data/lib/rubocop/cop/style/ascii_identifiers.rb +1 -1
  39. data/lib/rubocop/cop/style/attr.rb +1 -4
  40. data/lib/rubocop/cop/style/begin_block.rb +1 -1
  41. data/lib/rubocop/cop/style/block_comments.rb +1 -1
  42. data/lib/rubocop/cop/style/block_nesting.rb +2 -2
  43. data/lib/rubocop/cop/style/blocks.rb +14 -2
  44. data/lib/rubocop/cop/style/case_equality.rb +1 -3
  45. data/lib/rubocop/cop/style/case_indentation.rb +1 -1
  46. data/lib/rubocop/cop/style/character_literal.rb +1 -2
  47. data/lib/rubocop/cop/style/class_and_module_camel_case.rb +1 -1
  48. data/lib/rubocop/cop/style/class_methods.rb +1 -3
  49. data/lib/rubocop/cop/style/{avoid_class_vars.rb → class_vars.rb} +6 -2
  50. data/lib/rubocop/cop/style/collection_methods.rb +7 -9
  51. data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
  52. data/lib/rubocop/cop/style/comment_annotation.rb +6 -6
  53. data/lib/rubocop/cop/style/constant_name.rb +1 -3
  54. data/lib/rubocop/cop/style/def_parentheses.rb +4 -12
  55. data/lib/rubocop/cop/style/documentation.rb +2 -2
  56. data/lib/rubocop/cop/style/dot_position.rb +2 -4
  57. data/lib/rubocop/cop/style/empty_line_between_defs.rb +21 -6
  58. data/lib/rubocop/cop/style/empty_lines.rb +1 -1
  59. data/lib/rubocop/cop/style/empty_literal.rb +3 -12
  60. data/lib/rubocop/cop/style/encoding.rb +6 -6
  61. data/lib/rubocop/cop/style/end_block.rb +1 -1
  62. data/lib/rubocop/cop/style/end_of_line.rb +5 -5
  63. data/lib/rubocop/cop/style/even_odd.rb +2 -2
  64. data/lib/rubocop/cop/style/favor_join.rb +1 -3
  65. data/lib/rubocop/cop/style/favor_modifier.rb +7 -3
  66. data/lib/rubocop/cop/style/favor_sprintf.rb +1 -1
  67. data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +1 -1
  68. data/lib/rubocop/cop/style/final_newline.rb +23 -0
  69. data/lib/rubocop/cop/style/{avoid_for.rb → for.rb} +2 -2
  70. data/lib/rubocop/cop/style/{avoid_global_vars.rb → global_vars.rb} +19 -6
  71. data/lib/rubocop/cop/style/hash_methods.rb +3 -5
  72. data/lib/rubocop/cop/style/hash_syntax.rb +4 -4
  73. data/lib/rubocop/cop/style/if_then_else.rb +1 -1
  74. data/lib/rubocop/cop/style/indentation_width.rb +4 -4
  75. data/lib/rubocop/cop/style/lambda.rb +2 -2
  76. data/lib/rubocop/cop/style/leading_comment_space.rb +1 -1
  77. data/lib/rubocop/cop/style/line_length.rb +7 -8
  78. data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +1 -1
  79. data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -4
  80. data/lib/rubocop/cop/style/method_length.rb +4 -4
  81. data/lib/rubocop/cop/style/module_function.rb +1 -3
  82. data/lib/rubocop/cop/style/multiline_block_chain.rb +44 -0
  83. data/lib/rubocop/cop/style/nil_comparison.rb +1 -3
  84. data/lib/rubocop/cop/style/not.rb +1 -1
  85. data/lib/rubocop/cop/style/numeric_literals.rb +26 -6
  86. data/lib/rubocop/cop/style/op_method.rb +2 -2
  87. data/lib/rubocop/cop/style/parameter_lists.rb +4 -4
  88. data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
  89. data/lib/rubocop/cop/style/perl_backrefs.rb +26 -0
  90. data/lib/rubocop/cop/style/proc.rb +1 -3
  91. data/lib/rubocop/cop/style/reduce_arguments.rb +7 -5
  92. data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
  93. data/lib/rubocop/cop/style/redundant_return.rb +9 -2
  94. data/lib/rubocop/cop/style/redundant_self.rb +9 -2
  95. data/lib/rubocop/cop/style/regexp_literal.rb +7 -8
  96. data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
  97. data/lib/rubocop/cop/style/semicolon.rb +10 -10
  98. data/lib/rubocop/cop/style/signal_exception.rb +2 -4
  99. data/lib/rubocop/cop/style/single_line_methods.rb +2 -4
  100. data/lib/rubocop/cop/style/space_after_comma_etc.rb +1 -1
  101. data/lib/rubocop/cop/style/space_after_control_keyword.rb +1 -1
  102. data/lib/rubocop/cop/style/space_after_method_name.rb +1 -1
  103. data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +34 -0
  104. data/lib/rubocop/cop/style/{avoid_perlisms.rb → special_global_vars.rb} +17 -8
  105. data/lib/rubocop/cop/style/string_literals.rb +1 -2
  106. data/lib/rubocop/cop/style/surrounding_space.rb +9 -8
  107. data/lib/rubocop/cop/style/symbol_array.rb +1 -1
  108. data/lib/rubocop/cop/style/symbol_name.rb +9 -2
  109. data/lib/rubocop/cop/style/tab.rb +5 -5
  110. data/lib/rubocop/cop/style/ternary_operator.rb +2 -6
  111. data/lib/rubocop/cop/style/trailing_blank_lines.rb +32 -0
  112. data/lib/rubocop/cop/style/trailing_whitespace.rb +5 -6
  113. data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
  114. data/lib/rubocop/cop/style/unless_else.rb +1 -1
  115. data/lib/rubocop/cop/style/variable_interpolation.rb +1 -3
  116. data/lib/rubocop/cop/style/when_then.rb +1 -4
  117. data/lib/rubocop/cop/style/while_until_do.rb +7 -5
  118. data/lib/rubocop/cop/style/word_array.rb +1 -1
  119. data/lib/rubocop/cop/team.rb +100 -0
  120. data/lib/rubocop/cop/variable_inspector.rb +323 -235
  121. data/lib/rubocop/cop/variable_inspector/assignment.rb +103 -0
  122. data/lib/rubocop/cop/variable_inspector/locatable.rb +162 -0
  123. data/lib/rubocop/cop/variable_inspector/reference.rb +31 -0
  124. data/lib/rubocop/cop/variable_inspector/scope.rb +70 -0
  125. data/lib/rubocop/cop/variable_inspector/variable.rb +87 -0
  126. data/lib/rubocop/cop/variable_inspector/variable_table.rb +129 -0
  127. data/lib/rubocop/formatter/json_formatter.rb +8 -8
  128. data/lib/rubocop/formatter/progress_formatter.rb +4 -4
  129. data/lib/rubocop/processed_source.rb +22 -1
  130. data/lib/rubocop/version.rb +1 -1
  131. data/rubocop.gemspec +1 -1
  132. data/spec/rubocop/cli_spec.rb +32 -30
  133. data/spec/rubocop/config_spec.rb +4 -6
  134. data/spec/rubocop/cop/commissioner_spec.rb +4 -5
  135. data/spec/rubocop/cop/cop_spec.rb +8 -26
  136. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +5 -9
  137. data/spec/rubocop/cop/lint/block_alignment_spec.rb +105 -57
  138. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +1 -1
  139. data/spec/rubocop/cop/lint/end_alignment_spec.rb +1 -1
  140. data/spec/rubocop/cop/lint/end_in_method_spec.rb +1 -1
  141. data/spec/rubocop/cop/lint/ensure_return_spec.rb +1 -1
  142. data/spec/rubocop/cop/lint/eval_spec.rb +3 -3
  143. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +2 -2
  144. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +1 -1
  145. data/spec/rubocop/cop/lint/loop_spec.rb +1 -1
  146. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +1 -1
  147. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +5 -5
  148. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +1 -1
  149. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1545 -108
  150. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +1 -1
  151. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +101 -0
  152. data/spec/rubocop/cop/lint/void_spec.rb +1 -1
  153. data/spec/rubocop/cop/offence_spec.rb +4 -4
  154. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +1 -1
  155. data/spec/rubocop/cop/rails/read_attribute_spec.rb +1 -1
  156. data/spec/rubocop/cop/rails/validation_spec.rb +1 -1
  157. data/spec/rubocop/cop/style/access_control_spec.rb +20 -20
  158. data/spec/rubocop/cop/style/alias_spec.rb +3 -3
  159. data/spec/rubocop/cop/style/align_array_spec.rb +62 -0
  160. data/spec/rubocop/cop/style/align_hash_spec.rb +267 -0
  161. data/spec/rubocop/cop/style/align_parameters_spec.rb +2 -2
  162. data/spec/rubocop/cop/style/and_or_spec.rb +1 -1
  163. data/spec/rubocop/cop/style/ascii_comments_spec.rb +2 -2
  164. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +2 -2
  165. data/spec/rubocop/cop/style/attr_spec.rb +1 -1
  166. data/spec/rubocop/cop/style/begin_block_spec.rb +1 -1
  167. data/spec/rubocop/cop/style/block_comments_spec.rb +1 -1
  168. data/spec/rubocop/cop/style/block_nesting_spec.rb +3 -3
  169. data/spec/rubocop/cop/style/blocks_spec.rb +25 -1
  170. data/spec/rubocop/cop/style/case_equality_spec.rb +1 -1
  171. data/spec/rubocop/cop/style/case_indentation_spec.rb +5 -5
  172. data/spec/rubocop/cop/style/character_literal_spec.rb +1 -1
  173. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +1 -1
  174. data/spec/rubocop/cop/style/class_methods_spec.rb +1 -1
  175. data/spec/rubocop/cop/style/class_vars_spec.rb +25 -0
  176. data/spec/rubocop/cop/style/collection_methods_spec.rb +5 -6
  177. data/spec/rubocop/cop/style/colon_method_call_spec.rb +0 -3
  178. data/spec/rubocop/cop/style/comment_annotation_spec.rb +20 -18
  179. data/spec/rubocop/cop/style/constant_name_spec.rb +1 -1
  180. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +1 -1
  181. data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +1 -1
  182. data/spec/rubocop/cop/style/documentation_spec.rb +1 -1
  183. data/spec/rubocop/cop/style/dot_position_spec.rb +5 -5
  184. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +35 -4
  185. data/spec/rubocop/cop/style/empty_lines_spec.rb +1 -1
  186. data/spec/rubocop/cop/style/empty_literal_spec.rb +7 -7
  187. data/spec/rubocop/cop/style/encoding_spec.rb +11 -5
  188. data/spec/rubocop/cop/style/end_block_spec.rb +1 -1
  189. data/spec/rubocop/cop/style/end_of_line_spec.rb +4 -3
  190. data/spec/rubocop/cop/style/even_odd_spec.rb +1 -1
  191. data/spec/rubocop/cop/style/favor_join_spec.rb +2 -2
  192. data/spec/rubocop/cop/style/favor_modifier_spec.rb +13 -10
  193. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +4 -4
  194. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +1 -1
  195. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +4 -4
  196. data/spec/rubocop/cop/style/final_newline_spec.rb +25 -0
  197. data/spec/rubocop/cop/style/{avoid_for_spec.rb → for_spec.rb} +8 -12
  198. data/spec/rubocop/cop/style/{avoid_global_vars_spec.rb → global_vars_spec.rb} +13 -3
  199. data/spec/rubocop/cop/style/hash_methods_spec.rb +1 -1
  200. data/spec/rubocop/cop/style/hash_syntax_spec.rb +20 -9
  201. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +3 -3
  202. data/spec/rubocop/cop/style/indentation_width_spec.rb +19 -19
  203. data/spec/rubocop/cop/style/lambda_spec.rb +6 -6
  204. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +1 -1
  205. data/spec/rubocop/cop/style/line_length_spec.rb +3 -3
  206. data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +8 -9
  207. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +1 -1
  208. data/spec/rubocop/cop/style/method_length_spec.rb +18 -17
  209. data/spec/rubocop/cop/style/module_function_spec.rb +1 -1
  210. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +84 -0
  211. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +2 -2
  212. data/spec/rubocop/cop/style/nil_comparison_spec.rb +1 -1
  213. data/spec/rubocop/cop/style/not_spec.rb +1 -1
  214. data/spec/rubocop/cop/style/numeric_literals_spec.rb +15 -25
  215. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +2 -2
  216. data/spec/rubocop/cop/style/op_method_spec.rb +3 -3
  217. data/spec/rubocop/cop/style/parameter_lists_spec.rb +5 -5
  218. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +4 -8
  219. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +23 -0
  220. data/spec/rubocop/cop/style/proc_spec.rb +1 -1
  221. data/spec/rubocop/cop/style/reduce_arguments_spec.rb +18 -11
  222. data/spec/rubocop/cop/style/redundant_begin_spec.rb +1 -1
  223. data/spec/rubocop/cop/style/redundant_return_spec.rb +16 -1
  224. data/spec/rubocop/cop/style/redundant_self_spec.rb +6 -1
  225. data/spec/rubocop/cop/style/regexp_literal_spec.rb +19 -23
  226. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +3 -3
  227. data/spec/rubocop/cop/style/semicolon_spec.rb +3 -3
  228. data/spec/rubocop/cop/style/signal_exception_spec.rb +1 -1
  229. data/spec/rubocop/cop/style/single_line_methods_spec.rb +22 -18
  230. data/spec/rubocop/cop/style/space_after_colon_spec.rb +4 -4
  231. data/spec/rubocop/cop/style/space_after_comma_spec.rb +4 -4
  232. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +1 -1
  233. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +1 -1
  234. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +3 -3
  235. data/spec/rubocop/cop/style/space_around_braces_spec.rb +13 -12
  236. data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +3 -3
  237. data/spec/rubocop/cop/style/space_around_operators_spec.rb +25 -25
  238. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +53 -0
  239. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +9 -9
  240. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +47 -61
  241. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +4 -4
  242. data/spec/rubocop/cop/style/special_global_vars_spec.rb +52 -0
  243. data/spec/rubocop/cop/style/string_literals_spec.rb +5 -5
  244. data/spec/rubocop/cop/style/symbol_array_spec.rb +1 -1
  245. data/spec/rubocop/cop/style/symbol_name_spec.rb +27 -18
  246. data/spec/rubocop/cop/style/tab_spec.rb +1 -1
  247. data/spec/rubocop/cop/style/ternary_operator_spec.rb +2 -2
  248. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +24 -0
  249. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +7 -7
  250. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +6 -14
  251. data/spec/rubocop/cop/style/unless_else_spec.rb +3 -3
  252. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +5 -5
  253. data/spec/rubocop/cop/style/when_then_spec.rb +15 -15
  254. data/spec/rubocop/cop/style/while_until_do_spec.rb +3 -3
  255. data/spec/rubocop/cop/style/word_array_spec.rb +1 -1
  256. data/spec/rubocop/cop/team_spec.rb +158 -0
  257. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +217 -0
  258. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +740 -0
  259. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +191 -0
  260. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +79 -0
  261. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +275 -0
  262. data/spec/rubocop/cop/variable_inspector_spec.rb +13 -533
  263. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +4 -4
  264. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +1 -1
  265. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +3 -3
  266. data/spec/rubocop/formatter/file_list_formatter_spec.rb +3 -3
  267. data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
  268. data/spec/spec_helper.rb +5 -1
  269. data/spec/support/ast_helper.rb +15 -0
  270. data/spec/support/shared_context.rb +18 -0
  271. data/spec/support/shared_examples.rb +1 -1
  272. metadata +95 -32
  273. checksums.yaml +0 -7
  274. data/lib/rubocop/cop/lint/unused_local_variable.rb +0 -32
  275. data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +0 -19
  276. data/spec/rubocop/cop/lint/unused_local_variable_spec.rb +0 -588
  277. data/spec/rubocop/cop/style/avoid_class_vars_spec.rb +0 -27
  278. data/spec/rubocop/cop/style/avoid_perl_backrefs_spec.rb +0 -20
  279. data/spec/rubocop/cop/style/avoid_perlisms_spec.rb +0 -47
@@ -4,546 +4,26 @@ require 'spec_helper'
4
4
 
5
5
  module Rubocop
6
6
  module Cop
7
- module VariableInspector
8
- describe VariableEntry do
9
- include AST::Sexp
7
+ describe VariableInspector do
8
+ include AST::Sexp
10
9
 
11
- describe '.new' do
12
- context 'when non variable declaration node is passed' do
13
- it 'raises error' do
14
- node = s(:def)
15
- expect { VariableEntry.new(node) }.to raise_error(ArgumentError)
16
- end
17
- end
18
- end
19
- end
20
-
21
- describe Scope do
22
- include AST::Sexp
23
-
24
- describe '.new' do
25
- context 'when non scope node is passed' do
26
- it 'raises error' do
27
- node = s(:lvasgn)
28
- expect { Scope.new(node) }.to raise_error(ArgumentError)
29
- end
30
- end
31
-
32
- context 'when begin node is passed' do
33
- it 'accepts that as pseudo scope for top level scope' do
34
- node = s(:begin)
35
- expect { Scope.new(node) }.not_to raise_error
36
- end
37
- end
38
- end
10
+ class ExampleInspector
11
+ include VariableInspector
39
12
  end
40
13
 
41
- describe VariableTable do
42
- include AST::Sexp
43
-
44
- subject(:variable_table) { VariableTable.new }
45
-
46
- describe '#push_scope' do
47
- it 'returns pushed scope object' do
48
- node = s(:def)
49
- scope = variable_table.push_scope(node)
50
- expect(scope).to equal(variable_table.current_scope)
51
- expect(scope.node).to equal(node)
52
- end
53
- end
54
-
55
- describe '#pop_scope' do
56
- before do
57
- node = s(:def)
58
- variable_table.push_scope(node)
59
- end
60
-
61
- it 'returns popped scope object' do
62
- last_scope = variable_table.current_scope
63
- popped_scope = variable_table.pop_scope
64
- expect(popped_scope).to equal(last_scope)
65
- end
66
- end
67
-
68
- describe '#current_scope_level' do
69
- before do
70
- variable_table.push_scope(s(:def))
71
- end
72
-
73
- it 'increases by pushing scope' do
74
- last_scope_level = variable_table.current_scope_level
75
- variable_table.push_scope(s(:def))
76
- expect(variable_table.current_scope_level)
77
- .to eq(last_scope_level + 1)
78
- end
14
+ subject(:inspector) { ExampleInspector.new }
79
15
 
80
- it 'decreases by popping scope' do
81
- last_scope_level = variable_table.current_scope_level
82
- variable_table.pop_scope
83
- expect(variable_table.current_scope_level)
84
- .to eq(last_scope_level - 1)
85
- end
16
+ describe '#process_node' do
17
+ before do
18
+ inspector.variable_table.push_scope(s(:def))
86
19
  end
87
20
 
88
- describe '#add_variable_entry' do
89
- before do
90
- 2.times do
91
- node = s(:def)
92
- variable_table.push_scope(node)
93
- end
94
- end
95
-
96
- it 'adds variable entry to current scope with its name as key' do
97
- node = s(:lvasgn, :foo)
98
- variable_table.add_variable_entry(node)
99
- expect(variable_table.current_scope.variable_entries)
100
- .to have_key(:foo)
101
- expect(variable_table.scope_stack[-2].variable_entries)
102
- .to be_empty
103
- entry = variable_table.current_scope.variable_entries[:foo]
104
- expect(entry.node).to equal(node)
105
- end
106
-
107
- it 'returns the added variable entry' do
108
- node = s(:lvasgn, :foo)
109
- entry = variable_table.add_variable_entry(node)
110
- expect(entry.node).to equal(node)
111
- end
112
- end
113
-
114
- describe '#find_variable_entry' do
115
- before do
116
- variable_table.push_scope(s(:class))
117
- variable_table.add_variable_entry(s(:lvasgn, :baz))
118
-
119
- variable_table.push_scope(s(:def))
120
- variable_table.add_variable_entry(s(:lvasgn, :bar))
121
- end
122
-
123
- context 'when current scope is block' do
124
- before do
125
- variable_table.push_scope(s(:block))
126
- end
127
-
128
- context 'when a variable with the target name exists ' +
129
- 'in current scope' do
130
- before do
131
- variable_table.add_variable_entry(s(:lvasgn, :foo))
132
- end
133
-
134
- context 'and does not exist in outer scope' do
135
- it 'returns the current scope variable entry' do
136
- found_entry = variable_table.find_variable_entry(:foo)
137
- expect(found_entry.name).to eq(:foo)
138
- end
139
- end
140
-
141
- context 'and also exists in outer scope' do
142
- before do
143
- variable_table.add_variable_entry(s(:lvasgn, :bar))
144
- end
145
-
146
- it 'returns the current scope variable entry' do
147
- found_entry = variable_table.find_variable_entry(:bar)
148
- expect(found_entry.name).to equal(:bar)
149
- expect(variable_table.current_scope.variable_entries)
150
- .to have_value(found_entry)
151
- expect(variable_table.scope_stack[-2].variable_entries)
152
- .not_to have_value(found_entry)
153
- end
154
- end
155
- end
156
-
157
- context 'when a variable with the target name does not exist ' +
158
- 'in current scope' do
159
- context 'but exists in the direct outer scope' do
160
- it 'returns the direct outer scope variable entry' do
161
- found_entry = variable_table.find_variable_entry(:bar)
162
- expect(found_entry.name).to equal(:bar)
163
- end
164
- end
165
-
166
- context 'but exists in a indirect outer scope' do
167
- context 'when the direct outer scope is block' do
168
- before do
169
- variable_table.pop_scope
170
- variable_table.pop_scope
171
-
172
- variable_table.push_scope(s(:block))
173
- variable_table.push_scope(s(:block))
174
- end
175
-
176
- it 'returns the indirect outer scope variable entry' do
177
- found_entry = variable_table.find_variable_entry(:baz)
178
- expect(found_entry.name).to equal(:baz)
179
- end
180
- end
181
-
182
- context 'when the direct outer scope is not block' do
183
- it 'returns nil' do
184
- found_entry = variable_table.find_variable_entry(:baz)
185
- expect(found_entry).to be_nil
186
- end
187
- end
188
- end
189
-
190
- context 'and does not exist in all outer scopes' do
191
- it 'returns nil' do
192
- found_entry = variable_table.find_variable_entry(:non)
193
- expect(found_entry).to be_nil
194
- end
195
- end
196
- end
197
- end
198
-
199
- context 'when current scope is not block' do
200
- before do
201
- variable_table.push_scope(s(:def))
202
- end
203
-
204
- context 'when a variable with the target name exists ' +
205
- 'in current scope' do
206
- before do
207
- variable_table.add_variable_entry(s(:lvasgn, :foo))
208
- end
209
-
210
- context 'and does not exist in outer scope' do
211
- it 'returns the current scope variable entry' do
212
- found_entry = variable_table.find_variable_entry(:foo)
213
- expect(found_entry.name).to eq(:foo)
214
- end
215
- end
216
-
217
- context 'and also exists in outer scope' do
218
- it 'returns the current scope variable entry' do
219
- found_entry = variable_table.find_variable_entry(:foo)
220
- expect(found_entry.name).to equal(:foo)
221
- expect(variable_table.current_scope.variable_entries)
222
- .to have_value(found_entry)
223
- expect(variable_table.scope_stack[-2].variable_entries)
224
- .not_to have_value(found_entry)
225
- end
226
- end
227
- end
228
-
229
- context 'when a variable with the target name does not exist ' +
230
- 'in current scope' do
231
- context 'but exists in the direct outer scope' do
232
- it 'returns nil' do
233
- found_entry = variable_table.find_variable_entry(:bar)
234
- expect(found_entry).to be_nil
235
- end
236
- end
237
-
238
- context 'and does not exist in all outer scopes' do
239
- it 'returns nil' do
240
- found_entry = variable_table.find_variable_entry(:non)
241
- expect(found_entry).to be_nil
242
- end
243
- end
244
- end
245
- end
246
- end
247
- end
248
-
249
- describe NodeScanner do
250
- describe '.scan_nodes_in_scope' do
251
- let(:ast) do
252
- processed_source = Rubocop::SourceParser.parse(source)
253
- processed_source.ast
254
- end
255
-
256
- let(:source) do
257
- <<-END
258
- class SomeClass
259
- foo = 1.to_s
260
- bar = 2.to_s
261
- def some_method
262
- baz = 3.to_s
263
- end
264
- end
265
- END
266
- end
267
-
268
- # (class
269
- # (const nil :SomeClass) nil
270
- # (begin
271
- # (lvasgn :foo
272
- # (send
273
- # (int 1) :to_s))
274
- # (lvasgn :bar
275
- # (send
276
- # (int 2) :to_s))
277
- # (def :some_method
278
- # (args)
279
- # (lvasgn :baz
280
- # (send
281
- # (int 3) :to_s)))))
282
-
283
- it 'does not scan children of inner scope node' do
284
- scanned_node_count = 0
285
-
286
- NodeScanner.scan_nodes_in_scope(ast) do |node|
287
- scanned_node_count += 1
288
- fail if node.type == :lvasgn && node.children.first == :baz
289
- end
290
-
291
- expect(scanned_node_count).to eq(9)
292
- end
293
-
294
- it 'scans nodes with depth first order' do
295
- index = 0
296
-
297
- NodeScanner.scan_nodes_in_scope(ast) do |node|
298
- case index
299
- when 0
300
- expect(node.type).to eq(:const)
301
- when 1
302
- expect(node.type).to eq(:begin)
303
- when 2
304
- expect(node.type).to eq(:lvasgn)
305
- when 3
306
- expect(node.type).to eq(:send)
307
- when 4
308
- expect(node.type).to eq(:int)
309
- when 5
310
- expect(node.type).to eq(:lvasgn)
311
- end
312
-
313
- index += 1
314
- end
315
-
316
- expect(index).not_to eq(0)
317
- end
318
-
319
- let(:trace) { [] }
320
-
321
- before do
322
- NodeScanner.scan_nodes_in_scope(ast) do |node|
323
- short_info = node.type.to_s
324
- node.children.each do |child|
325
- break if child.is_a?(Parser::AST::Node)
326
- short_info << " #{child.inspect}"
327
- end
328
- trace << short_info
329
- end
330
- end
331
-
332
- context 'when invoking a method ' +
333
- 'which is taking block and normal arguments' do
334
- let(:source) do
335
- <<-END
336
- some_method(foo = 1) do |block_arg|
337
- content_of_block = 2
338
- end
339
- puts foo
340
- END
341
- end
342
-
343
- # (begin
344
- # (block
345
- # (send nil :some_method
346
- # (lvasgn :foo
347
- # (int 1)))
348
- # (args
349
- # (arg :block_arg))
350
- # (lvasgn :content_of_block
351
- # (int 2)))
352
- # (send nil :puts
353
- # (lvar :foo)))
354
-
355
- it 'scans the method node and its normal argument nodes' do
356
- expect(trace).to eq([
357
- 'block',
358
- 'send nil :some_method',
359
- 'lvasgn :foo',
360
- 'int 1',
361
- 'send nil :puts',
362
- 'lvar :foo'
363
- ])
364
- end
365
- end
366
-
367
- context 'when opening singleton class of an instance' do
368
- let(:source) do
369
- <<-END
370
- instance = Object.new
371
- class << instance
372
- content_of_singleton_class = 1
373
- end
374
- p instance
375
- END
376
- end
377
-
378
- # (begin
379
- # (lvasgn :instance
380
- # (send
381
- # (const nil :Object) :new))
382
- # (sclass
383
- # (lvar :instance)
384
- # (lvasgn :content_of_singleton_class
385
- # (int 1)))
386
- # (send nil :p
387
- # (lvar :instance)))
388
-
389
- it 'scans the subject instance node' do
390
- expect(trace).to eq([
391
- 'lvasgn :instance',
392
- 'send',
393
- 'const nil :Object',
394
- 'sclass',
395
- 'lvar :instance',
396
- 'send nil :p',
397
- 'lvar :instance'
398
- ])
399
- end
400
- end
401
-
402
- context 'when defining singleton method' do
403
- let(:source) do
404
- <<-END
405
- instance = Object.new
406
- def instance.some_method(method_arg)
407
- content_of_method = 2
408
- end
409
- p instance
410
- END
411
- end
412
-
413
- # (begin
414
- # (lvasgn :instance
415
- # (send
416
- # (const nil :Object) :new))
417
- # (defs
418
- # (lvar :instance) :some_method
419
- # (args
420
- # (arg :method_arg))
421
- # (lvasgn :content_of_method
422
- # (int 2)))
423
- # (send nil :p
424
- # (lvar :instance)))
425
-
426
- it 'scans the subject instance node' do
427
- expect(trace).to eq([
428
- 'lvasgn :instance',
429
- 'send',
430
- 'const nil :Object',
431
- 'defs',
432
- 'lvar :instance',
433
- 'send nil :p',
434
- 'lvar :instance'
435
- ])
436
- end
437
- end
438
-
439
- context 'when scanning around post while loop' do
440
- let(:source) do
441
- <<-END
442
- begin
443
- foo = 1
444
- end while foo > 10
445
- puts foo
446
- END
447
- end
448
-
449
- # (begin
450
- # (while-post
451
- # (send
452
- # (lvar :foo) :>
453
- # (int 10))
454
- # (kwbegin
455
- # (lvasgn :foo
456
- # (int 1))))
457
- # (send nil :puts
458
- # (lvar :foo)))
459
-
460
- it 'scans loop body nodes first then condition nodes' do
461
- expect(trace).to eq([
462
- 'while_post',
463
- 'kwbegin',
464
- 'lvasgn :foo',
465
- 'int 1',
466
- 'send',
467
- 'lvar :foo',
468
- 'int 10',
469
- 'send nil :puts',
470
- 'lvar :foo'
471
- ])
472
- end
473
- end
474
-
475
- context 'when scanning around post until loop' do
476
- let(:source) do
477
- <<-END
478
- begin
479
- foo = 1
480
- end until foo < 10
481
- puts foo
482
- END
483
- end
484
-
485
- # (begin
486
- # (until-post
487
- # (send
488
- # (lvar :foo) :<
489
- # (int 10))
490
- # (kwbegin
491
- # (lvasgn :foo
492
- # (int 1))))
493
- # (send nil :puts
494
- # (lvar :foo)))
495
-
496
- it 'scans loop body nodes first then condition nodes' do
497
- expect(trace).to eq([
498
- 'until_post',
499
- 'kwbegin',
500
- 'lvasgn :foo',
501
- 'int 1',
502
- 'send',
503
- 'lvar :foo',
504
- 'int 10',
505
- 'send nil :puts',
506
- 'lvar :foo'
507
- ])
508
- end
509
- end
510
- end
511
- end
512
-
513
- describe VariableInspector do
514
- include AST::Sexp
515
-
516
- class ExampleInspector
517
- include VariableInspector
518
- end
519
-
520
- subject(:inspector) { ExampleInspector.new }
521
-
522
- describe '#process_node' do
523
- before do
524
- inspector.variable_table.push_scope(s(:def))
525
- end
526
-
527
- context 'when processing lvar node' do
528
- let(:node) { s(:lvar, :foo) }
529
-
530
- context 'when the variable is already declared' do
531
- before do
532
- inspector.variable_table.add_variable_entry(s(:lvasgn, :foo))
533
- end
534
-
535
- it 'marks the variable as used' do
536
- entry = inspector.variable_table.find_variable_entry(:foo)
537
- expect(entry).not_to be_used
538
- inspector.process_node(node)
539
- expect(entry).to be_used
540
- end
541
- end
21
+ context 'when processing lvar node' do
22
+ let(:node) { s(:lvar, :foo) }
542
23
 
543
- context 'when the variable is not yet declared' do
544
- it 'raises error' do
545
- expect { inspector.process_node(node) }.to raise_error
546
- end
24
+ context 'when the variable is not yet declared' do
25
+ it 'does not raise error' do
26
+ expect { inspector.process_node(node) }.not_to raise_error
547
27
  end
548
28
  end
549
29
  end