ruby-lint 0.0.3 → 0.0.4
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.tar.gz.asc +14 -14
- data/.gitignore +1 -2
- data/.rubocop.yml +59 -0
- data/.travis.yml +3 -7
- data/.yardopts +2 -2
- data/Gemfile +4 -0
- data/MANIFEST +103 -67
- data/README.md +13 -31
- data/Rakefile +1 -6
- data/checksum/ruby-lint-0.0.3.gem.sha512 +1 -0
- data/debug/memory_usage.rb +14 -0
- data/debug/profile.rb +18 -0
- data/doc/architecture.md +14 -18
- data/doc/changelog.md +29 -0
- data/doc/code_analysis.md +12 -12
- data/doc/configuration.md +21 -50
- data/doc/graphviz/flow.dot +1 -1
- data/doc/images/flow.png +0 -0
- data/lib/ruby-lint.rb +33 -19
- data/lib/ruby-lint/analysis/argument_amount.rb +84 -0
- data/lib/ruby-lint/analysis/base.rb +132 -0
- data/lib/ruby-lint/analysis/confusing_variables.rb +26 -0
- data/lib/ruby-lint/analysis/pedantics.rb +36 -0
- data/lib/ruby-lint/analysis/shadowing_variables.rb +47 -0
- data/lib/ruby-lint/analysis/undefined_methods.rb +91 -0
- data/lib/ruby-lint/analysis/undefined_variables.rb +46 -0
- data/lib/ruby-lint/analysis/unused_variables.rb +49 -0
- data/lib/ruby-lint/ast/builder.rb +17 -0
- data/lib/ruby-lint/ast/node.rb +39 -0
- data/lib/ruby-lint/cli.rb +0 -19
- data/lib/ruby-lint/cli/analyze.rb +54 -28
- data/lib/ruby-lint/cli/ast.rb +21 -6
- data/lib/ruby-lint/cli/base.rb +0 -23
- data/lib/ruby-lint/configuration.rb +112 -42
- data/lib/ruby-lint/constant_loader.rb +10 -28
- data/lib/ruby-lint/default_names.rb +19 -0
- data/lib/ruby-lint/definition/constant_proxy.rb +56 -0
- data/lib/ruby-lint/definition/ruby_method.rb +21 -143
- data/lib/ruby-lint/definition/ruby_object.rb +142 -246
- data/lib/ruby-lint/definition_builder/base.rb +43 -0
- data/lib/ruby-lint/definition_builder/primitive.rb +39 -0
- data/lib/ruby-lint/definition_builder/ruby_array.rb +77 -0
- data/lib/ruby-lint/definition_builder/ruby_block.rb +34 -0
- data/lib/ruby-lint/definition_builder/ruby_class.rb +24 -0
- data/lib/ruby-lint/definition_builder/ruby_hash.rb +37 -0
- data/lib/ruby-lint/definition_builder/ruby_method.rb +84 -0
- data/lib/ruby-lint/definition_builder/ruby_module.rb +68 -0
- data/lib/ruby-lint/definition_generator.rb +41 -15
- data/lib/ruby-lint/definitions/core/arg0.rb +1 -1
- data/lib/ruby-lint/definitions/core/argf.rb +1 -1
- data/lib/ruby-lint/definitions/core/argument_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/argv.rb +1 -1
- data/lib/ruby-lint/definitions/core/array.rb +6 -6
- data/lib/ruby-lint/definitions/core/autoload.rb +2 -2
- data/lib/ruby-lint/definitions/core/basic_object.rb +3 -3
- data/lib/ruby-lint/definitions/core/bignum.rb +2 -2
- data/lib/ruby-lint/definitions/core/binding.rb +2 -2
- data/lib/ruby-lint/definitions/core/class.rb +2 -2
- data/lib/ruby-lint/definitions/core/comparable.rb +1 -1
- data/lib/ruby-lint/definitions/core/complex.rb +4 -4
- data/lib/ruby-lint/definitions/core/condition_variable.rb +2 -2
- data/lib/ruby-lint/definitions/core/continuation.rb +2 -2
- data/lib/ruby-lint/definitions/core/data.rb +2 -2
- data/lib/ruby-lint/definitions/core/date.rb +34 -34
- data/lib/ruby-lint/definitions/core/date_time.rb +26 -26
- data/lib/ruby-lint/definitions/core/default_record_separator.rb +1 -1
- data/lib/ruby-lint/definitions/core/digest.rb +14 -14
- data/lib/ruby-lint/definitions/core/dir.rb +34 -34
- data/lib/ruby-lint/definitions/core/encoding.rb +237 -237
- data/lib/ruby-lint/definitions/core/encoding_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/enumerable.rb +15 -15
- data/lib/ruby-lint/definitions/core/enumerator.rb +2 -2
- data/lib/ruby-lint/definitions/core/env.rb +1 -1
- data/lib/ruby-lint/definitions/core/eoferror.rb +2 -2
- data/lib/ruby-lint/definitions/core/erb.rb +22 -22
- data/lib/ruby-lint/definitions/core/errno.rb +525 -525
- data/lib/ruby-lint/definitions/core/etc.rb +6 -6
- data/lib/ruby-lint/definitions/core/exception.rb +2 -2
- data/lib/ruby-lint/definitions/core/false.rb +1 -1
- data/lib/ruby-lint/definitions/core/false_class.rb +2 -2
- data/lib/ruby-lint/definitions/core/fatal_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/fiber.rb +2 -2
- data/lib/ruby-lint/definitions/core/fiber_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/file.rb +68 -68
- data/lib/ruby-lint/definitions/core/file_list.rb +2 -2
- data/lib/ruby-lint/definitions/core/file_test.rb +1 -1
- data/lib/ruby-lint/definitions/core/file_utils.rb +16 -16
- data/lib/ruby-lint/definitions/core/fixnum.rb +4 -4
- data/lib/ruby-lint/definitions/core/float.rb +16 -16
- data/lib/ruby-lint/definitions/core/float_domain_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/gc.rb +2 -2
- data/lib/ruby-lint/definitions/core/gem.rb +119 -119
- data/lib/ruby-lint/definitions/core/hash.rb +14 -14
- data/lib/ruby-lint/definitions/core/immediate_value.rb +1 -1
- data/lib/ruby-lint/definitions/core/index_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/integer.rb +2 -2
- data/lib/ruby-lint/definitions/core/interrupt.rb +2 -2
- data/lib/ruby-lint/definitions/core/io.rb +38 -38
- data/lib/ruby-lint/definitions/core/ioerror.rb +2 -2
- data/lib/ruby-lint/definitions/core/kernel.rb +3 -3
- data/lib/ruby-lint/definitions/core/key_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/load_error.rb +6 -6
- data/lib/ruby-lint/definitions/core/local_jump_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/main.rb +1 -1
- data/lib/ruby-lint/definitions/core/marshal.rb +35 -35
- data/lib/ruby-lint/definitions/core/match_data.rb +2 -2
- data/lib/ruby-lint/definitions/core/math.rb +7 -7
- data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/method.rb +2 -2
- data/lib/ruby-lint/definitions/core/module.rb +1 -1
- data/lib/ruby-lint/definitions/core/monitor.rb +4 -4
- data/lib/ruby-lint/definitions/core/monitor_mixin.rb +5 -5
- data/lib/ruby-lint/definitions/core/mutex.rb +2 -2
- data/lib/ruby-lint/definitions/core/name_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/nil.rb +1 -1
- data/lib/ruby-lint/definitions/core/nil_class.rb +2 -2
- data/lib/ruby-lint/definitions/core/no_memory_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/no_method_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/not_implemented_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/numeric.rb +2 -2
- data/lib/ruby-lint/definitions/core/object.rb +2 -2
- data/lib/ruby-lint/definitions/core/object_space.rb +1 -1
- data/lib/ruby-lint/definitions/core/open_struct.rb +3 -3
- data/lib/ruby-lint/definitions/core/option_parser.rb +83 -83
- data/lib/ruby-lint/definitions/core/precision.rb +1 -1
- data/lib/ruby-lint/definitions/core/primitive_failure.rb +2 -2
- data/lib/ruby-lint/definitions/core/proc.rb +2 -2
- data/lib/ruby-lint/definitions/core/process.rb +29 -29
- data/lib/ruby-lint/definitions/core/psych.rb +149 -149
- data/lib/ruby-lint/definitions/core/queue.rb +2 -2
- data/lib/ruby-lint/definitions/core/rake.rb +117 -117
- data/lib/ruby-lint/definitions/core/rake_file_utils.rb +1 -1
- data/lib/ruby-lint/definitions/core/rakeversion.rb +1 -1
- data/lib/ruby-lint/definitions/core/random.rb +2 -2
- data/lib/ruby-lint/definitions/core/range.rb +4 -4
- data/lib/ruby-lint/definitions/core/range_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/rational.rb +2 -2
- data/lib/ruby-lint/definitions/core/rb_config.rb +3 -3
- data/lib/ruby-lint/definitions/core/regexp.rb +28 -28
- data/lib/ruby-lint/definitions/core/regexp_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/rubinius.rb +1057 -1057
- data/lib/ruby-lint/definitions/core/ruby_copyright.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_description.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_engine.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_lint.rb +9 -9
- data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_platform.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_release_date.rb +1 -1
- data/lib/ruby-lint/definitions/core/ruby_version.rb +1 -1
- data/lib/ruby-lint/definitions/core/runtime_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/scan_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/script_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/security_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/shellwords.rb +1 -1
- data/lib/ruby-lint/definitions/core/signal.rb +3 -3
- data/lib/ruby-lint/definitions/core/signal_exception.rb +2 -2
- data/lib/ruby-lint/definitions/core/singleton.rb +2 -2
- data/lib/ruby-lint/definitions/core/sized_queue.rb +2 -2
- data/lib/ruby-lint/definitions/core/standard_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/stderr.rb +1 -1
- data/lib/ruby-lint/definitions/core/stdin.rb +1 -1
- data/lib/ruby-lint/definitions/core/stdout.rb +1 -1
- data/lib/ruby-lint/definitions/core/stop_iteration.rb +2 -2
- data/lib/ruby-lint/definitions/core/string.rb +21 -21
- data/lib/ruby-lint/definitions/core/string_io.rb +7 -7
- data/lib/ruby-lint/definitions/core/string_scanner.rb +4 -4
- data/lib/ruby-lint/definitions/core/struct.rb +20 -20
- data/lib/ruby-lint/definitions/core/syck.rb +4 -4
- data/lib/ruby-lint/definitions/core/symbol.rb +2 -2
- data/lib/ruby-lint/definitions/core/syntax_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/system_call_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/system_exit.rb +2 -2
- data/lib/ruby-lint/definitions/core/system_stack_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/thread.rb +6 -6
- data/lib/ruby-lint/definitions/core/thread_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/thread_group.rb +2 -2
- data/lib/ruby-lint/definitions/core/time.rb +3 -3
- data/lib/ruby-lint/definitions/core/toplevel_binding.rb +1 -1
- data/lib/ruby-lint/definitions/core/true.rb +1 -1
- data/lib/ruby-lint/definitions/core/true_class.rb +2 -2
- data/lib/ruby-lint/definitions/core/type_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/unbound_method.rb +2 -2
- data/lib/ruby-lint/definitions/core/unmarshalable.rb +1 -1
- data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +2 -2
- data/lib/ruby-lint/definitions/core/weak_ref.rb +4 -4
- data/lib/ruby-lint/definitions/core/zero_division_error.rb +2 -2
- data/lib/ruby-lint/definitions/rails.rb +12 -0
- data/lib/ruby-lint/definitions/rails/abstract_controller.rb +335 -0
- data/lib/ruby-lint/definitions/rails/action_controller.rb +1244 -0
- data/lib/ruby-lint/definitions/rails/action_dispatch.rb +741 -0
- data/lib/ruby-lint/definitions/rails/action_mailer.rb +502 -0
- data/lib/ruby-lint/definitions/rails/action_pack.rb +16 -0
- data/lib/ruby-lint/definitions/rails/action_view.rb +898 -0
- data/lib/ruby-lint/definitions/rails/active_model.rb +437 -0
- data/lib/ruby-lint/definitions/rails/active_record.rb +2901 -0
- data/lib/ruby-lint/definitions/rails/active_support.rb +1963 -0
- data/lib/ruby-lint/definitions/rails/arel.rb +665 -0
- data/lib/ruby-lint/definitions/rails/rails.rb +452 -0
- data/lib/ruby-lint/definitions/rails/sprockets.rb +968 -0
- data/lib/ruby-lint/generated_constant.rb +33 -0
- data/lib/ruby-lint/helper/constant_paths.rb +30 -21
- data/lib/ruby-lint/inspector.rb +20 -2
- data/lib/ruby-lint/iterator.rb +11 -171
- data/lib/ruby-lint/nested_stack.rb +46 -0
- data/lib/ruby-lint/parser.rb +24 -806
- data/lib/ruby-lint/report.rb +2 -30
- data/lib/ruby-lint/report/entry.rb +2 -2
- data/lib/ruby-lint/runner.rb +81 -0
- data/lib/ruby-lint/template/definition.erb +12 -8
- data/lib/ruby-lint/variable_predicates.rb +16 -58
- data/lib/ruby-lint/version.rb +1 -1
- data/lib/ruby-lint/virtual_machine.rb +1044 -0
- data/ruby-lint.gemspec +17 -7
- data/spec/fixtures/complex/rails/basic_controller.rb +9 -0
- data/spec/fixtures/complex/rcap.rb +38 -0
- data/spec/fixtures/complex/slop.rb +680 -0
- data/spec/fixtures/config.yml +8 -0
- data/spec/fixtures/invalid.rb +3 -0
- data/spec/fixtures/invalid_2.rb +3 -0
- data/spec/fixtures/syntax_error.rb +1 -0
- data/spec/fixtures/valid.rb +3 -0
- data/spec/helper.rb +6 -0
- data/spec/ruby-lint/{analyze → analysis}/argument_amount.rb +7 -7
- data/spec/ruby-lint/analysis/confusing_variables.rb +46 -0
- data/spec/ruby-lint/analysis/pedantics.rb +43 -0
- data/spec/ruby-lint/{analyze → analysis}/shadowing_variables.rb +5 -5
- data/spec/ruby-lint/{analyze → analysis}/undefined_methods.rb +18 -18
- data/spec/ruby-lint/{analyze → analysis}/undefined_variables.rb +19 -25
- data/spec/ruby-lint/{analyze → analysis}/unused_variables.rb +29 -16
- data/spec/ruby-lint/ast/node.rb +33 -0
- data/spec/ruby-lint/cli/analyze.rb +31 -0
- data/spec/ruby-lint/cli/ast.rb +23 -0
- data/spec/ruby-lint/configuration.rb +45 -6
- data/spec/ruby-lint/definition/constant_proxy.rb +31 -0
- data/spec/ruby-lint/definition/dsl.rb +13 -20
- data/spec/ruby-lint/definition/ruby_method.rb +65 -148
- data/spec/ruby-lint/definition/ruby_object.rb +60 -96
- data/spec/ruby-lint/definition_builder/primitive.rb +62 -0
- data/spec/ruby-lint/definition_builder/ruby_class.rb +108 -0
- data/spec/ruby-lint/definition_builder/ruby_method.rb +53 -0
- data/spec/ruby-lint/definition_builder/ruby_module.rb +50 -0
- data/spec/ruby-lint/iterator.rb +40 -16
- data/spec/ruby-lint/nested_stack.rb +23 -0
- data/spec/ruby-lint/parser.rb +14 -0
- data/spec/ruby-lint/report.rb +0 -10
- data/spec/ruby-lint/report/entry.rb +8 -4
- data/spec/ruby-lint/runner.rb +32 -0
- data/spec/ruby-lint/virtual_machine/assignments/arrays.rb +87 -0
- data/spec/ruby-lint/virtual_machine/assignments/hashes.rb +52 -0
- data/spec/ruby-lint/virtual_machine/assignments/optional.rb +41 -0
- data/spec/ruby-lint/{definitions_builder → virtual_machine}/assignments/return_values.rb +11 -11
- data/spec/ruby-lint/virtual_machine/assignments/variables.rb +85 -0
- data/spec/ruby-lint/virtual_machine/associate_nodes.rb +17 -0
- data/spec/ruby-lint/virtual_machine/autoloading.rb +31 -0
- data/spec/ruby-lint/virtual_machine/blocks.rb +64 -0
- data/spec/ruby-lint/virtual_machine/classes/class_methods.rb +21 -0
- data/spec/ruby-lint/virtual_machine/classes/extending.rb +104 -0
- data/spec/ruby-lint/virtual_machine/classes/redefining.rb +24 -0
- data/spec/ruby-lint/virtual_machine/classes/sclass.rb +94 -0
- data/spec/ruby-lint/virtual_machine/classes/scoping.rb +60 -0
- data/spec/ruby-lint/virtual_machine/complex/rails.rb +18 -0
- data/spec/ruby-lint/virtual_machine/complex/rcap.rb +15 -0
- data/spec/ruby-lint/virtual_machine/complex/slop.rb +16 -0
- data/spec/ruby-lint/{definitions_builder → virtual_machine}/for.rb +2 -2
- data/spec/ruby-lint/virtual_machine/freeze.rb +13 -0
- data/spec/ruby-lint/virtual_machine/interpolation.rb +12 -0
- data/spec/ruby-lint/virtual_machine/methods/defining.rb +40 -0
- data/spec/ruby-lint/virtual_machine/methods/exporting.rb +19 -0
- data/spec/ruby-lint/virtual_machine/methods/parameters.rb +77 -0
- data/spec/ruby-lint/virtual_machine/methods/patching.rb +26 -0
- data/spec/ruby-lint/virtual_machine/methods/scoping.rb +63 -0
- data/spec/ruby-lint/virtual_machine/methods/visibility.rb +64 -0
- data/spec/ruby-lint/{definitions_builder → virtual_machine}/modules.rb +16 -16
- data/spec/ruby-lint/virtual_machine/reference_amount.rb +33 -0
- data/spec/ruby-lint/virtual_machine/unused.rb +17 -0
- data/spec/support/bacon.rb +13 -13
- data/spec/support/building.rb +23 -16
- data/spec/support/coveralls.rb +5 -0
- data/spec/support/fixtures.rb +20 -0
- data/spec/support/parsing.rb +3 -5
- data/spec/support/simplecov.rb +5 -3
- data/task/build.rake +1 -1
- data/task/cop.rake +11 -0
- data/task/generate.rake +40 -2
- data/task/profile.rake +27 -0
- data/task/todo.rake +6 -0
- data/task/travis.rake +7 -0
- metadata +160 -75
- metadata.gz.asc +14 -14
- data/doc/build/.gitkeep +0 -0
- data/lib/ruby-lint/analyze/argument_amount.rb +0 -73
- data/lib/ruby-lint/analyze/shadowing_variables.rb +0 -32
- data/lib/ruby-lint/analyze/undefined_methods.rb +0 -68
- data/lib/ruby-lint/analyze/undefined_variables.rb +0 -72
- data/lib/ruby-lint/analyze/unused_variables.rb +0 -48
- data/lib/ruby-lint/base.rb +0 -85
- data/lib/ruby-lint/definitions_builder.rb +0 -692
- data/lib/ruby-lint/helper/conversion.rb +0 -33
- data/lib/ruby-lint/helper/current_scope.rb +0 -98
- data/lib/ruby-lint/helper/methods.rb +0 -91
- data/lib/ruby-lint/node.rb +0 -107
- data/lib/ruby-lint/parser_error.rb +0 -30
- data/spec/ruby-lint/constant_loader.rb +0 -32
- data/spec/ruby-lint/definition/method_calls.rb +0 -26
- data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +0 -71
- data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +0 -65
- data/spec/ruby-lint/definitions_builder/assignments/objects.rb +0 -23
- data/spec/ruby-lint/definitions_builder/assignments/optional.rb +0 -22
- data/spec/ruby-lint/definitions_builder/assignments/variables.rb +0 -71
- data/spec/ruby-lint/definitions_builder/associate_nodes.rb +0 -17
- data/spec/ruby-lint/definitions_builder/blocks.rb +0 -40
- data/spec/ruby-lint/definitions_builder/classes.rb +0 -230
- data/spec/ruby-lint/definitions_builder/methods.rb +0 -147
- data/spec/ruby-lint/definitions_builder/reference_amount.rb +0 -31
- data/spec/ruby-lint/definitions_builder/unused.rb +0 -15
- data/spec/ruby-lint/node.rb +0 -38
- data/spec/ruby-lint/parser/assignments.rb +0 -225
- data/spec/ruby-lint/parser/classes.rb +0 -110
- data/spec/ruby-lint/parser/errors.rb +0 -12
- data/spec/ruby-lint/parser/metadata.rb +0 -17
- data/spec/ruby-lint/parser/method_definitions.rb +0 -111
- data/spec/ruby-lint/parser/methods.rb +0 -217
- data/spec/ruby-lint/parser/modules.rb +0 -70
- data/spec/ruby-lint/parser/operators.rb +0 -40
- data/spec/ruby-lint/parser/statements/begin.rb +0 -55
- data/spec/ruby-lint/parser/statements/case.rb +0 -34
- data/spec/ruby-lint/parser/statements/defined.rb +0 -11
- data/spec/ruby-lint/parser/statements/for.rb +0 -34
- data/spec/ruby-lint/parser/statements/if.rb +0 -46
- data/spec/ruby-lint/parser/statements/return.rb +0 -14
- data/spec/ruby-lint/parser/statements/super.rb +0 -49
- data/spec/ruby-lint/parser/statements/unless.rb +0 -42
- data/spec/ruby-lint/parser/statements/until.rb +0 -25
- data/spec/ruby-lint/parser/statements/while.rb +0 -25
- data/spec/ruby-lint/parser/statements/yield.rb +0 -18
- data/spec/ruby-lint/parser/types/arrays.rb +0 -47
- data/spec/ruby-lint/parser/types/booleans.rb +0 -11
- data/spec/ruby-lint/parser/types/constants.rb +0 -32
- data/spec/ruby-lint/parser/types/hashes.rb +0 -55
- data/spec/ruby-lint/parser/types/nil.rb +0 -7
- data/spec/ruby-lint/parser/types/numbers.rb +0 -11
- data/spec/ruby-lint/parser/types/procs.rb +0 -11
- data/spec/ruby-lint/parser/types/ranges.rb +0 -11
- data/spec/ruby-lint/parser/types/regexp.rb +0 -27
- data/spec/ruby-lint/parser/types/strings.rb +0 -44
- data/spec/ruby-lint/parser/types/symbols.rb +0 -15
- data/task/stdlib.rake +0 -23
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# Base analysis class that provides various helper methods commonly used
|
|
5
|
+
# across analysis classes.
|
|
6
|
+
#
|
|
7
|
+
# @!attribute [r] report
|
|
8
|
+
# @return [RubyLint::Report]
|
|
9
|
+
#
|
|
10
|
+
# @!attribute [r] vm
|
|
11
|
+
# @return [RubyLint::VirtualMachine]
|
|
12
|
+
#
|
|
13
|
+
class Base < Iterator
|
|
14
|
+
include Helper::ConstantPaths
|
|
15
|
+
|
|
16
|
+
attr_reader :report, :vm
|
|
17
|
+
|
|
18
|
+
##
|
|
19
|
+
# Array containing the callback names for which a new scope should be
|
|
20
|
+
# created.
|
|
21
|
+
#
|
|
22
|
+
# @return [Array<Symbol>]
|
|
23
|
+
#
|
|
24
|
+
SCOPES = [:root, :block, :class, :def, :module, :sclass]
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# Called after a new instance of this class is created.
|
|
28
|
+
#
|
|
29
|
+
def after_initialize
|
|
30
|
+
unless vm.is_a?(VirtualMachine)
|
|
31
|
+
raise(
|
|
32
|
+
ArgumentError,
|
|
33
|
+
'Analysis classes require a valid RubyLint::VirtualMachine ' \
|
|
34
|
+
'instance to be set using `SomeAnalysisClass.new(:vm => ...)`'
|
|
35
|
+
)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
@scopes = []
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
SCOPES.each do |type|
|
|
42
|
+
define_method("on_#{type}") do |node|
|
|
43
|
+
set_current_scope(node)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
define_method("after_#{type}") do |node|
|
|
47
|
+
set_previous_scope
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
protected
|
|
52
|
+
|
|
53
|
+
##
|
|
54
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
55
|
+
#
|
|
56
|
+
def definitions
|
|
57
|
+
return vm.definitions
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
##
|
|
61
|
+
# Returns the current scope.
|
|
62
|
+
#
|
|
63
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
64
|
+
#
|
|
65
|
+
def current_scope
|
|
66
|
+
return @scopes[-1]
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
##
|
|
70
|
+
# Sets the current scope to the definition associated with the given
|
|
71
|
+
# node.
|
|
72
|
+
#
|
|
73
|
+
# @param [RubyLint::Node] node
|
|
74
|
+
#
|
|
75
|
+
def set_current_scope(node)
|
|
76
|
+
unless vm.associations.key?(node)
|
|
77
|
+
raise ArgumentError, "No associations for node #{node}"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
@scopes << vm.associations[node]
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
##
|
|
84
|
+
# Sets the current scope back to the previous one.
|
|
85
|
+
#
|
|
86
|
+
def set_previous_scope
|
|
87
|
+
@scopes.pop
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
##
|
|
91
|
+
# Adds an error message to the report.
|
|
92
|
+
#
|
|
93
|
+
# @param [String] message The message to add.
|
|
94
|
+
# @param [RubyLint::Node] node The node for which to add the message.
|
|
95
|
+
#
|
|
96
|
+
def error(message, node)
|
|
97
|
+
add_message(:error, message, node)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
##
|
|
101
|
+
# Adds a warning message to the report.
|
|
102
|
+
#
|
|
103
|
+
# @see RubyLint::Callback#error
|
|
104
|
+
#
|
|
105
|
+
def warning(message, node)
|
|
106
|
+
add_message(:warning, message, node)
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
##
|
|
110
|
+
# Adds a regular informational message to the report.
|
|
111
|
+
#
|
|
112
|
+
# @see RubyLint::Callback#error
|
|
113
|
+
#
|
|
114
|
+
def info(message, node)
|
|
115
|
+
add_message(:info, message, node)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
##
|
|
119
|
+
# Adds a message of the given level.
|
|
120
|
+
#
|
|
121
|
+
# @param [Symbol] level
|
|
122
|
+
# @param [String] message
|
|
123
|
+
# @param [String] node
|
|
124
|
+
#
|
|
125
|
+
def add_message(level, message, node)
|
|
126
|
+
return unless report
|
|
127
|
+
|
|
128
|
+
report.add(level, message, node.line, node.column, node.file)
|
|
129
|
+
end
|
|
130
|
+
end # Base
|
|
131
|
+
end # Analysis
|
|
132
|
+
end # RubyLint
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# The {RubyLint::Analysis::ConfusingVariables} class checks for local
|
|
5
|
+
# variable assignments where the variable name is the same as an existing
|
|
6
|
+
# method name. Often these kind of assignments can lead to unexpected
|
|
7
|
+
# behaviour.
|
|
8
|
+
#
|
|
9
|
+
class ConfusingVariables < Base
|
|
10
|
+
##
|
|
11
|
+
# @param [RubyLint::AST::Node] node
|
|
12
|
+
#
|
|
13
|
+
def on_lvasgn(node)
|
|
14
|
+
name = node.name
|
|
15
|
+
method = current_scope.lookup(current_scope.method_call_type, name)
|
|
16
|
+
|
|
17
|
+
if method and method != current_scope
|
|
18
|
+
warning(
|
|
19
|
+
'variable assignment using the same name as an existing method',
|
|
20
|
+
node
|
|
21
|
+
)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end # ConfusingVariables
|
|
25
|
+
end # Analysis
|
|
26
|
+
end # RubyLint
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# The {RubyLint::Analysis::UselessRuby} class checks for various useless
|
|
5
|
+
# Ruby features, the use of redundant tokens such as `then` for `if`
|
|
6
|
+
# statements and various other pedantics.
|
|
7
|
+
#
|
|
8
|
+
class Pedantics < Base
|
|
9
|
+
[:if, :unless, :until, :while].each do |type|
|
|
10
|
+
define_method("on_#{type}") do |node|
|
|
11
|
+
check_begin_token(node)
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
[:on_preexe, :on_postexe].each do |method|
|
|
16
|
+
define_method(method) do |node|
|
|
17
|
+
warning('BEGIN/END is useless', node)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
##
|
|
24
|
+
# Checks if a node's begin token matches "then" or "do" and if so adds a
|
|
25
|
+
# warning for it.
|
|
26
|
+
#
|
|
27
|
+
# @param [RubyLint::AST::Node] node
|
|
28
|
+
#
|
|
29
|
+
def check_begin_token(node)
|
|
30
|
+
if node.location.begin.is?('then') or node.location.begin.is?('do')
|
|
31
|
+
info('the use of then/do is not needed here', node)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end # Pedantics
|
|
35
|
+
end # Analysis
|
|
36
|
+
end # RubyLint
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# The ShadowingVariables class checks for the use of variables in a block
|
|
5
|
+
# that shadow outer variables. "Shadowing" means that a variable is used
|
|
6
|
+
# with the same name as a variable in the surrounding scope. A simple
|
|
7
|
+
# example:
|
|
8
|
+
#
|
|
9
|
+
# number = 10
|
|
10
|
+
#
|
|
11
|
+
# [10, 20, 30].each do |number|
|
|
12
|
+
# puts number # `number` is being shadowed
|
|
13
|
+
# end
|
|
14
|
+
#
|
|
15
|
+
class ShadowingVariables < Base
|
|
16
|
+
##
|
|
17
|
+
# @param [RubyLint::AST::Node] node
|
|
18
|
+
#
|
|
19
|
+
def on_block(node)
|
|
20
|
+
@outer_scope = current_scope
|
|
21
|
+
@in_block = true
|
|
22
|
+
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
##
|
|
27
|
+
# @param [RubyLint::AST::Node] node
|
|
28
|
+
#
|
|
29
|
+
def after_block(node)
|
|
30
|
+
@in_block = false
|
|
31
|
+
@outer_scope = nil
|
|
32
|
+
|
|
33
|
+
super
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# @param [RubyLint::AST::Node] node
|
|
38
|
+
#
|
|
39
|
+
def on_arg(node)
|
|
40
|
+
if @in_block \
|
|
41
|
+
and @outer_scope.has_definition?(:lvar, node.name)
|
|
42
|
+
warning("shadowing outer local variable #{node.name}", node)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end # ShadowingVariables
|
|
46
|
+
end # Analysis
|
|
47
|
+
end # RubyLint
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# The UndefinedMethods class checks for the use of undefined methods/local
|
|
5
|
+
# variables and adds errors whenever needed. Based on the receiver of a
|
|
6
|
+
# method call the corresponding error message differs to make it easier to
|
|
7
|
+
# understand what is going on.
|
|
8
|
+
#
|
|
9
|
+
# A simple example:
|
|
10
|
+
#
|
|
11
|
+
# foobar # => undefined method foobar
|
|
12
|
+
# 'test'.foobar # => undefined method foobar on an instance of String
|
|
13
|
+
#
|
|
14
|
+
class UndefinedMethods < Base
|
|
15
|
+
##
|
|
16
|
+
# @param [RubyLint::AST::Node] node
|
|
17
|
+
#
|
|
18
|
+
def on_send(node)
|
|
19
|
+
receiver, name, _ = *node
|
|
20
|
+
|
|
21
|
+
name = name.to_s
|
|
22
|
+
scope = current_scope
|
|
23
|
+
|
|
24
|
+
# Abort if the receiver doesn't exist since it will be handled by other
|
|
25
|
+
# analysis classes.
|
|
26
|
+
if receiver and !vm.associations.key?(receiver)
|
|
27
|
+
return
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
if receiver and vm.associations.key?(receiver)
|
|
31
|
+
scope = vm.associations[receiver]
|
|
32
|
+
|
|
33
|
+
# TODO: this should be handled in a more generic and especially in a
|
|
34
|
+
# more nicer way.
|
|
35
|
+
return if scope.parents.empty?
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
exists = scope.has_definition?(scope.method_call_type, name)
|
|
39
|
+
|
|
40
|
+
unless exists
|
|
41
|
+
message = error_for(name, receiver, scope)
|
|
42
|
+
|
|
43
|
+
error(message, node)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
##
|
|
50
|
+
# Determines what error message to use for a method call.
|
|
51
|
+
#
|
|
52
|
+
# @param [String] name The name of the method.
|
|
53
|
+
# @param [RubyLint::AST::Node] receiver The receiver node, if any.
|
|
54
|
+
# @param [RubyLint::Definition::RubyObject] scope The scope the method
|
|
55
|
+
# was called on.
|
|
56
|
+
# @return [String]
|
|
57
|
+
#
|
|
58
|
+
def error_for(name, receiver, scope)
|
|
59
|
+
return receiver ? receiver_error(name, scope) : method_error(name)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
##
|
|
63
|
+
# @param [String] name
|
|
64
|
+
# @return [String]
|
|
65
|
+
#
|
|
66
|
+
def method_error(name)
|
|
67
|
+
return "undefined method #{name}"
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
##
|
|
71
|
+
# Returns a String containing the error message to use when calling an
|
|
72
|
+
# undefined method on a receiver.
|
|
73
|
+
#
|
|
74
|
+
# @param [String] name
|
|
75
|
+
# @param [RubyLint::Definition::RubyObject] scope
|
|
76
|
+
# @return [String]
|
|
77
|
+
#
|
|
78
|
+
def receiver_error(name, scope)
|
|
79
|
+
klass = scope.ruby_class ? scope.ruby_class : scope.name
|
|
80
|
+
|
|
81
|
+
if scope.instance?
|
|
82
|
+
error = "undefined method #{name} on an instance of #{klass}"
|
|
83
|
+
else
|
|
84
|
+
error = "undefined method #{name} on #{scope.name}"
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
return error
|
|
88
|
+
end
|
|
89
|
+
end # UndefinedMethods
|
|
90
|
+
end # Analysis
|
|
91
|
+
end # RubyLint
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# The UndefinedVariables class checks for the use of undefined variables
|
|
5
|
+
# (such as instance variables and constants). The order of definition and
|
|
6
|
+
# use of a variable does not matter.
|
|
7
|
+
#
|
|
8
|
+
# This analysis class does *not* check for undefined local variables. Ruby
|
|
9
|
+
# treats these as method calls and as result they are handled by
|
|
10
|
+
# {RubyLint::Analysis::UndefinedMethods} instead.
|
|
11
|
+
#
|
|
12
|
+
class UndefinedVariables < Base
|
|
13
|
+
##
|
|
14
|
+
# Hash containing the various variable types to add errors for whenever
|
|
15
|
+
# they are used but not defined.
|
|
16
|
+
#
|
|
17
|
+
# @return [Hash]
|
|
18
|
+
#
|
|
19
|
+
VARIABLE_TYPES = {
|
|
20
|
+
:gvar => 'global variable',
|
|
21
|
+
:ivar => 'instance variable',
|
|
22
|
+
:cvar => 'class variable'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
VARIABLE_TYPES.each do |type, label|
|
|
26
|
+
define_method("on_#{type}") do |node|
|
|
27
|
+
unless current_scope.has_definition?(type, node.name)
|
|
28
|
+
error("undefined #{label} #{node.name}", node)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
##
|
|
34
|
+
# Handles regular constants as well as constant paths.
|
|
35
|
+
#
|
|
36
|
+
# @param [RubyLint::AST::Node] node
|
|
37
|
+
#
|
|
38
|
+
def on_const(node)
|
|
39
|
+
variable = resolve_constant_path(node)
|
|
40
|
+
name = constant_segments(node).join('::')
|
|
41
|
+
|
|
42
|
+
error("undefined constant #{name}", node) unless variable
|
|
43
|
+
end
|
|
44
|
+
end # UndefinedVariables
|
|
45
|
+
end # Analysis
|
|
46
|
+
end # RubyLint
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Analysis
|
|
3
|
+
##
|
|
4
|
+
# The UnusedVariables class checks for variables that are defined but never
|
|
5
|
+
# used. Whenever it finds one of these variables it will add a
|
|
6
|
+
# corresponding warning message.
|
|
7
|
+
#
|
|
8
|
+
class UnusedVariables < Base
|
|
9
|
+
##
|
|
10
|
+
# Hash containing the various variable types for which to add warnings
|
|
11
|
+
# and human readable names for these types.
|
|
12
|
+
#
|
|
13
|
+
# @return [Hash]
|
|
14
|
+
#
|
|
15
|
+
VARIABLE_TYPES = {
|
|
16
|
+
:lvasgn => 'local variable',
|
|
17
|
+
:gvasgn => 'global variable',
|
|
18
|
+
:ivasgn => 'instance variable',
|
|
19
|
+
:cvasgn => 'class variable'
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
VARIABLE_TYPES.each do |type, label|
|
|
23
|
+
define_method("on_#{type}") do |node|
|
|
24
|
+
type = VirtualMachine::ASSIGNMENT_TYPES[node.type]
|
|
25
|
+
name = node.name
|
|
26
|
+
variable = current_scope.lookup(type, name)
|
|
27
|
+
|
|
28
|
+
if variable and !variable.used?
|
|
29
|
+
warning("unused #{label} #{name}", node)
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
##
|
|
35
|
+
# Handles regular constants as well as constant paths.
|
|
36
|
+
#
|
|
37
|
+
# @param [RubyLint::AST::Node] node
|
|
38
|
+
#
|
|
39
|
+
def on_casgn(node)
|
|
40
|
+
variable = resolve_constant_path(node)
|
|
41
|
+
name = constant_segments(node).join('::')
|
|
42
|
+
|
|
43
|
+
if variable and !variable.used?
|
|
44
|
+
warning("unused constant #{name}", node)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end # UnusedVariables
|
|
48
|
+
end # Analysis
|
|
49
|
+
end # RubyLint
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module AST
|
|
3
|
+
##
|
|
4
|
+
# Custom AST builder class used to provide some extra additions/changes to
|
|
5
|
+
# the AST such as the use of a custom node class.
|
|
6
|
+
#
|
|
7
|
+
class Builder < ::Parser::Builders::Default
|
|
8
|
+
##
|
|
9
|
+
# @see Parser::Builders::Default#n
|
|
10
|
+
# @return [RubyLint::AST::Node]
|
|
11
|
+
#
|
|
12
|
+
def n(type, children, location)
|
|
13
|
+
return Node.new(type, children, :location => location)
|
|
14
|
+
end
|
|
15
|
+
end # Builder
|
|
16
|
+
end # AST
|
|
17
|
+
end # RubyLint
|