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.
- data/CHANGELOG.md +40 -0
- data/README.md +49 -8
- data/config/default.yml +40 -0
- data/config/enabled.yml +37 -9
- data/lib/rubocop.rb +24 -10
- data/lib/rubocop/cli.rb +41 -106
- data/lib/rubocop/config.rb +3 -2
- data/lib/rubocop/cop/commissioner.rb +15 -5
- data/lib/rubocop/cop/cop.rb +47 -32
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +2 -2
- data/lib/rubocop/cop/lint/block_alignment.rb +30 -9
- data/lib/rubocop/cop/lint/empty_ensure.rb +1 -1
- data/lib/rubocop/cop/lint/end_alignment.rb +4 -4
- data/lib/rubocop/cop/lint/end_in_method.rb +1 -1
- data/lib/rubocop/cop/lint/ensure_return.rb +1 -1
- data/lib/rubocop/cop/lint/eval.rb +1 -3
- data/lib/rubocop/cop/lint/handle_exceptions.rb +1 -1
- data/lib/rubocop/cop/lint/literal_in_condition.rb +6 -4
- data/lib/rubocop/cop/lint/loop.rb +1 -1
- data/lib/rubocop/cop/lint/parentheses_as_grouped_expression.rb +1 -1
- data/lib/rubocop/cop/lint/rescue_exception.rb +1 -1
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +5 -8
- data/lib/rubocop/cop/lint/unreachable_code.rb +1 -1
- data/lib/rubocop/cop/lint/useless_assignment.rb +57 -60
- data/lib/rubocop/cop/lint/useless_comparison.rb +1 -1
- data/lib/rubocop/cop/lint/useless_setter_call.rb +85 -0
- data/lib/rubocop/cop/lint/void.rb +6 -8
- data/lib/rubocop/cop/rails/has_and_belongs_to_many.rb +1 -1
- data/lib/rubocop/cop/rails/read_attribute.rb +1 -1
- data/lib/rubocop/cop/rails/validation.rb +1 -1
- data/lib/rubocop/cop/style/access_control.rb +4 -6
- data/lib/rubocop/cop/style/alias.rb +1 -3
- data/lib/rubocop/cop/style/align_array.rb +47 -0
- data/lib/rubocop/cop/style/align_hash.rb +145 -0
- data/lib/rubocop/cop/style/align_parameters.rb +9 -3
- data/lib/rubocop/cop/style/and_or.rb +3 -4
- data/lib/rubocop/cop/style/ascii_comments.rb +1 -3
- data/lib/rubocop/cop/style/ascii_identifiers.rb +1 -1
- data/lib/rubocop/cop/style/attr.rb +1 -4
- data/lib/rubocop/cop/style/begin_block.rb +1 -1
- data/lib/rubocop/cop/style/block_comments.rb +1 -1
- data/lib/rubocop/cop/style/block_nesting.rb +2 -2
- data/lib/rubocop/cop/style/blocks.rb +14 -2
- data/lib/rubocop/cop/style/case_equality.rb +1 -3
- data/lib/rubocop/cop/style/case_indentation.rb +1 -1
- data/lib/rubocop/cop/style/character_literal.rb +1 -2
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +1 -1
- data/lib/rubocop/cop/style/class_methods.rb +1 -3
- data/lib/rubocop/cop/style/{avoid_class_vars.rb → class_vars.rb} +6 -2
- data/lib/rubocop/cop/style/collection_methods.rb +7 -9
- data/lib/rubocop/cop/style/colon_method_call.rb +1 -2
- data/lib/rubocop/cop/style/comment_annotation.rb +6 -6
- data/lib/rubocop/cop/style/constant_name.rb +1 -3
- data/lib/rubocop/cop/style/def_parentheses.rb +4 -12
- data/lib/rubocop/cop/style/documentation.rb +2 -2
- data/lib/rubocop/cop/style/dot_position.rb +2 -4
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +21 -6
- data/lib/rubocop/cop/style/empty_lines.rb +1 -1
- data/lib/rubocop/cop/style/empty_literal.rb +3 -12
- data/lib/rubocop/cop/style/encoding.rb +6 -6
- data/lib/rubocop/cop/style/end_block.rb +1 -1
- data/lib/rubocop/cop/style/end_of_line.rb +5 -5
- data/lib/rubocop/cop/style/even_odd.rb +2 -2
- data/lib/rubocop/cop/style/favor_join.rb +1 -3
- data/lib/rubocop/cop/style/favor_modifier.rb +7 -3
- data/lib/rubocop/cop/style/favor_sprintf.rb +1 -1
- data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +1 -1
- data/lib/rubocop/cop/style/final_newline.rb +23 -0
- data/lib/rubocop/cop/style/{avoid_for.rb → for.rb} +2 -2
- data/lib/rubocop/cop/style/{avoid_global_vars.rb → global_vars.rb} +19 -6
- data/lib/rubocop/cop/style/hash_methods.rb +3 -5
- data/lib/rubocop/cop/style/hash_syntax.rb +4 -4
- data/lib/rubocop/cop/style/if_then_else.rb +1 -1
- data/lib/rubocop/cop/style/indentation_width.rb +4 -4
- data/lib/rubocop/cop/style/lambda.rb +2 -2
- data/lib/rubocop/cop/style/leading_comment_space.rb +1 -1
- data/lib/rubocop/cop/style/line_length.rb +7 -8
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +1 -1
- data/lib/rubocop/cop/style/method_call_parentheses.rb +1 -4
- data/lib/rubocop/cop/style/method_length.rb +4 -4
- data/lib/rubocop/cop/style/module_function.rb +1 -3
- data/lib/rubocop/cop/style/multiline_block_chain.rb +44 -0
- data/lib/rubocop/cop/style/nil_comparison.rb +1 -3
- data/lib/rubocop/cop/style/not.rb +1 -1
- data/lib/rubocop/cop/style/numeric_literals.rb +26 -6
- data/lib/rubocop/cop/style/op_method.rb +2 -2
- data/lib/rubocop/cop/style/parameter_lists.rb +4 -4
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +2 -2
- data/lib/rubocop/cop/style/perl_backrefs.rb +26 -0
- data/lib/rubocop/cop/style/proc.rb +1 -3
- data/lib/rubocop/cop/style/reduce_arguments.rb +7 -5
- data/lib/rubocop/cop/style/redundant_begin.rb +1 -1
- data/lib/rubocop/cop/style/redundant_return.rb +9 -2
- data/lib/rubocop/cop/style/redundant_self.rb +9 -2
- data/lib/rubocop/cop/style/regexp_literal.rb +7 -8
- data/lib/rubocop/cop/style/rescue_modifier.rb +1 -1
- data/lib/rubocop/cop/style/semicolon.rb +10 -10
- data/lib/rubocop/cop/style/signal_exception.rb +2 -4
- data/lib/rubocop/cop/style/single_line_methods.rb +2 -4
- data/lib/rubocop/cop/style/space_after_comma_etc.rb +1 -1
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +1 -1
- data/lib/rubocop/cop/style/space_after_method_name.rb +1 -1
- data/lib/rubocop/cop/style/space_before_modifier_keyword.rb +34 -0
- data/lib/rubocop/cop/style/{avoid_perlisms.rb → special_global_vars.rb} +17 -8
- data/lib/rubocop/cop/style/string_literals.rb +1 -2
- data/lib/rubocop/cop/style/surrounding_space.rb +9 -8
- data/lib/rubocop/cop/style/symbol_array.rb +1 -1
- data/lib/rubocop/cop/style/symbol_name.rb +9 -2
- data/lib/rubocop/cop/style/tab.rb +5 -5
- data/lib/rubocop/cop/style/ternary_operator.rb +2 -6
- data/lib/rubocop/cop/style/trailing_blank_lines.rb +32 -0
- data/lib/rubocop/cop/style/trailing_whitespace.rb +5 -6
- data/lib/rubocop/cop/style/trivial_accessors.rb +5 -5
- data/lib/rubocop/cop/style/unless_else.rb +1 -1
- data/lib/rubocop/cop/style/variable_interpolation.rb +1 -3
- data/lib/rubocop/cop/style/when_then.rb +1 -4
- data/lib/rubocop/cop/style/while_until_do.rb +7 -5
- data/lib/rubocop/cop/style/word_array.rb +1 -1
- data/lib/rubocop/cop/team.rb +100 -0
- data/lib/rubocop/cop/variable_inspector.rb +323 -235
- data/lib/rubocop/cop/variable_inspector/assignment.rb +103 -0
- data/lib/rubocop/cop/variable_inspector/locatable.rb +162 -0
- data/lib/rubocop/cop/variable_inspector/reference.rb +31 -0
- data/lib/rubocop/cop/variable_inspector/scope.rb +70 -0
- data/lib/rubocop/cop/variable_inspector/variable.rb +87 -0
- data/lib/rubocop/cop/variable_inspector/variable_table.rb +129 -0
- data/lib/rubocop/formatter/json_formatter.rb +8 -8
- data/lib/rubocop/formatter/progress_formatter.rb +4 -4
- data/lib/rubocop/processed_source.rb +22 -1
- data/lib/rubocop/version.rb +1 -1
- data/rubocop.gemspec +1 -1
- data/spec/rubocop/cli_spec.rb +32 -30
- data/spec/rubocop/config_spec.rb +4 -6
- data/spec/rubocop/cop/commissioner_spec.rb +4 -5
- data/spec/rubocop/cop/cop_spec.rb +8 -26
- data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +5 -9
- data/spec/rubocop/cop/lint/block_alignment_spec.rb +105 -57
- data/spec/rubocop/cop/lint/empty_ensure_spec.rb +1 -1
- data/spec/rubocop/cop/lint/end_alignment_spec.rb +1 -1
- data/spec/rubocop/cop/lint/end_in_method_spec.rb +1 -1
- data/spec/rubocop/cop/lint/ensure_return_spec.rb +1 -1
- data/spec/rubocop/cop/lint/eval_spec.rb +3 -3
- data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +2 -2
- data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +1 -1
- data/spec/rubocop/cop/lint/loop_spec.rb +1 -1
- data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +1 -1
- data/spec/rubocop/cop/lint/rescue_exception_spec.rb +5 -5
- data/spec/rubocop/cop/lint/unreachable_code_spec.rb +1 -1
- data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1545 -108
- data/spec/rubocop/cop/lint/useless_comparison_spec.rb +1 -1
- data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +101 -0
- data/spec/rubocop/cop/lint/void_spec.rb +1 -1
- data/spec/rubocop/cop/offence_spec.rb +4 -4
- data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +1 -1
- data/spec/rubocop/cop/rails/read_attribute_spec.rb +1 -1
- data/spec/rubocop/cop/rails/validation_spec.rb +1 -1
- data/spec/rubocop/cop/style/access_control_spec.rb +20 -20
- data/spec/rubocop/cop/style/alias_spec.rb +3 -3
- data/spec/rubocop/cop/style/align_array_spec.rb +62 -0
- data/spec/rubocop/cop/style/align_hash_spec.rb +267 -0
- data/spec/rubocop/cop/style/align_parameters_spec.rb +2 -2
- data/spec/rubocop/cop/style/and_or_spec.rb +1 -1
- data/spec/rubocop/cop/style/ascii_comments_spec.rb +2 -2
- data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +2 -2
- data/spec/rubocop/cop/style/attr_spec.rb +1 -1
- data/spec/rubocop/cop/style/begin_block_spec.rb +1 -1
- data/spec/rubocop/cop/style/block_comments_spec.rb +1 -1
- data/spec/rubocop/cop/style/block_nesting_spec.rb +3 -3
- data/spec/rubocop/cop/style/blocks_spec.rb +25 -1
- data/spec/rubocop/cop/style/case_equality_spec.rb +1 -1
- data/spec/rubocop/cop/style/case_indentation_spec.rb +5 -5
- data/spec/rubocop/cop/style/character_literal_spec.rb +1 -1
- data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +1 -1
- data/spec/rubocop/cop/style/class_methods_spec.rb +1 -1
- data/spec/rubocop/cop/style/class_vars_spec.rb +25 -0
- data/spec/rubocop/cop/style/collection_methods_spec.rb +5 -6
- data/spec/rubocop/cop/style/colon_method_call_spec.rb +0 -3
- data/spec/rubocop/cop/style/comment_annotation_spec.rb +20 -18
- data/spec/rubocop/cop/style/constant_name_spec.rb +1 -1
- data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +1 -1
- data/spec/rubocop/cop/style/def_without_parentheses_spec.rb +1 -1
- data/spec/rubocop/cop/style/documentation_spec.rb +1 -1
- data/spec/rubocop/cop/style/dot_position_spec.rb +5 -5
- data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +35 -4
- data/spec/rubocop/cop/style/empty_lines_spec.rb +1 -1
- data/spec/rubocop/cop/style/empty_literal_spec.rb +7 -7
- data/spec/rubocop/cop/style/encoding_spec.rb +11 -5
- data/spec/rubocop/cop/style/end_block_spec.rb +1 -1
- data/spec/rubocop/cop/style/end_of_line_spec.rb +4 -3
- data/spec/rubocop/cop/style/even_odd_spec.rb +1 -1
- data/spec/rubocop/cop/style/favor_join_spec.rb +2 -2
- data/spec/rubocop/cop/style/favor_modifier_spec.rb +13 -10
- data/spec/rubocop/cop/style/favor_sprintf_spec.rb +4 -4
- data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +1 -1
- data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +4 -4
- data/spec/rubocop/cop/style/final_newline_spec.rb +25 -0
- data/spec/rubocop/cop/style/{avoid_for_spec.rb → for_spec.rb} +8 -12
- data/spec/rubocop/cop/style/{avoid_global_vars_spec.rb → global_vars_spec.rb} +13 -3
- data/spec/rubocop/cop/style/hash_methods_spec.rb +1 -1
- data/spec/rubocop/cop/style/hash_syntax_spec.rb +20 -9
- data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +3 -3
- data/spec/rubocop/cop/style/indentation_width_spec.rb +19 -19
- data/spec/rubocop/cop/style/lambda_spec.rb +6 -6
- data/spec/rubocop/cop/style/leading_comment_space_spec.rb +1 -1
- data/spec/rubocop/cop/style/line_length_spec.rb +3 -3
- data/spec/rubocop/cop/style/method_and_variable_snake_case_spec.rb +8 -9
- data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +1 -1
- data/spec/rubocop/cop/style/method_length_spec.rb +18 -17
- data/spec/rubocop/cop/style/module_function_spec.rb +1 -1
- data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +84 -0
- data/spec/rubocop/cop/style/multiline_if_then_spec.rb +2 -2
- data/spec/rubocop/cop/style/nil_comparison_spec.rb +1 -1
- data/spec/rubocop/cop/style/not_spec.rb +1 -1
- data/spec/rubocop/cop/style/numeric_literals_spec.rb +15 -25
- data/spec/rubocop/cop/style/one_line_conditional_spec.rb +2 -2
- data/spec/rubocop/cop/style/op_method_spec.rb +3 -3
- data/spec/rubocop/cop/style/parameter_lists_spec.rb +5 -5
- data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +4 -8
- data/spec/rubocop/cop/style/perl_backrefs_spec.rb +23 -0
- data/spec/rubocop/cop/style/proc_spec.rb +1 -1
- data/spec/rubocop/cop/style/reduce_arguments_spec.rb +18 -11
- data/spec/rubocop/cop/style/redundant_begin_spec.rb +1 -1
- data/spec/rubocop/cop/style/redundant_return_spec.rb +16 -1
- data/spec/rubocop/cop/style/redundant_self_spec.rb +6 -1
- data/spec/rubocop/cop/style/regexp_literal_spec.rb +19 -23
- data/spec/rubocop/cop/style/rescue_modifier_spec.rb +3 -3
- data/spec/rubocop/cop/style/semicolon_spec.rb +3 -3
- data/spec/rubocop/cop/style/signal_exception_spec.rb +1 -1
- data/spec/rubocop/cop/style/single_line_methods_spec.rb +22 -18
- data/spec/rubocop/cop/style/space_after_colon_spec.rb +4 -4
- data/spec/rubocop/cop/style/space_after_comma_spec.rb +4 -4
- data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +1 -1
- data/spec/rubocop/cop/style/space_after_method_name_spec.rb +1 -1
- data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +3 -3
- data/spec/rubocop/cop/style/space_around_braces_spec.rb +13 -12
- data/spec/rubocop/cop/style/space_around_equals_in_default_parameter_spec.rb +3 -3
- data/spec/rubocop/cop/style/space_around_operators_spec.rb +25 -25
- data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +53 -0
- data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +9 -9
- data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +47 -61
- data/spec/rubocop/cop/style/space_inside_parens_spec.rb +4 -4
- data/spec/rubocop/cop/style/special_global_vars_spec.rb +52 -0
- data/spec/rubocop/cop/style/string_literals_spec.rb +5 -5
- data/spec/rubocop/cop/style/symbol_array_spec.rb +1 -1
- data/spec/rubocop/cop/style/symbol_name_spec.rb +27 -18
- data/spec/rubocop/cop/style/tab_spec.rb +1 -1
- data/spec/rubocop/cop/style/ternary_operator_spec.rb +2 -2
- data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +24 -0
- data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +7 -7
- data/spec/rubocop/cop/style/trivial_accessors_spec.rb +6 -14
- data/spec/rubocop/cop/style/unless_else_spec.rb +3 -3
- data/spec/rubocop/cop/style/variable_interpolation_spec.rb +5 -5
- data/spec/rubocop/cop/style/when_then_spec.rb +15 -15
- data/spec/rubocop/cop/style/while_until_do_spec.rb +3 -3
- data/spec/rubocop/cop/style/word_array_spec.rb +1 -1
- data/spec/rubocop/cop/team_spec.rb +158 -0
- data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +217 -0
- data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +740 -0
- data/spec/rubocop/cop/variable_inspector/scope_spec.rb +191 -0
- data/spec/rubocop/cop/variable_inspector/variable_spec.rb +79 -0
- data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +275 -0
- data/spec/rubocop/cop/variable_inspector_spec.rb +13 -533
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +4 -4
- data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +1 -1
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +3 -3
- data/spec/rubocop/formatter/file_list_formatter_spec.rb +3 -3
- data/spec/rubocop/formatter/progress_formatter_spec.rb +1 -1
- data/spec/spec_helper.rb +5 -1
- data/spec/support/ast_helper.rb +15 -0
- data/spec/support/shared_context.rb +18 -0
- data/spec/support/shared_examples.rb +1 -1
- metadata +95 -32
- checksums.yaml +0 -7
- data/lib/rubocop/cop/lint/unused_local_variable.rb +0 -32
- data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +0 -19
- data/spec/rubocop/cop/lint/unused_local_variable_spec.rb +0 -588
- data/spec/rubocop/cop/style/avoid_class_vars_spec.rb +0 -27
- data/spec/rubocop/cop/style/avoid_perl_backrefs_spec.rb +0 -20
- data/spec/rubocop/cop/style/avoid_perlisms_spec.rb +0 -47
@@ -0,0 +1,129 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module VariableInspector
|
6
|
+
# A VariableTable manages the lifetime of all scopes and local variables
|
7
|
+
# in a program.
|
8
|
+
# This holds scopes as stack structure, and provides a way to add local
|
9
|
+
# variables to current scope and find local variables by considering
|
10
|
+
# variable visibility of the current scope.
|
11
|
+
class VariableTable
|
12
|
+
def initialize(hook_receiver = nil)
|
13
|
+
@hook_receiver = hook_receiver
|
14
|
+
end
|
15
|
+
|
16
|
+
def invoke_hook(hook_name, *args)
|
17
|
+
@hook_receiver.send(hook_name, *args) if @hook_receiver
|
18
|
+
end
|
19
|
+
|
20
|
+
def scope_stack
|
21
|
+
@scope_stack ||= []
|
22
|
+
end
|
23
|
+
|
24
|
+
def push_scope(scope_node)
|
25
|
+
scope = Scope.new(scope_node)
|
26
|
+
invoke_hook(:before_entering_scope, scope)
|
27
|
+
scope_stack.push(scope)
|
28
|
+
invoke_hook(:after_entering_scope, scope)
|
29
|
+
scope
|
30
|
+
end
|
31
|
+
|
32
|
+
def pop_scope
|
33
|
+
scope = current_scope
|
34
|
+
invoke_hook(:before_leaving_scope, scope)
|
35
|
+
scope_stack.pop
|
36
|
+
invoke_hook(:after_leaving_scope, scope)
|
37
|
+
scope
|
38
|
+
end
|
39
|
+
|
40
|
+
def current_scope
|
41
|
+
scope_stack.last
|
42
|
+
end
|
43
|
+
|
44
|
+
def current_scope_level
|
45
|
+
scope_stack.count
|
46
|
+
end
|
47
|
+
|
48
|
+
def declare_variable(name, node)
|
49
|
+
variable = Variable.new(name, node, current_scope)
|
50
|
+
invoke_hook(:before_declaring_variable, variable)
|
51
|
+
current_scope.variables[variable.name] = variable
|
52
|
+
invoke_hook(:after_declaring_variable, variable)
|
53
|
+
variable
|
54
|
+
end
|
55
|
+
|
56
|
+
def assign_to_variable(name, node)
|
57
|
+
variable = find_variable(name)
|
58
|
+
|
59
|
+
unless variable
|
60
|
+
fail "Assigning to undeclared local variable \"#{name}\" " +
|
61
|
+
"at #{node.loc.expression}, #{node.inspect}"
|
62
|
+
end
|
63
|
+
|
64
|
+
variable.assign(node)
|
65
|
+
mark_variable_as_captured_by_block_if_so(variable)
|
66
|
+
end
|
67
|
+
|
68
|
+
def reference_variable(name, node)
|
69
|
+
variable = find_variable(name)
|
70
|
+
|
71
|
+
# In this code:
|
72
|
+
#
|
73
|
+
# foo = 1 unless foo
|
74
|
+
#
|
75
|
+
# (if
|
76
|
+
# (lvar :foo) nil
|
77
|
+
# (lvasgn :foo
|
78
|
+
# (int 1)))
|
79
|
+
#
|
80
|
+
# Parser knows whether the foo is a variable or method invocation.
|
81
|
+
# This means that if a :lvar node is shown in AST, the variable is
|
82
|
+
# assumed to be already declared, even if we haven't seen any :lvasgn
|
83
|
+
# or :arg node before the :lvar node.
|
84
|
+
#
|
85
|
+
# We don't invoke #declare_variable here otherwise
|
86
|
+
# Variable#declaration_node will be :lvar node, that is actually not.
|
87
|
+
# So just skip.
|
88
|
+
return unless variable
|
89
|
+
|
90
|
+
variable.reference!(node)
|
91
|
+
mark_variable_as_captured_by_block_if_so(variable)
|
92
|
+
end
|
93
|
+
|
94
|
+
def find_variable(name)
|
95
|
+
name = name.to_sym
|
96
|
+
|
97
|
+
scope_stack.reverse_each do |scope|
|
98
|
+
variable = scope.variables[name]
|
99
|
+
return variable if variable
|
100
|
+
# Only block scope allows referencing outer scope variables.
|
101
|
+
return nil unless scope.node.type == :block
|
102
|
+
end
|
103
|
+
|
104
|
+
nil
|
105
|
+
end
|
106
|
+
|
107
|
+
def variable_exist?(name)
|
108
|
+
!find_variable(name).nil?
|
109
|
+
end
|
110
|
+
|
111
|
+
def accessible_variables
|
112
|
+
scope_stack.reverse_each.reduce([]) do |variables, scope|
|
113
|
+
variables.concat(scope.variables.values)
|
114
|
+
break variables unless scope.node.type == :block
|
115
|
+
variables
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
private
|
120
|
+
|
121
|
+
def mark_variable_as_captured_by_block_if_so(variable)
|
122
|
+
return unless current_scope.node.type == :block
|
123
|
+
return if variable.scope == current_scope
|
124
|
+
variable.capture_with_block!
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
@@ -13,8 +13,8 @@ module Rubocop
|
|
13
13
|
super
|
14
14
|
@output_hash = {
|
15
15
|
metadata: metadata_hash,
|
16
|
-
|
17
|
-
|
16
|
+
files: [],
|
17
|
+
summary: { offence_count: 0 }
|
18
18
|
}
|
19
19
|
end
|
20
20
|
|
@@ -35,16 +35,16 @@ module Rubocop
|
|
35
35
|
def metadata_hash
|
36
36
|
{
|
37
37
|
rubocop_version: Rubocop::Version::STRING,
|
38
|
-
|
39
|
-
|
38
|
+
ruby_engine: RUBY_ENGINE,
|
39
|
+
ruby_version: RUBY_VERSION,
|
40
40
|
ruby_patchlevel: RUBY_PATCHLEVEL.to_s,
|
41
|
-
|
41
|
+
ruby_platform: RUBY_PLATFORM
|
42
42
|
}
|
43
43
|
end
|
44
44
|
|
45
45
|
def hash_for_file(file, offences)
|
46
46
|
{
|
47
|
-
|
47
|
+
path: relative_path(file),
|
48
48
|
offences: offences.map { |o| hash_for_offence(o) }
|
49
49
|
}
|
50
50
|
end
|
@@ -52,7 +52,7 @@ module Rubocop
|
|
52
52
|
def hash_for_offence(offence)
|
53
53
|
{
|
54
54
|
severity: offence.severity,
|
55
|
-
|
55
|
+
message: offence.message,
|
56
56
|
cop_name: offence.cop_name,
|
57
57
|
location: hash_for_location(offence)
|
58
58
|
}
|
@@ -61,7 +61,7 @@ module Rubocop
|
|
61
61
|
# TODO: Consider better solution for Offence#real_column.
|
62
62
|
def hash_for_location(offence)
|
63
63
|
{
|
64
|
-
|
64
|
+
line: offence.line,
|
65
65
|
column: offence.real_column
|
66
66
|
}
|
67
67
|
end
|
@@ -7,11 +7,11 @@ module Rubocop
|
|
7
7
|
# appends the regular report data in the clang style format.
|
8
8
|
class ProgressFormatter < ClangStyleFormatter
|
9
9
|
COLOR_FOR_SEVERITY = {
|
10
|
-
|
10
|
+
refactor: :yellow,
|
11
11
|
convention: :yellow,
|
12
|
-
|
13
|
-
|
14
|
-
|
12
|
+
warning: :magenta,
|
13
|
+
error: :red,
|
14
|
+
fatal: :red
|
15
15
|
}
|
16
16
|
|
17
17
|
def started(target_files)
|
@@ -17,11 +17,32 @@ module Rubocop
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def lines
|
20
|
-
@lines
|
20
|
+
if @lines
|
21
|
+
@lines
|
22
|
+
else
|
23
|
+
init_lines
|
24
|
+
@lines
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def raw_lines
|
29
|
+
if @raw_lines
|
30
|
+
@raw_lines
|
31
|
+
else
|
32
|
+
init_lines
|
33
|
+
@raw_lines
|
34
|
+
end
|
21
35
|
end
|
22
36
|
|
23
37
|
def [](*args)
|
24
38
|
lines[*args]
|
25
39
|
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def init_lines
|
44
|
+
@raw_lines = @buffer.source.lines
|
45
|
+
@lines = @raw_lines.map(&:chomp)
|
46
|
+
end
|
26
47
|
end
|
27
48
|
end
|
data/lib/rubocop/version.rb
CHANGED
data/rubocop.gemspec
CHANGED
@@ -29,7 +29,7 @@ Gem::Specification.new do |s|
|
|
29
29
|
s.add_runtime_dependency('rainbow', '>= 1.1.4')
|
30
30
|
s.add_runtime_dependency('parser', '~> 2.0.0.pre6')
|
31
31
|
s.add_runtime_dependency('backports', '~> 3.3.3')
|
32
|
-
s.add_runtime_dependency('powerpack', '~> 0.0.
|
32
|
+
s.add_runtime_dependency('powerpack', '~> 0.0.6')
|
33
33
|
s.add_development_dependency('rake', '~> 10.1')
|
34
34
|
s.add_development_dependency('rspec', '~> 2.14')
|
35
35
|
s.add_development_dependency('yard', '~> 0.8')
|
data/spec/rubocop/cli_spec.rb
CHANGED
@@ -8,7 +8,7 @@ module Rubocop
|
|
8
8
|
describe CLI, :isolated_environment do
|
9
9
|
include FileHelper
|
10
10
|
|
11
|
-
|
11
|
+
subject(:cli) { CLI.new }
|
12
12
|
|
13
13
|
before(:each) do
|
14
14
|
$stdout = StringIO.new
|
@@ -369,9 +369,6 @@ Usage: rubocop [options] [file1, file2, ...]
|
|
369
369
|
"\ty",
|
370
370
|
'end'])
|
371
371
|
# IfUnlessModifier depends on the configuration of LineLength.
|
372
|
-
# That configuration might have been set by other spec examples
|
373
|
-
# so we reset it to emulate a start from scratch.
|
374
|
-
Cop::Style::LineLength.config = nil
|
375
372
|
|
376
373
|
expect(cli.run(['--format', 'simple',
|
377
374
|
'--only', 'IfUnlessModifier', 'example.rb'])).to eq(1)
|
@@ -390,9 +387,6 @@ Usage: rubocop [options] [file1, file2, ...]
|
|
390
387
|
"\ty",
|
391
388
|
'end'])
|
392
389
|
# IfUnlessModifier depends on the configuration of LineLength.
|
393
|
-
# That configuration might have been set by other spec examples
|
394
|
-
# so we reset it to emulate a start from scratch.
|
395
|
-
Cop::Style::LineLength.config = nil
|
396
390
|
|
397
391
|
expect(cli.run(['--format', 'simple', '--lint', 'example.rb'])).to eq(1)
|
398
392
|
expect($stdout.string)
|
@@ -410,45 +404,51 @@ Usage: rubocop [options] [file1, file2, ...]
|
|
410
404
|
expect($stderr.string).to eq("Unrecognized cop name: 123.\n")
|
411
405
|
end
|
412
406
|
|
413
|
-
|
407
|
+
describe '--show-cops option' do
|
414
408
|
let(:cops) { Cop::Cop.all }
|
409
|
+
|
415
410
|
let(:global_conf) do
|
416
411
|
config_path = Rubocop::Config.configuration_file_for(Dir.pwd.to_s)
|
417
412
|
Rubocop::Config.configuration_from_file(config_path)
|
418
413
|
end
|
414
|
+
|
415
|
+
let(:stdout) { $stdout.string }
|
416
|
+
|
419
417
|
before do
|
420
|
-
cops.
|
421
|
-
cop_class.config = global_conf.for_cop(cop_class.cop_name)
|
422
|
-
end
|
418
|
+
expect { cli.run ['--show-cops'] }.to exit_with_code(0)
|
423
419
|
end
|
424
420
|
|
425
|
-
|
426
|
-
|
427
|
-
|
421
|
+
# Extracts the first line out of the description
|
422
|
+
def short_description_of_cop(cop)
|
423
|
+
desc = full_description_of_cop(cop)
|
424
|
+
desc ? desc.lines.first.strip : ''
|
425
|
+
end
|
426
|
+
|
427
|
+
# Gets the full description of the cop or nil if no description is set.
|
428
|
+
def full_description_of_cop(cop)
|
429
|
+
cop_config = global_conf.for_cop(cop)
|
430
|
+
cop_config['Description']
|
428
431
|
end
|
432
|
+
|
429
433
|
it 'prints all available cops and their description' do
|
430
|
-
subject
|
431
434
|
cops.each do |cop|
|
432
|
-
expect(
|
433
|
-
expect(
|
435
|
+
expect(stdout).to include cop.cop_name
|
436
|
+
expect(stdout).to include short_description_of_cop(cop)
|
434
437
|
end
|
435
438
|
end
|
436
439
|
|
437
440
|
it 'prints all types' do
|
438
|
-
subject
|
439
441
|
cops
|
440
442
|
.types
|
441
|
-
.
|
442
|
-
.map
|
443
|
-
.
|
444
|
-
.each { |type| expect(@stdout).to include(type) }
|
443
|
+
.map(&:to_s)
|
444
|
+
.map(&:capitalize)
|
445
|
+
.each { |type| expect(stdout).to include(type) }
|
445
446
|
end
|
446
447
|
|
447
448
|
it 'prints all cops in their right type listing' do
|
448
|
-
|
449
|
-
lines = @stdout.lines
|
449
|
+
lines = stdout.lines
|
450
450
|
lines.slice_before(/Type /).each do |slice|
|
451
|
-
types = cops.types.
|
451
|
+
types = cops.types.map(&:to_s).map(&:capitalize)
|
452
452
|
current = types.delete(slice.shift[/Type '(?<c>[^'']+)'/, 'c'])
|
453
453
|
# all cops in their type listing
|
454
454
|
cops.with_type(current).each do |cop|
|
@@ -465,14 +465,13 @@ Usage: rubocop [options] [file1, file2, ...]
|
|
465
465
|
end
|
466
466
|
|
467
467
|
it 'prints the current configuration' do
|
468
|
-
|
469
|
-
out = @stdout.lines.to_a
|
468
|
+
out = stdout.lines.to_a
|
470
469
|
cops.each do |cop|
|
471
470
|
conf = global_conf[cop.cop_name].dup
|
472
471
|
confstrt = out.find_index { |i| i.include?("- #{cop.cop_name}") } + 1
|
473
472
|
c = out[confstrt, conf.keys.size].to_s
|
474
473
|
conf.delete('Description')
|
475
|
-
expect(c).to include(cop
|
474
|
+
expect(c).to include(short_description_of_cop(cop))
|
476
475
|
conf.each do |k, v|
|
477
476
|
# ugly hack to get hash/array content tested
|
478
477
|
if v.kind_of?(Hash) || v.kind_of?(Array)
|
@@ -480,7 +479,6 @@ Usage: rubocop [options] [file1, file2, ...]
|
|
480
479
|
else
|
481
480
|
expect(c).to include "#{k}: #{v}"
|
482
481
|
end
|
483
|
-
|
484
482
|
end
|
485
483
|
end
|
486
484
|
end
|
@@ -792,12 +790,16 @@ Usage: rubocop [options] [file1, file2, ...]
|
|
792
790
|
it 'registers an offence for Parser warnings' do
|
793
791
|
create_file('example.rb', [
|
794
792
|
'# encoding: utf-8',
|
795
|
-
'puts *test'
|
793
|
+
'puts *test',
|
794
|
+
'if a then b else c end'
|
796
795
|
])
|
797
796
|
expect(cli.run(['--format', 'emacs', 'example.rb'])).to eq(1)
|
798
797
|
expect($stdout.string)
|
799
798
|
.to eq(["#{abs('example.rb')}:2:6: W: " +
|
800
799
|
"`*' interpreted as argument prefix",
|
800
|
+
"#{abs('example.rb')}:3:1: C: " +
|
801
|
+
'Favor the ternary operator (?:) over if/then/else/end ' +
|
802
|
+
'constructs.',
|
801
803
|
''].join("\n"))
|
802
804
|
end
|
803
805
|
|
data/spec/rubocop/config_spec.rb
CHANGED
@@ -296,9 +296,8 @@ describe Rubocop::Config do
|
|
296
296
|
end
|
297
297
|
|
298
298
|
it 'raises validation error' do
|
299
|
-
|
300
|
-
|
301
|
-
end.to raise_error(Rubocop::Config::ValidationError) do |error|
|
299
|
+
e = Rubocop::Config::ValidationError
|
300
|
+
expect { configuration.validate }.to raise_error(e) do |error|
|
302
301
|
expect(error.message).to start_with('unrecognized cop LyneLenth')
|
303
302
|
end
|
304
303
|
end
|
@@ -314,9 +313,8 @@ describe Rubocop::Config do
|
|
314
313
|
end
|
315
314
|
|
316
315
|
it 'raises validation error' do
|
317
|
-
|
318
|
-
|
319
|
-
end.to raise_error(Rubocop::Config::ValidationError) do |error|
|
316
|
+
e = Rubocop::Config::ValidationError
|
317
|
+
expect { configuration.validate }.to raise_error(e) do |error|
|
320
318
|
expect(error.message).to
|
321
319
|
start_with('unrecognized parameter LineLength:Min')
|
322
320
|
end
|
@@ -7,8 +7,11 @@ module Rubocop
|
|
7
7
|
module Cop
|
8
8
|
describe Commissioner do
|
9
9
|
describe '#investigate' do
|
10
|
+
let(:cop) { double(Cop, offences: []).as_null_object }
|
11
|
+
|
10
12
|
it 'returns all offences found by the cops' do
|
11
|
-
cop
|
13
|
+
cop.stub(:offences).and_return([1])
|
14
|
+
|
12
15
|
commissioner = Commissioner.new([cop])
|
13
16
|
source = []
|
14
17
|
processed_source = parse_source(source)
|
@@ -17,7 +20,6 @@ module Rubocop
|
|
17
20
|
end
|
18
21
|
|
19
22
|
it 'traverses the AST and invoke cops specific callbacks' do
|
20
|
-
cop = double(Cop, offences: [])
|
21
23
|
cop.should_receive(:on_def)
|
22
24
|
|
23
25
|
commissioner = Commissioner.new([cop])
|
@@ -30,7 +32,6 @@ module Rubocop
|
|
30
32
|
it 'passes the input params to all cops that implement their own #investigate method' do
|
31
33
|
source = []
|
32
34
|
processed_source = parse_source(source)
|
33
|
-
cop = double(Cop, offences: [])
|
34
35
|
cop.should_receive(:investigate).with(processed_source)
|
35
36
|
|
36
37
|
commissioner = Commissioner.new([cop])
|
@@ -39,7 +40,6 @@ module Rubocop
|
|
39
40
|
end
|
40
41
|
|
41
42
|
it 'stores all errors raised by the cops' do
|
42
|
-
cop = double(Cop, offences: [])
|
43
43
|
cop.stub(:on_def) { raise RuntimeError }
|
44
44
|
|
45
45
|
commissioner = Commissioner.new([cop])
|
@@ -54,7 +54,6 @@ module Rubocop
|
|
54
54
|
|
55
55
|
context 'when passed :raise_error option' do
|
56
56
|
it 're-raises the exception received while processing' do
|
57
|
-
cop = double(Cop, offences: [])
|
58
57
|
cop.stub(:on_def) { raise RuntimeError }
|
59
58
|
|
60
59
|
commissioner = Commissioner.new([cop], raise_error: true)
|