reek 5.6.0 → 6.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (250) hide show
  1. checksums.yaml +4 -4
  2. data/.github/dependabot.yml +9 -0
  3. data/.github/workflows/ruby.yml +52 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +3 -1
  6. data/.rubocop_todo.yml +27 -20
  7. data/.simplecov +1 -0
  8. data/CHANGELOG.md +29 -0
  9. data/CONTRIBUTING.md +3 -0
  10. data/Dockerfile +2 -1
  11. data/Gemfile +14 -17
  12. data/README.md +11 -11
  13. data/bin/code_climate_reek +12 -2
  14. data/lib/reek.rb +1 -0
  15. data/lib/reek/ast/ast_node_class_map.rb +1 -1
  16. data/lib/reek/ast/node.rb +1 -1
  17. data/lib/reek/ast/sexp_extensions/arguments.rb +11 -0
  18. data/lib/reek/cli/options.rb +3 -3
  19. data/lib/reek/code_comment.rb +36 -29
  20. data/lib/reek/configuration/app_configuration.rb +4 -3
  21. data/lib/reek/configuration/configuration_converter.rb +2 -2
  22. data/lib/reek/configuration/directory_directives.rb +9 -3
  23. data/lib/reek/configuration/excluded_paths.rb +2 -1
  24. data/lib/reek/context/code_context.rb +1 -1
  25. data/lib/reek/context/module_context.rb +3 -1
  26. data/lib/reek/context/refinement_context.rb +16 -0
  27. data/lib/reek/context_builder.rb +16 -2
  28. data/lib/reek/errors/legacy_comment_separator_error.rb +36 -0
  29. data/lib/reek/report.rb +5 -7
  30. data/lib/reek/report/code_climate/code_climate_configuration.yml +1 -1
  31. data/lib/reek/report/code_climate/code_climate_formatter.rb +1 -3
  32. data/lib/reek/report/code_climate/code_climate_report.rb +2 -1
  33. data/lib/reek/report/simple_warning_formatter.rb +0 -7
  34. data/lib/reek/smell_detectors/base_detector.rb +2 -10
  35. data/lib/reek/smell_detectors/boolean_parameter.rb +3 -1
  36. data/lib/reek/smell_detectors/data_clump.rb +23 -56
  37. data/lib/reek/smell_detectors/nil_check.rb +1 -12
  38. data/lib/reek/smell_detectors/uncommunicative_variable_name.rb +1 -1
  39. data/lib/reek/smell_warning.rb +2 -3
  40. data/lib/reek/source/source_locator.rb +14 -13
  41. data/lib/reek/spec/smell_matcher.rb +2 -1
  42. data/lib/reek/version.rb +1 -1
  43. data/reek.gemspec +17 -7
  44. metadata +23 -246
  45. data/.travis.yml +0 -35
  46. data/docs/API.md +0 -174
  47. data/docs/Attribute.md +0 -39
  48. data/docs/Basic-Smell-Options.md +0 -85
  49. data/docs/Boolean-Parameter.md +0 -54
  50. data/docs/Class-Variable.md +0 -40
  51. data/docs/Code-Smells.md +0 -39
  52. data/docs/Command-Line-Options.md +0 -119
  53. data/docs/Control-Couple.md +0 -26
  54. data/docs/Control-Parameter.md +0 -32
  55. data/docs/Data-Clump.md +0 -46
  56. data/docs/Duplicate-Method-Call.md +0 -264
  57. data/docs/Feature-Envy.md +0 -93
  58. data/docs/How-To-Write-New-Detectors.md +0 -132
  59. data/docs/How-reek-works-internally.md +0 -114
  60. data/docs/Instance-Variable-Assumption.md +0 -163
  61. data/docs/Irresponsible-Module.md +0 -47
  62. data/docs/Large-Class.md +0 -16
  63. data/docs/Long-Parameter-List.md +0 -39
  64. data/docs/Long-Yield-List.md +0 -37
  65. data/docs/Manual-Dispatch.md +0 -30
  66. data/docs/Missing-Safe-Method.md +0 -92
  67. data/docs/Module-Initialize.md +0 -62
  68. data/docs/Nested-Iterators.md +0 -59
  69. data/docs/Nil-Check.md +0 -44
  70. data/docs/RSpec-matchers.md +0 -129
  71. data/docs/Rake-Task.md +0 -66
  72. data/docs/Reek-4-to-Reek-5-migration.md +0 -188
  73. data/docs/Reek-Driven-Development.md +0 -46
  74. data/docs/Repeated-Conditional.md +0 -47
  75. data/docs/Simulated-Polymorphism.md +0 -16
  76. data/docs/Smell-Suppression.md +0 -96
  77. data/docs/Style-Guide.md +0 -19
  78. data/docs/Subclassed-From-Core-Class.md +0 -79
  79. data/docs/Too-Many-Constants.md +0 -37
  80. data/docs/Too-Many-Instance-Variables.md +0 -43
  81. data/docs/Too-Many-Methods.md +0 -56
  82. data/docs/Too-Many-Statements.md +0 -54
  83. data/docs/Uncommunicative-Method-Name.md +0 -94
  84. data/docs/Uncommunicative-Module-Name.md +0 -92
  85. data/docs/Uncommunicative-Name.md +0 -18
  86. data/docs/Uncommunicative-Parameter-Name.md +0 -90
  87. data/docs/Uncommunicative-Variable-Name.md +0 -96
  88. data/docs/Unused-Parameters.md +0 -28
  89. data/docs/Unused-Private-Method.md +0 -101
  90. data/docs/Utility-Function.md +0 -56
  91. data/docs/Versioning-Policy.md +0 -7
  92. data/docs/YAML-Reports.md +0 -93
  93. data/docs/defaults.reek.yml +0 -129
  94. data/docs/templates/default/docstring/html/public_api_marker.erb +0 -3
  95. data/docs/templates/default/docstring/setup.rb +0 -37
  96. data/docs/templates/default/fulldoc/html/css/common.css +0 -1
  97. data/docs/yard_plugin.rb +0 -17
  98. data/features/command_line_interface/basic_usage.feature +0 -15
  99. data/features/command_line_interface/options.feature +0 -124
  100. data/features/command_line_interface/show_progress.feature +0 -33
  101. data/features/command_line_interface/smell_selection.feature +0 -15
  102. data/features/command_line_interface/smells_count.feature +0 -38
  103. data/features/command_line_interface/stdin.feature +0 -65
  104. data/features/configuration_files/accept_setting.feature +0 -87
  105. data/features/configuration_files/directory_specific_directives.feature +0 -274
  106. data/features/configuration_files/exclude_directives.feature +0 -35
  107. data/features/configuration_files/exclude_paths_directives.feature +0 -42
  108. data/features/configuration_files/masking_smells.feature +0 -94
  109. data/features/configuration_files/mix_accept_reject_setting.feature +0 -84
  110. data/features/configuration_files/reject_setting.feature +0 -89
  111. data/features/configuration_files/schema_validation.feature +0 -59
  112. data/features/configuration_files/show_configuration_file.feature +0 -44
  113. data/features/configuration_files/unused_private_method.feature +0 -68
  114. data/features/configuration_loading.feature +0 -91
  115. data/features/configuration_via_source_comments/erroneous_source_comments.feature +0 -68
  116. data/features/configuration_via_source_comments/well_formed_source_comments.feature +0 -116
  117. data/features/locales.feature +0 -32
  118. data/features/programmatic_access.feature +0 -41
  119. data/features/rake_task/rake_task.feature +0 -138
  120. data/features/reports/codeclimate.feature +0 -59
  121. data/features/reports/json.feature +0 -59
  122. data/features/reports/reports.feature +0 -219
  123. data/features/reports/yaml.feature +0 -52
  124. data/features/rspec_matcher.feature +0 -41
  125. data/features/samples.feature +0 -305
  126. data/features/step_definitions/.rubocop.yml +0 -5
  127. data/features/step_definitions/reek_steps.rb +0 -98
  128. data/features/step_definitions/sample_file_steps.rb +0 -63
  129. data/features/support/env.rb +0 -34
  130. data/features/todo_list.feature +0 -108
  131. data/samples/checkstyle.xml +0 -7
  132. data/samples/clean_source/clean.rb +0 -6
  133. data/samples/configuration/accepts_rejects_and_excludes_for_detectors.reek.yml +0 -29
  134. data/samples/configuration/accepts_rejects_and_excludes_for_directory_directives.reek.yml +0 -30
  135. data/samples/configuration/corrupt.reek +0 -1
  136. data/samples/configuration/empty.reek +0 -0
  137. data/samples/configuration/full_configuration.reek +0 -13
  138. data/samples/configuration/full_mask.reek +0 -6
  139. data/samples/configuration/home/home.reek.yml +0 -4
  140. data/samples/configuration/partial_mask.reek +0 -4
  141. data/samples/configuration/regular_configuration/.reek.yml +0 -4
  142. data/samples/configuration/regular_configuration/empty_sub_directory/.gitignore +0 -0
  143. data/samples/configuration/with_excluded_paths.reek +0 -5
  144. data/samples/no_config_file/.keep +0 -0
  145. data/samples/paths.rb +0 -5
  146. data/samples/smelly_source/inline.rb +0 -704
  147. data/samples/smelly_source/optparse.rb +0 -1788
  148. data/samples/smelly_source/redcloth.rb +0 -1130
  149. data/samples/smelly_source/ruby.rb +0 -368
  150. data/samples/smelly_source/smelly.rb +0 -7
  151. data/samples/source_with_exclude_paths/ignore_me/uncommunicative_method_name.rb +0 -5
  152. data/samples/source_with_exclude_paths/nested/ignore_me_as_well/irresponsible_module.rb +0 -2
  153. data/samples/source_with_exclude_paths/nested/uncommunicative_parameter_name.rb +0 -6
  154. data/samples/source_with_exclude_paths/nested/uncommunicative_variable_name.rb +0 -6
  155. data/samples/source_with_hidden_directories/.hidden/hidden.rb +0 -1
  156. data/samples/source_with_hidden_directories/not_hidden.rb +0 -1
  157. data/samples/source_with_non_ruby_files/gibberish +0 -1
  158. data/samples/source_with_non_ruby_files/python_source.py +0 -1
  159. data/samples/source_with_non_ruby_files/ruby.rb +0 -6
  160. data/spec/factories/factories.rb +0 -37
  161. data/spec/performance/reek/smell_detectors/runtime_speed_spec.rb +0 -17
  162. data/spec/quality/documentation_spec.rb +0 -40
  163. data/spec/quality/reek_source_spec.rb +0 -11
  164. data/spec/reek/ast/node_spec.rb +0 -211
  165. data/spec/reek/ast/object_refs_spec.rb +0 -83
  166. data/spec/reek/ast/reference_collector_spec.rb +0 -47
  167. data/spec/reek/ast/sexp_extensions_spec.rb +0 -516
  168. data/spec/reek/cli/application_spec.rb +0 -168
  169. data/spec/reek/cli/command/report_command_spec.rb +0 -44
  170. data/spec/reek/cli/command/todo_list_command_spec.rb +0 -86
  171. data/spec/reek/cli/options_spec.rb +0 -51
  172. data/spec/reek/cli/silencer_spec.rb +0 -28
  173. data/spec/reek/code_comment_spec.rb +0 -185
  174. data/spec/reek/configuration/app_configuration_spec.rb +0 -195
  175. data/spec/reek/configuration/configuration_file_finder_spec.rb +0 -230
  176. data/spec/reek/configuration/default_directive_spec.rb +0 -13
  177. data/spec/reek/configuration/directory_directives_spec.rb +0 -116
  178. data/spec/reek/configuration/excluded_paths_spec.rb +0 -16
  179. data/spec/reek/configuration/rake_task_converter_spec.rb +0 -33
  180. data/spec/reek/configuration/schema_validator_spec.rb +0 -165
  181. data/spec/reek/context/code_context_spec.rb +0 -192
  182. data/spec/reek/context/ghost_context_spec.rb +0 -60
  183. data/spec/reek/context/method_context_spec.rb +0 -72
  184. data/spec/reek/context/module_context_spec.rb +0 -55
  185. data/spec/reek/context/root_context_spec.rb +0 -12
  186. data/spec/reek/context/statement_counter_spec.rb +0 -24
  187. data/spec/reek/context_builder_spec.rb +0 -460
  188. data/spec/reek/detector_repository_spec.rb +0 -22
  189. data/spec/reek/documentation_link_spec.rb +0 -20
  190. data/spec/reek/errors/base_error_spec.rb +0 -13
  191. data/spec/reek/examiner_spec.rb +0 -309
  192. data/spec/reek/logging_error_handler_spec.rb +0 -24
  193. data/spec/reek/rake/task_spec.rb +0 -56
  194. data/spec/reek/report/code_climate/code_climate_configuration_spec.rb +0 -24
  195. data/spec/reek/report/code_climate/code_climate_fingerprint_spec.rb +0 -126
  196. data/spec/reek/report/code_climate/code_climate_formatter_spec.rb +0 -51
  197. data/spec/reek/report/code_climate/code_climate_report_spec.rb +0 -56
  198. data/spec/reek/report/html_report_spec.rb +0 -19
  199. data/spec/reek/report/json_report_spec.rb +0 -58
  200. data/spec/reek/report/location_formatter_spec.rb +0 -32
  201. data/spec/reek/report/progress_formatter_spec.rb +0 -68
  202. data/spec/reek/report/text_report_spec.rb +0 -89
  203. data/spec/reek/report/xml_report_spec.rb +0 -24
  204. data/spec/reek/report/yaml_report_spec.rb +0 -55
  205. data/spec/reek/report_spec.rb +0 -28
  206. data/spec/reek/smell_configuration_spec.rb +0 -56
  207. data/spec/reek/smell_detectors/attribute_spec.rb +0 -197
  208. data/spec/reek/smell_detectors/base_detector_spec.rb +0 -60
  209. data/spec/reek/smell_detectors/boolean_parameter_spec.rb +0 -93
  210. data/spec/reek/smell_detectors/class_variable_spec.rb +0 -106
  211. data/spec/reek/smell_detectors/control_parameter_spec.rb +0 -300
  212. data/spec/reek/smell_detectors/data_clump_spec.rb +0 -120
  213. data/spec/reek/smell_detectors/duplicate_method_call_spec.rb +0 -211
  214. data/spec/reek/smell_detectors/feature_envy_spec.rb +0 -295
  215. data/spec/reek/smell_detectors/instance_variable_assumption_spec.rb +0 -96
  216. data/spec/reek/smell_detectors/irresponsible_module_spec.rb +0 -226
  217. data/spec/reek/smell_detectors/long_parameter_list_spec.rb +0 -61
  218. data/spec/reek/smell_detectors/long_yield_list_spec.rb +0 -49
  219. data/spec/reek/smell_detectors/manual_dispatch_spec.rb +0 -75
  220. data/spec/reek/smell_detectors/missing_safe_method_spec.rb +0 -62
  221. data/spec/reek/smell_detectors/module_initialize_spec.rb +0 -77
  222. data/spec/reek/smell_detectors/nested_iterators_spec.rb +0 -333
  223. data/spec/reek/smell_detectors/nil_check_spec.rb +0 -100
  224. data/spec/reek/smell_detectors/repeated_conditional_spec.rb +0 -100
  225. data/spec/reek/smell_detectors/subclassed_from_core_class_spec.rb +0 -77
  226. data/spec/reek/smell_detectors/too_many_constants_spec.rb +0 -144
  227. data/spec/reek/smell_detectors/too_many_instance_variables_spec.rb +0 -132
  228. data/spec/reek/smell_detectors/too_many_methods_spec.rb +0 -54
  229. data/spec/reek/smell_detectors/too_many_statements_spec.rb +0 -90
  230. data/spec/reek/smell_detectors/uncommunicative_method_name_spec.rb +0 -78
  231. data/spec/reek/smell_detectors/uncommunicative_module_name_spec.rb +0 -78
  232. data/spec/reek/smell_detectors/uncommunicative_parameter_name_spec.rb +0 -147
  233. data/spec/reek/smell_detectors/uncommunicative_variable_name_spec.rb +0 -201
  234. data/spec/reek/smell_detectors/unused_parameters_spec.rb +0 -114
  235. data/spec/reek/smell_detectors/unused_private_method_spec.rb +0 -205
  236. data/spec/reek/smell_detectors/utility_function_spec.rb +0 -293
  237. data/spec/reek/smell_warning_spec.rb +0 -137
  238. data/spec/reek/source/source_code_spec.rb +0 -66
  239. data/spec/reek/source/source_locator_spec.rb +0 -166
  240. data/spec/reek/spec/should_reek_of_spec.rb +0 -154
  241. data/spec/reek/spec/should_reek_only_of_spec.rb +0 -91
  242. data/spec/reek/spec/should_reek_spec.rb +0 -52
  243. data/spec/reek/spec/smell_matcher_spec.rb +0 -87
  244. data/spec/reek/tree_dresser_spec.rb +0 -46
  245. data/spec/spec_helper.rb +0 -96
  246. data/tasks/configuration.rake +0 -19
  247. data/tasks/console.rake +0 -5
  248. data/tasks/reek.rake +0 -6
  249. data/tasks/rubocop.rake +0 -11
  250. data/tasks/test.rake +0 -32
@@ -1,368 +0,0 @@
1
- module CodeRay
2
- module Scanners
3
-
4
- # This scanner is really complex, since Ruby _is_ a complex language!
5
- #
6
- # It tries to highlight 100% of all common code,
7
- # and 90% of strange codes.
8
- #
9
- # It is optimized for HTML highlighting, and is not very useful for
10
- # parsing or pretty printing.
11
- #
12
- # For now, I think it's better than the scanners in VIM or Syntax, or
13
- # any highlighter I was able to find, except Caleb's RubyLexer.
14
- #
15
- # I hope it's also better than the rdoc/irb lexer.
16
- class Ruby < Scanner
17
-
18
- include Streamable
19
-
20
- register_for :ruby
21
- file_extension 'rb'
22
-
23
- helper :patterns
24
-
25
- private
26
- def scan_tokens tokens, options
27
- last_token_dot = false
28
- value_expected = true
29
- heredocs = nil
30
- last_state = nil
31
- state = :initial
32
- depth = nil
33
- inline_block_stack = []
34
-
35
- patterns = Patterns # avoid constant lookup
36
-
37
- until eos?
38
- match = nil
39
- kind = nil
40
-
41
- if state.instance_of? patterns::StringState
42
- # {{{
43
- match = scan_until(state.pattern) || scan_until(/\z/)
44
- tokens << [match, :content] unless match.empty?
45
- break if eos?
46
-
47
- if state.heredoc and self[1] # end of heredoc
48
- match = getch.to_s
49
- match << scan_until(/$/) unless eos?
50
- tokens << [match, :delimiter]
51
- tokens << [:close, state.type]
52
- state = state.next_state
53
- next
54
- end
55
-
56
- case match = getch
57
-
58
- when state.delim
59
- if state.paren
60
- state.paren_depth -= 1
61
- if state.paren_depth > 0
62
- tokens << [match, :nesting_delimiter]
63
- next
64
- end
65
- end
66
- tokens << [match, :delimiter]
67
- if state.type == :regexp and not eos?
68
- modifiers = scan(/#{patterns::REGEXP_MODIFIERS}/ox)
69
- tokens << [modifiers, :modifier] unless modifiers.empty?
70
- end
71
- tokens << [:close, state.type]
72
- value_expected = false
73
- state = state.next_state
74
-
75
- when '\\'
76
- if state.interpreted
77
- if esc = scan(/ #{patterns::ESCAPE} /ox)
78
- tokens << [match + esc, :char]
79
- else
80
- tokens << [match, :error]
81
- end
82
- else
83
- case m = getch
84
- when state.delim, '\\'
85
- tokens << [match + m, :char]
86
- when nil
87
- tokens << [match, :error]
88
- else
89
- tokens << [match + m, :content]
90
- end
91
- end
92
-
93
- when '#'
94
- case peek(1)
95
- when '{'
96
- inline_block_stack << [state, depth, heredocs]
97
- value_expected = true
98
- state = :initial
99
- depth = 1
100
- tokens << [:open, :inline]
101
- tokens << [match + getch, :inline_delimiter]
102
- when '$', '@'
103
- tokens << [match, :escape]
104
- last_state = state # scan one token as normal code, then return here
105
- state = :initial
106
- else
107
- raise_inspect 'else-case # reached; #%p not handled' % peek(1), tokens
108
- end
109
-
110
- when state.paren
111
- state.paren_depth += 1
112
- tokens << [match, :nesting_delimiter]
113
-
114
- when /#{patterns::REGEXP_SYMBOLS}/ox
115
- tokens << [match, :function]
116
-
117
- else
118
- raise_inspect 'else-case " reached; %p not handled, state = %p' % [match, state], tokens
119
-
120
- end
121
- next
122
- # }}}
123
- else
124
- # {{{
125
- if match = scan(/[ \t\f]+/)
126
- kind = :space
127
- match << scan(/\s*/) unless eos? or heredocs
128
- tokens << [match, kind]
129
- next
130
-
131
- elsif match = scan(/\\?\n/)
132
- kind = :space
133
- if match == "\n"
134
- value_expected = true # FIXME not quite true
135
- state = :initial if state == :undef_comma_expected
136
- end
137
- if heredocs
138
- unscan # heredoc scanning needs \n at start
139
- state = heredocs.shift
140
- tokens << [:open, state.type]
141
- heredocs = nil if heredocs.empty?
142
- next
143
- else
144
- match << scan(/\s*/) unless eos?
145
- end
146
- tokens << [match, kind]
147
- next
148
-
149
- elsif match = scan(/\#.*/) or
150
- ( bol? and match = scan(/#{patterns::RUBYDOC_OR_DATA}/o) )
151
- kind = :comment
152
- value_expected = true
153
- tokens << [match, kind]
154
- next
155
-
156
- elsif state == :initial
157
-
158
- # IDENTS #
159
- if match = scan(/#{patterns::METHOD_NAME}/o)
160
- if last_token_dot
161
- kind = if match[/^[A-Z]/] and not match?(/\(/) then :constant else :ident end
162
- else
163
- kind = patterns::IDENT_KIND[match]
164
- if kind == :ident and match[/^[A-Z]/] and not match[/[!?]$/] and not match?(/\(/)
165
- kind = :constant
166
- elsif kind == :reserved
167
- state = patterns::DEF_NEW_STATE[match]
168
- end
169
- end
170
- ## experimental!
171
- value_expected = :set if
172
- patterns::REGEXP_ALLOWED[match] or check(/#{patterns::VALUE_FOLLOWS}/o)
173
-
174
- elsif last_token_dot and match = scan(/#{patterns::METHOD_NAME_OPERATOR}/o)
175
- kind = :ident
176
- value_expected = :set if check(/#{patterns::VALUE_FOLLOWS}/o)
177
-
178
- # OPERATORS #
179
- elsif not last_token_dot and match = scan(/ \.\.\.? | (?:\.|::)() | [,\(\)\[\]\{\}] | ==?=? /x)
180
- if match !~ / [.\)\]\}] /x or match =~ /\.\.\.?/
181
- value_expected = :set
182
- end
183
- last_token_dot = :set if self[1]
184
- kind = :operator
185
- unless inline_block_stack.empty?
186
- case match
187
- when '{'
188
- depth += 1
189
- when '}'
190
- depth -= 1
191
- if depth == 0 # closing brace of inline block reached
192
- state, depth, heredocs = inline_block_stack.pop
193
- tokens << [match, :inline_delimiter]
194
- kind = :inline
195
- match = :close
196
- end
197
- end
198
- end
199
-
200
- elsif match = scan(/ ['"] /mx)
201
- tokens << [:open, :string]
202
- kind = :delimiter
203
- state = patterns::StringState.new :string, match == '"', match # important for streaming
204
-
205
- elsif match = scan(/#{patterns::INSTANCE_VARIABLE}/o)
206
- kind = :instance_variable
207
-
208
- elsif value_expected and match = scan(/\//)
209
- tokens << [:open, :regexp]
210
- kind = :delimiter
211
- interpreted = true
212
- state = patterns::StringState.new :regexp, interpreted, match
213
-
214
- elsif match = scan(/#{patterns::NUMERIC}/o)
215
- kind = if self[1] then :float else :integer end
216
-
217
- elsif match = scan(/#{patterns::SYMBOL}/o)
218
- case delim = match[1]
219
- when ?', ?"
220
- tokens << [:open, :symbol]
221
- tokens << [':', :symbol]
222
- match = delim.chr
223
- kind = :delimiter
224
- state = patterns::StringState.new :symbol, delim == ?", match
225
- else
226
- kind = :symbol
227
- end
228
-
229
- elsif match = scan(/ [-+!~^]=? | [*|&]{1,2}=? | >>? /x)
230
- value_expected = :set
231
- kind = :operator
232
-
233
- elsif value_expected and match = scan(/#{patterns::HEREDOC_OPEN}/o)
234
- indented = self[1] == '-'
235
- quote = self[3]
236
- delim = self[quote ? 4 : 2]
237
- kind = patterns::QUOTE_TO_TYPE[quote]
238
- tokens << [:open, kind]
239
- tokens << [match, :delimiter]
240
- match = :close
241
- heredoc = patterns::StringState.new kind, quote != '\'', delim, (indented ? :indented : :linestart )
242
- heredocs ||= [] # create heredocs if empty
243
- heredocs << heredoc
244
-
245
- elsif value_expected and match = scan(/#{patterns::FANCY_START_CORRECT}/o)
246
- kind, interpreted = *patterns::FancyStringType.fetch(self[1]) do
247
- raise_inspect 'Unknown fancy string: %%%p' % k, tokens
248
- end
249
- tokens << [:open, kind]
250
- state = patterns::StringState.new kind, interpreted, self[2]
251
- kind = :delimiter
252
-
253
- elsif value_expected and match = scan(/#{patterns::CHARACTER}/o)
254
- kind = :integer
255
-
256
- elsif match = scan(/ [\/%]=? | <(?:<|=>?)? | [?:;] /x)
257
- value_expected = :set
258
- kind = :operator
259
-
260
- elsif match = scan(/`/)
261
- if last_token_dot
262
- kind = :operator
263
- else
264
- tokens << [:open, :shell]
265
- kind = :delimiter
266
- state = patterns::StringState.new :shell, true, match
267
- end
268
-
269
- elsif match = scan(/#{patterns::GLOBAL_VARIABLE}/o)
270
- kind = :global_variable
271
-
272
- elsif match = scan(/#{patterns::CLASS_VARIABLE}/o)
273
- kind = :class_variable
274
-
275
- else
276
- kind = :error
277
- match = getch
278
-
279
- end
280
-
281
- elsif state == :def_expected
282
- state = :initial
283
- if match = scan(/(?>#{patterns::METHOD_NAME_EX})(?!\.|::)/o)
284
- kind = :method
285
- else
286
- next
287
- end
288
-
289
- elsif state == :undef_expected
290
- state = :undef_comma_expected
291
- if match = scan(/#{patterns::METHOD_NAME_EX}/o)
292
- kind = :method
293
- elsif match = scan(/#{patterns::SYMBOL}/o)
294
- case delim = match[1]
295
- when ?', ?"
296
- tokens << [:open, :symbol]
297
- tokens << [':', :symbol]
298
- match = delim.chr
299
- kind = :delimiter
300
- state = patterns::StringState.new :symbol, delim == ?", match
301
- state.next_state = :undef_comma_expected
302
- else
303
- kind = :symbol
304
- end
305
- else
306
- state = :initial
307
- next
308
- end
309
-
310
- elsif state == :undef_comma_expected
311
- if match = scan(/,/)
312
- kind = :operator
313
- state = :undef_expected
314
- else
315
- state = :initial
316
- next
317
- end
318
-
319
- elsif state == :module_expected
320
- if match = scan(/<</)
321
- kind = :operator
322
- else
323
- state = :initial
324
- if match = scan(/ (?:#{patterns::IDENT}::)* #{patterns::IDENT} /ox)
325
- kind = :class
326
- else
327
- next
328
- end
329
- end
330
-
331
- end
332
- # }}}
333
-
334
- value_expected = value_expected == :set
335
- last_token_dot = last_token_dot == :set
336
-
337
- if $DEBUG and not kind
338
- raise_inspect 'Error token %p in line %d' %
339
- [[match, kind], line], tokens, state
340
- end
341
- raise_inspect 'Empty token', tokens unless match
342
-
343
- tokens << [match, kind]
344
-
345
- if last_state
346
- state = last_state
347
- last_state = nil
348
- end
349
- end
350
- end
351
-
352
- inline_block_stack << [state] if state.is_a? patterns::StringState
353
- until inline_block_stack.empty?
354
- this_block = inline_block_stack.pop
355
- tokens << [:close, :inline] if this_block.size > 1
356
- state = this_block.first
357
- tokens << [:close, state.type]
358
- end
359
-
360
- tokens
361
- end
362
-
363
- end
364
-
365
- end
366
- end
367
-
368
- # vim:fdm=marker
@@ -1,7 +0,0 @@
1
- # Smelly class
2
- class Smelly
3
- # This will reek of UncommunicativeMethodName
4
- def x
5
- y = 10 # This will reek of UncommunicativeVariableName
6
- end
7
- end
@@ -1,5 +0,0 @@
1
- # Klass comment.
2
- class Klass
3
- def m
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- # Klass comment
2
- class Klass
3
- def method(a)
4
- a + @x
5
- end
6
- end
@@ -1,6 +0,0 @@
1
- # Klass comment.
2
- class Klass
3
- def meth
4
- x = 5
5
- end
6
- end
@@ -1 +0,0 @@
1
- adfasfsadfasdfsafsad
@@ -1 +0,0 @@
1
- print("Hello, World!")
@@ -1,6 +0,0 @@
1
- # Klass comment
2
- class Klass
3
- def method(a)
4
- a + @x
5
- end
6
- end
@@ -1,37 +0,0 @@
1
- require_relative '../../lib/reek/smell_detectors'
2
- require_relative '../../lib/reek/smell_detectors/base_detector'
3
- require_relative '../../lib/reek/smell_warning'
4
- require_relative '../../lib/reek/cli/options'
5
-
6
- FactoryBot.define do
7
- factory :smell_warning, class: 'Reek::SmellWarning' do
8
- skip_create
9
-
10
- smell_type { 'FeatureEnvy' }
11
- source { 'dummy_file' }
12
- lines { [42] }
13
- message { 'smell warning message' }
14
- parameters { {} }
15
- context { 'self' }
16
-
17
- initialize_with do
18
- new(smell_type,
19
- source: source,
20
- context: context,
21
- lines: lines,
22
- message: message,
23
- parameters: parameters)
24
- end
25
- end
26
-
27
- factory :code_comment, class: 'Reek::CodeComment' do
28
- comment { '' }
29
- line { 1 }
30
- source { 'string' }
31
- initialize_with do
32
- new comment: comment,
33
- line: line,
34
- source: source
35
- end
36
- end
37
- end