sabat-rubocop 0.9.0
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.
- data/.gitignore +50 -0
- data/.rspec +1 -0
- data/.rubocop.yml +7 -0
- data/.travis.yml +7 -0
- data/.yardopts +2 -0
- data/CHANGELOG.md +268 -0
- data/CONTRIBUTING.md +16 -0
- data/Gemfile +7 -0
- data/LICENSE.txt +20 -0
- data/README.md +324 -0
- data/Rakefile +29 -0
- data/bin/rubocop +22 -0
- data/config/default.yml +58 -0
- data/config/disabled.yml +5 -0
- data/config/enabled.yml +403 -0
- data/lib/rubocop.rb +116 -0
- data/lib/rubocop/cli.rb +407 -0
- data/lib/rubocop/config.rb +250 -0
- data/lib/rubocop/config_store.rb +39 -0
- data/lib/rubocop/cop/cop.rb +138 -0
- data/lib/rubocop/cop/lint/assignment_in_condition.rb +54 -0
- data/lib/rubocop/cop/lint/end_alignment.rb +189 -0
- data/lib/rubocop/cop/lint/end_in_method.rb +30 -0
- data/lib/rubocop/cop/lint/ensure_return.rb +22 -0
- data/lib/rubocop/cop/lint/eval.rb +22 -0
- data/lib/rubocop/cop/lint/handle_exceptions.rb +20 -0
- data/lib/rubocop/cop/lint/literal_in_condition.rb +81 -0
- data/lib/rubocop/cop/lint/loop.rb +29 -0
- data/lib/rubocop/cop/lint/rescue_exception.rb +29 -0
- data/lib/rubocop/cop/lint/shadowing_outer_local_variable.rb +34 -0
- data/lib/rubocop/cop/lint/unreachable_code.rb +35 -0
- data/lib/rubocop/cop/lint/unused_local_variable.rb +32 -0
- data/lib/rubocop/cop/lint/void.rb +58 -0
- data/lib/rubocop/cop/offence.rb +136 -0
- data/lib/rubocop/cop/rails/validation.rb +30 -0
- data/lib/rubocop/cop/style/access_control.rb +58 -0
- data/lib/rubocop/cop/style/alias.rb +28 -0
- data/lib/rubocop/cop/style/align_parameters.rb +39 -0
- data/lib/rubocop/cop/style/and_or.rb +45 -0
- data/lib/rubocop/cop/style/ascii_comments.rb +21 -0
- data/lib/rubocop/cop/style/ascii_identifiers.rb +22 -0
- data/lib/rubocop/cop/style/attr.rb +20 -0
- data/lib/rubocop/cop/style/avoid_class_vars.rb +20 -0
- data/lib/rubocop/cop/style/avoid_for.rb +18 -0
- data/lib/rubocop/cop/style/avoid_global_vars.rb +65 -0
- data/lib/rubocop/cop/style/avoid_perl_backrefs.rb +21 -0
- data/lib/rubocop/cop/style/avoid_perlisms.rb +50 -0
- data/lib/rubocop/cop/style/begin_block.rb +18 -0
- data/lib/rubocop/cop/style/block_comments.rb +20 -0
- data/lib/rubocop/cop/style/block_nesting.rb +47 -0
- data/lib/rubocop/cop/style/blocks.rb +27 -0
- data/lib/rubocop/cop/style/case_equality.rb +22 -0
- data/lib/rubocop/cop/style/case_indentation.rb +28 -0
- data/lib/rubocop/cop/style/character_literal.rb +37 -0
- data/lib/rubocop/cop/style/class_and_module_camel_case.rb +33 -0
- data/lib/rubocop/cop/style/class_methods.rb +22 -0
- data/lib/rubocop/cop/style/collection_methods.rb +56 -0
- data/lib/rubocop/cop/style/colon_method_call.rb +29 -0
- data/lib/rubocop/cop/style/constant_name.rb +31 -0
- data/lib/rubocop/cop/style/def_parentheses.rb +70 -0
- data/lib/rubocop/cop/style/documentation.rb +58 -0
- data/lib/rubocop/cop/style/dot_position.rb +25 -0
- data/lib/rubocop/cop/style/empty_line_between_defs.rb +26 -0
- data/lib/rubocop/cop/style/empty_lines.rb +40 -0
- data/lib/rubocop/cop/style/empty_literal.rb +53 -0
- data/lib/rubocop/cop/style/encoding.rb +29 -0
- data/lib/rubocop/cop/style/end_block.rb +18 -0
- data/lib/rubocop/cop/style/end_of_line.rb +23 -0
- data/lib/rubocop/cop/style/favor_join.rb +29 -0
- data/lib/rubocop/cop/style/favor_modifier.rb +118 -0
- data/lib/rubocop/cop/style/favor_sprintf.rb +28 -0
- data/lib/rubocop/cop/style/favor_unless_over_negated_if.rb +54 -0
- data/lib/rubocop/cop/style/hash_syntax.rb +47 -0
- data/lib/rubocop/cop/style/if_then_else.rb +29 -0
- data/lib/rubocop/cop/style/if_with_semicolon.rb +20 -0
- data/lib/rubocop/cop/style/lambda.rb +47 -0
- data/lib/rubocop/cop/style/leading_comment_space.rb +25 -0
- data/lib/rubocop/cop/style/line_continuation.rb +26 -0
- data/lib/rubocop/cop/style/line_length.rb +30 -0
- data/lib/rubocop/cop/style/method_and_variable_snake_case.rb +61 -0
- data/lib/rubocop/cop/style/method_call_parentheses.rb +22 -0
- data/lib/rubocop/cop/style/method_length.rb +57 -0
- data/lib/rubocop/cop/style/multiline_if_then.rb +47 -0
- data/lib/rubocop/cop/style/not.rb +24 -0
- data/lib/rubocop/cop/style/numeric_literals.rb +25 -0
- data/lib/rubocop/cop/style/one_line_conditional.rb +20 -0
- data/lib/rubocop/cop/style/op_method.rb +29 -0
- data/lib/rubocop/cop/style/parameter_lists.rb +42 -0
- data/lib/rubocop/cop/style/parentheses_around_condition.rb +42 -0
- data/lib/rubocop/cop/style/proc.rb +30 -0
- data/lib/rubocop/cop/style/reduce_arguments.rb +34 -0
- data/lib/rubocop/cop/style/regexp_literal.rb +39 -0
- data/lib/rubocop/cop/style/rescue_modifier.rb +55 -0
- data/lib/rubocop/cop/style/semicolon.rb +51 -0
- data/lib/rubocop/cop/style/single_line_methods.rb +48 -0
- data/lib/rubocop/cop/style/space_after_comma_etc.rb +69 -0
- data/lib/rubocop/cop/style/space_after_control_keyword.rb +32 -0
- data/lib/rubocop/cop/style/string_literals.rb +36 -0
- data/lib/rubocop/cop/style/surrounding_space.rb +314 -0
- data/lib/rubocop/cop/style/symbol_array.rb +31 -0
- data/lib/rubocop/cop/style/symbol_name.rb +27 -0
- data/lib/rubocop/cop/style/tab.rb +25 -0
- data/lib/rubocop/cop/style/ternary_operator.rb +49 -0
- data/lib/rubocop/cop/style/trailing_whitespace.rb +24 -0
- data/lib/rubocop/cop/style/trivial_accessors.rb +32 -0
- data/lib/rubocop/cop/style/unless_else.rb +26 -0
- data/lib/rubocop/cop/style/variable_interpolation.rb +32 -0
- data/lib/rubocop/cop/style/when_then.rb +25 -0
- data/lib/rubocop/cop/style/while_until_do.rb +45 -0
- data/lib/rubocop/cop/style/word_array.rb +44 -0
- data/lib/rubocop/cop/util.rb +27 -0
- data/lib/rubocop/cop/variable_inspector.rb +280 -0
- data/lib/rubocop/formatter/base_formatter.rb +119 -0
- data/lib/rubocop/formatter/clang_style_formatter.rb +21 -0
- data/lib/rubocop/formatter/emacs_style_formatter.rb +17 -0
- data/lib/rubocop/formatter/formatter_set.rb +77 -0
- data/lib/rubocop/formatter/json_formatter.rb +76 -0
- data/lib/rubocop/formatter/progress_formatter.rb +63 -0
- data/lib/rubocop/formatter/simple_text_formatter.rb +62 -0
- data/lib/rubocop/version.rb +21 -0
- data/rubocop.gemspec +36 -0
- data/spec/.rubocop.yml +5 -0
- data/spec/project_spec.rb +24 -0
- data/spec/rubocop/cli_spec.rb +906 -0
- data/spec/rubocop/config_spec.rb +470 -0
- data/spec/rubocop/config_store_spec.rb +66 -0
- data/spec/rubocop/cops/cop_spec.rb +38 -0
- data/spec/rubocop/cops/lint/assignment_in_condition_spec.rb +111 -0
- data/spec/rubocop/cops/lint/end_alignment_spec.rb +333 -0
- data/spec/rubocop/cops/lint/end_in_method_spec.rb +35 -0
- data/spec/rubocop/cops/lint/ensure_return_spec.rb +37 -0
- data/spec/rubocop/cops/lint/eval_spec.rb +41 -0
- data/spec/rubocop/cops/lint/handle_exceptions_spec.rb +36 -0
- data/spec/rubocop/cops/lint/literal_in_condition_spec.rb +42 -0
- data/spec/rubocop/cops/lint/loop_spec.rb +33 -0
- data/spec/rubocop/cops/lint/rescue_exception_spec.rb +127 -0
- data/spec/rubocop/cops/lint/shadowing_outer_local_variable_spec.rb +243 -0
- data/spec/rubocop/cops/lint/unreachable_code_spec.rb +69 -0
- data/spec/rubocop/cops/lint/unused_local_variable_spec.rb +497 -0
- data/spec/rubocop/cops/lint/void_spec.rb +63 -0
- data/spec/rubocop/cops/offence_spec.rb +133 -0
- data/spec/rubocop/cops/rails/validation_spec.rb +27 -0
- data/spec/rubocop/cops/style/access_control_spec.rb +142 -0
- data/spec/rubocop/cops/style/alias_spec.rb +47 -0
- data/spec/rubocop/cops/style/align_parameters_spec.rb +199 -0
- data/spec/rubocop/cops/style/and_or_spec.rb +39 -0
- data/spec/rubocop/cops/style/ascii_comments_spec.rb +28 -0
- data/spec/rubocop/cops/style/ascii_identifiers_spec.rb +28 -0
- data/spec/rubocop/cops/style/attr_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_class_vars_spec.rb +27 -0
- data/spec/rubocop/cops/style/avoid_for_spec.rb +37 -0
- data/spec/rubocop/cops/style/avoid_global_vars_spec.rb +34 -0
- data/spec/rubocop/cops/style/avoid_perl_backrefs_spec.rb +20 -0
- data/spec/rubocop/cops/style/avoid_perlisms_spec.rb +47 -0
- data/spec/rubocop/cops/style/begin_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/block_comments_spec.rb +27 -0
- data/spec/rubocop/cops/style/block_nesting_spec.rb +159 -0
- data/spec/rubocop/cops/style/blocks_spec.rb +35 -0
- data/spec/rubocop/cops/style/case_equality_spec.rb +18 -0
- data/spec/rubocop/cops/style/case_indentation_spec.rb +88 -0
- data/spec/rubocop/cops/style/character_literal_spec.rb +28 -0
- data/spec/rubocop/cops/style/class_and_module_camel_case_spec.rb +46 -0
- data/spec/rubocop/cops/style/class_methods_spec.rb +51 -0
- data/spec/rubocop/cops/style/collection_methods_spec.rb +41 -0
- data/spec/rubocop/cops/style/colon_method_call_spec.rb +55 -0
- data/spec/rubocop/cops/style/constant_name_spec.rb +56 -0
- data/spec/rubocop/cops/style/def_with_parentheses_spec.rb +40 -0
- data/spec/rubocop/cops/style/def_without_parentheses_spec.rb +34 -0
- data/spec/rubocop/cops/style/documentation_spec.rb +79 -0
- data/spec/rubocop/cops/style/dot_position_spec.rb +30 -0
- data/spec/rubocop/cops/style/empty_line_between_defs_spec.rb +85 -0
- data/spec/rubocop/cops/style/empty_lines_spec.rb +40 -0
- data/spec/rubocop/cops/style/empty_literal_spec.rb +91 -0
- data/spec/rubocop/cops/style/encoding_spec.rb +49 -0
- data/spec/rubocop/cops/style/end_block_spec.rb +19 -0
- data/spec/rubocop/cops/style/end_of_line_spec.rb +25 -0
- data/spec/rubocop/cops/style/favor_join_spec.rb +37 -0
- data/spec/rubocop/cops/style/favor_modifier_spec.rb +160 -0
- data/spec/rubocop/cops/style/favor_sprintf_spec.rb +53 -0
- data/spec/rubocop/cops/style/favor_unless_over_negated_if_spec.rb +64 -0
- data/spec/rubocop/cops/style/favor_until_over_negated_while_spec.rb +47 -0
- data/spec/rubocop/cops/style/hash_syntax_spec.rb +51 -0
- data/spec/rubocop/cops/style/if_with_semicolon_spec.rb +25 -0
- data/spec/rubocop/cops/style/lambda_spec.rb +45 -0
- data/spec/rubocop/cops/style/leading_comment_space_spec.rb +65 -0
- data/spec/rubocop/cops/style/line_continuation_spec.rb +26 -0
- data/spec/rubocop/cops/style/line_length_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_and_variable_snake_case_spec.rb +95 -0
- data/spec/rubocop/cops/style/method_call_parentheses_spec.rb +25 -0
- data/spec/rubocop/cops/style/method_length_spec.rb +151 -0
- data/spec/rubocop/cops/style/multiline_if_then_spec.rb +97 -0
- data/spec/rubocop/cops/style/not_spec.rb +28 -0
- data/spec/rubocop/cops/style/numeric_literals_spec.rb +51 -0
- data/spec/rubocop/cops/style/one_line_conditional_spec.rb +18 -0
- data/spec/rubocop/cops/style/op_method_spec.rb +80 -0
- data/spec/rubocop/cops/style/parameter_lists_spec.rb +49 -0
- data/spec/rubocop/cops/style/parentheses_around_condition_spec.rb +59 -0
- data/spec/rubocop/cops/style/proc_spec.rb +28 -0
- data/spec/rubocop/cops/style/reduce_arguments_spec.rb +59 -0
- data/spec/rubocop/cops/style/regexp_literal_spec.rb +83 -0
- data/spec/rubocop/cops/style/rescue_modifier_spec.rb +122 -0
- data/spec/rubocop/cops/style/semicolon_spec.rb +95 -0
- data/spec/rubocop/cops/style/single_line_methods_spec.rb +54 -0
- data/spec/rubocop/cops/style/space_after_colon_spec.rb +29 -0
- data/spec/rubocop/cops/style/space_after_comma_spec.rb +31 -0
- data/spec/rubocop/cops/style/space_after_control_keyword_spec.rb +69 -0
- data/spec/rubocop/cops/style/space_after_semicolon_spec.rb +24 -0
- data/spec/rubocop/cops/style/space_around_braces_spec.rb +49 -0
- data/spec/rubocop/cops/style/space_around_equals_in_default_parameter_spec.rb +34 -0
- data/spec/rubocop/cops/style/space_around_operators_spec.rb +216 -0
- data/spec/rubocop/cops/style/space_inside_brackets_spec.rb +51 -0
- data/spec/rubocop/cops/style/space_inside_hash_literal_braces_spec.rb +99 -0
- data/spec/rubocop/cops/style/space_inside_parens_spec.rb +33 -0
- data/spec/rubocop/cops/style/string_literals_spec.rb +62 -0
- data/spec/rubocop/cops/style/symbol_array_spec.rb +45 -0
- data/spec/rubocop/cops/style/symbol_name_spec.rb +122 -0
- data/spec/rubocop/cops/style/tab_spec.rb +23 -0
- data/spec/rubocop/cops/style/ternary_operator_spec.rb +42 -0
- data/spec/rubocop/cops/style/trailing_whitespace_spec.rb +29 -0
- data/spec/rubocop/cops/style/trivial_accessors_spec.rb +338 -0
- data/spec/rubocop/cops/style/unless_else_spec.rb +31 -0
- data/spec/rubocop/cops/style/variable_interpolation_spec.rb +53 -0
- data/spec/rubocop/cops/style/when_then_spec.rb +40 -0
- data/spec/rubocop/cops/style/while_until_do_spec.rb +47 -0
- data/spec/rubocop/cops/style/word_array_spec.rb +61 -0
- data/spec/rubocop/cops/variable_inspector_spec.rb +374 -0
- data/spec/rubocop/formatter/base_formatter_spec.rb +190 -0
- data/spec/rubocop/formatter/clang_style_formatter_spec.rb +70 -0
- data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +32 -0
- data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
- data/spec/rubocop/formatter/json_formatter_spec.rb +142 -0
- data/spec/rubocop/formatter/progress_formatter_spec.rb +196 -0
- data/spec/rubocop/formatter/simple_text_formatter_spec.rb +74 -0
- data/spec/spec_helper.rb +92 -0
- data/spec/support/file_helper.rb +21 -0
- data/spec/support/isolated_environment.rb +27 -0
- data/spec/support/mri_syntax_checker.rb +69 -0
- data/spec/support/shared_examples.rb +33 -0
- metadata +517 -0
@@ -0,0 +1,189 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks whether the end keywords are aligned properly.
|
7
|
+
#
|
8
|
+
# For keywords (if, def, etc.) the end is aligned with the start
|
9
|
+
# of the keyword.
|
10
|
+
# For blocks - with the start of the expression where the block
|
11
|
+
# is defined.
|
12
|
+
#
|
13
|
+
# @example
|
14
|
+
#
|
15
|
+
# variable = if true
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# variable = lambda do |i|
|
19
|
+
# i
|
20
|
+
# end
|
21
|
+
class EndAlignment < Cop
|
22
|
+
MSG = 'end at %d, %d is not aligned with %s at %d, %d'
|
23
|
+
|
24
|
+
def initialize
|
25
|
+
super
|
26
|
+
@inspected_blocks = []
|
27
|
+
end
|
28
|
+
|
29
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
30
|
+
@inspected_blocks = []
|
31
|
+
super
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_def(node)
|
35
|
+
check(node)
|
36
|
+
super
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_defs(node)
|
40
|
+
check(node)
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
def on_class(node)
|
45
|
+
check(node)
|
46
|
+
super
|
47
|
+
end
|
48
|
+
|
49
|
+
def on_module(node)
|
50
|
+
check(node)
|
51
|
+
super
|
52
|
+
end
|
53
|
+
|
54
|
+
def on_if(node)
|
55
|
+
check(node) if node.loc.respond_to?(:end)
|
56
|
+
super
|
57
|
+
end
|
58
|
+
|
59
|
+
def on_while(node)
|
60
|
+
check(node)
|
61
|
+
super
|
62
|
+
end
|
63
|
+
|
64
|
+
def on_until(node)
|
65
|
+
check(node)
|
66
|
+
super
|
67
|
+
end
|
68
|
+
|
69
|
+
# Block related alignments
|
70
|
+
|
71
|
+
def on_block(node)
|
72
|
+
return if already_processed_node?(node)
|
73
|
+
check_block_alignment(node.loc.expression, node.loc)
|
74
|
+
super
|
75
|
+
end
|
76
|
+
|
77
|
+
def on_and(node)
|
78
|
+
return if already_processed_node?(node)
|
79
|
+
|
80
|
+
_left, right = *node
|
81
|
+
if right.type == :block
|
82
|
+
check_block_alignment(node.loc.expression, right.loc)
|
83
|
+
@inspected_blocks << right
|
84
|
+
end
|
85
|
+
super
|
86
|
+
end
|
87
|
+
|
88
|
+
alias_method :on_or, :on_and
|
89
|
+
|
90
|
+
def on_lvasgn(node)
|
91
|
+
_, children = *node
|
92
|
+
process_block_assignment(node, children)
|
93
|
+
super
|
94
|
+
end
|
95
|
+
|
96
|
+
alias_method :on_ivasgn, :on_lvasgn
|
97
|
+
alias_method :on_cvasgn, :on_lvasgn
|
98
|
+
alias_method :on_gvasgn, :on_lvasgn
|
99
|
+
alias_method :on_and_asgn, :on_lvasgn
|
100
|
+
alias_method :on_or_asgn, :on_lvasgn
|
101
|
+
|
102
|
+
def on_casgn(node)
|
103
|
+
_, _, children = *node
|
104
|
+
process_block_assignment(node, children)
|
105
|
+
super
|
106
|
+
end
|
107
|
+
|
108
|
+
def on_op_asgn(node)
|
109
|
+
variable, _op, args = *node
|
110
|
+
process_block_assignment(variable, args)
|
111
|
+
super
|
112
|
+
end
|
113
|
+
|
114
|
+
def on_send(node)
|
115
|
+
_receiver, _method, *args = *node
|
116
|
+
process_block_assignment(node, args.last)
|
117
|
+
super
|
118
|
+
end
|
119
|
+
|
120
|
+
def on_masgn(node)
|
121
|
+
variables, args = *node
|
122
|
+
process_block_assignment(variables, args)
|
123
|
+
super
|
124
|
+
end
|
125
|
+
|
126
|
+
private
|
127
|
+
|
128
|
+
def process_block_assignment(begin_node, block_node)
|
129
|
+
return unless block_node
|
130
|
+
return if already_processed_node?(block_node)
|
131
|
+
|
132
|
+
while block_node.type == :send
|
133
|
+
receiver, _method, args = *block_node
|
134
|
+
if receiver && [:block, :send].include?(receiver.type)
|
135
|
+
block_node = receiver
|
136
|
+
elsif args && [:block, :send].include?(args.type)
|
137
|
+
block_node = args
|
138
|
+
else
|
139
|
+
break
|
140
|
+
end
|
141
|
+
end
|
142
|
+
if block_node.type == :block
|
143
|
+
# Align with the expression that is on the same line
|
144
|
+
# where the block is defined
|
145
|
+
return if block_is_on_next_line?(begin_node, block_node)
|
146
|
+
|
147
|
+
@inspected_blocks << block_node
|
148
|
+
check_block_alignment(begin_node.loc.expression, block_node.loc)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
def check_block_alignment(start_loc, block_loc)
|
153
|
+
end_loc = block_loc.end
|
154
|
+
if block_loc.begin.line != end_loc.line &&
|
155
|
+
start_loc.column != end_loc.column
|
156
|
+
add_offence(:warning,
|
157
|
+
end_loc,
|
158
|
+
sprintf(MSG, end_loc.line, end_loc.column,
|
159
|
+
start_loc.source.lines.to_a.first.chomp,
|
160
|
+
start_loc.line, start_loc.column))
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def check(node)
|
165
|
+
# discard modifier forms of if/while/until
|
166
|
+
return unless node.loc.end
|
167
|
+
|
168
|
+
kw_loc = node.loc.keyword
|
169
|
+
end_loc = node.loc.end
|
170
|
+
|
171
|
+
if kw_loc.line != end_loc.line && kw_loc.column != end_loc.column
|
172
|
+
add_offence(:warning,
|
173
|
+
end_loc,
|
174
|
+
sprintf(MSG, end_loc.line, end_loc.column,
|
175
|
+
kw_loc.source, kw_loc.line, kw_loc.column))
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
def already_processed_node?(node)
|
180
|
+
@inspected_blocks.include?(node)
|
181
|
+
end
|
182
|
+
|
183
|
+
def block_is_on_next_line?(begin_node, block_node)
|
184
|
+
begin_node.loc.line != block_node.loc.line
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
end
|
189
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for END blocks in method definitions.
|
7
|
+
class EndInMethod < Cop
|
8
|
+
MSG = 'END found in method definition. Use `at_exit` instead.'
|
9
|
+
|
10
|
+
def on_def(node)
|
11
|
+
check(node)
|
12
|
+
super
|
13
|
+
end
|
14
|
+
|
15
|
+
def on_defs(node)
|
16
|
+
check(node)
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def check(node)
|
23
|
+
on_node(:postexe, node) do |end_node|
|
24
|
+
add_offence(:warning, end_node.loc.keyword, MSG)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for *return* from an *ensure* block.
|
7
|
+
class EnsureReturn < Cop
|
8
|
+
MSG = 'Never return from an ensure block.'
|
9
|
+
|
10
|
+
def on_ensure(node)
|
11
|
+
_body, ensure_body = *node
|
12
|
+
|
13
|
+
on_node(:return, ensure_body) do |e|
|
14
|
+
add_offence(:warning, e.loc.expression, MSG)
|
15
|
+
end
|
16
|
+
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for the use of *Kernel#eval*.
|
7
|
+
class Eval < Cop
|
8
|
+
MSG = 'The use of eval is a serious security risk.'
|
9
|
+
|
10
|
+
def on_send(node)
|
11
|
+
receiver, method_name, = *node
|
12
|
+
|
13
|
+
if receiver.nil? && method_name == :eval
|
14
|
+
add_offence(:warning, node.loc.selector, MSG)
|
15
|
+
end
|
16
|
+
|
17
|
+
super
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for *rescue* blocks with no body.
|
7
|
+
class HandleExceptions < Cop
|
8
|
+
MSG = 'Do not suppress exceptions.'
|
9
|
+
|
10
|
+
def on_resbody(node)
|
11
|
+
_exc_list_node, _exc_var_node, body_node = *node
|
12
|
+
|
13
|
+
add_offence(:warning, node.loc.expression, MSG) unless body_node
|
14
|
+
|
15
|
+
super
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for literals used as the conditions or as
|
7
|
+
# operands in and/or expressions serving as the conditions of
|
8
|
+
# if/while/until.
|
9
|
+
#
|
10
|
+
# @example
|
11
|
+
#
|
12
|
+
# if 20
|
13
|
+
# do_something
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# if some_var && true
|
17
|
+
# do_something
|
18
|
+
# end
|
19
|
+
#
|
20
|
+
class LiteralInCondition < Cop
|
21
|
+
MSG = 'Literal %s appeared in a condition.'
|
22
|
+
|
23
|
+
LITERALS = [:str, :dstr, :int, :float, :array,
|
24
|
+
:hash, :regexp, :nil, :true, :false]
|
25
|
+
|
26
|
+
def on_if(node)
|
27
|
+
check_for_literal(node)
|
28
|
+
|
29
|
+
super
|
30
|
+
end
|
31
|
+
|
32
|
+
def on_while(node)
|
33
|
+
check_for_literal(node)
|
34
|
+
|
35
|
+
super
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_while_post(node)
|
39
|
+
check_for_literal(node)
|
40
|
+
|
41
|
+
super
|
42
|
+
end
|
43
|
+
|
44
|
+
def on_until(node)
|
45
|
+
check_for_literal(node)
|
46
|
+
|
47
|
+
super
|
48
|
+
end
|
49
|
+
|
50
|
+
def on_until_post(node)
|
51
|
+
check_for_literal(node)
|
52
|
+
|
53
|
+
super
|
54
|
+
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def check_for_literal(node)
|
59
|
+
cond, = *node
|
60
|
+
|
61
|
+
# if the code node is literal we obviously have a problem
|
62
|
+
if LITERALS.include?(cond.type)
|
63
|
+
add_offence(:warning, cond.loc.expression,
|
64
|
+
format(MSG, cond.loc.expression.source))
|
65
|
+
elsif [:and, :or].include?(cond.type)
|
66
|
+
# alternatively we have to consider a logical node with a
|
67
|
+
# literal argument
|
68
|
+
*operands = *cond
|
69
|
+
operands.each do |op|
|
70
|
+
if LITERALS.include?(op.type)
|
71
|
+
add_offence(:warning, op.loc.expression,
|
72
|
+
format(MSG, op.loc.expression.source))
|
73
|
+
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for uses of *begin...end while/until something*.
|
7
|
+
class Loop < Cop
|
8
|
+
MSG = 'Use Kernel#loop with break rather than ' +
|
9
|
+
'begin/end/until(or while).'
|
10
|
+
|
11
|
+
def on_while_post(node)
|
12
|
+
register_offence(node)
|
13
|
+
super
|
14
|
+
end
|
15
|
+
|
16
|
+
def on_until_post(node)
|
17
|
+
register_offence(node)
|
18
|
+
super
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def register_offence(node)
|
24
|
+
add_offence(:warning, node.loc.keyword, MSG)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop checks for *rescue* blocks targeting the Exception class.
|
7
|
+
class RescueException < Cop
|
8
|
+
MSG = 'Avoid rescuing the Exception class.'
|
9
|
+
|
10
|
+
def on_resbody(node)
|
11
|
+
return unless node.children.first
|
12
|
+
rescue_args = node.children.first.children
|
13
|
+
if rescue_args.any? { |a| targets_exception?(a) }
|
14
|
+
add_offence(:warning, node.location.expression, MSG)
|
15
|
+
end
|
16
|
+
|
17
|
+
super
|
18
|
+
end
|
19
|
+
|
20
|
+
def targets_exception?(rescue_arg_node)
|
21
|
+
return false unless rescue_arg_node.type == :const
|
22
|
+
namespace, klass_name = *rescue_arg_node
|
23
|
+
return false unless namespace.nil? || namespace.type == :cbase
|
24
|
+
klass_name == :Exception
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Rubocop
|
4
|
+
module Cop
|
5
|
+
module Lint
|
6
|
+
# This cop looks for use of the same name as outer local variables
|
7
|
+
# for block arguments or block local variables.
|
8
|
+
# This is a mimic of the warning
|
9
|
+
# "shadowing outer local variable - foo" from `ruby -cw`.
|
10
|
+
class ShadowingOuterLocalVariable < Cop
|
11
|
+
include VariableInspector
|
12
|
+
|
13
|
+
MSG = 'Shadowing outer local variable - %s'
|
14
|
+
|
15
|
+
def inspect(source_buffer, source, tokens, ast, comments)
|
16
|
+
inspect_variables(ast)
|
17
|
+
end
|
18
|
+
|
19
|
+
def before_declaring_variable(entry)
|
20
|
+
# Only block scope can reference outer local variables.
|
21
|
+
return unless variable_table.current_scope.node.type == :block
|
22
|
+
return unless ARGUMENT_DECLARATION_TYPES.include?(entry.node.type)
|
23
|
+
return if entry.name.to_s.start_with?('_')
|
24
|
+
|
25
|
+
outer_local_variable = variable_table.find_variable_entry(entry.name)
|
26
|
+
return unless outer_local_variable
|
27
|
+
|
28
|
+
message = sprintf(MSG, entry.name)
|
29
|
+
add_offence(:warning, entry.node.loc.expression, message)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|