ruby-lint 0.0.2 → 0.0.3
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 +17 -0
- data/.gitignore +1 -0
- data/.travis.yml +25 -0
- data/.yardopts +4 -0
- data/Gemfile +1 -1
- data/LICENSE +1 -1
- data/MANIFEST +238 -49
- data/README.md +84 -131
- data/Rakefile +6 -0
- data/bin/ruby-lint +2 -2
- data/checksum/.gitkeep +0 -0
- data/doc/DCO.md +26 -0
- data/doc/architecture.md +63 -0
- data/doc/code_analysis.md +90 -0
- data/doc/configuration.md +86 -0
- data/doc/contributing.md +16 -0
- data/doc/graphviz/flow.dot +7 -0
- data/doc/images/.gitkeep +0 -0
- data/doc/images/flow.png +0 -0
- data/lib/ruby-lint.rb +35 -35
- data/lib/ruby-lint/analyze/argument_amount.rb +73 -0
- data/lib/ruby-lint/analyze/shadowing_variables.rb +19 -24
- data/lib/ruby-lint/analyze/undefined_methods.rb +68 -0
- data/lib/ruby-lint/analyze/undefined_variables.rb +42 -69
- data/lib/ruby-lint/analyze/unused_variables.rb +23 -78
- data/lib/ruby-lint/base.rb +85 -0
- data/lib/ruby-lint/cli.rb +23 -167
- data/lib/ruby-lint/cli/analyze.rb +99 -0
- data/lib/ruby-lint/cli/ast.rb +35 -0
- data/lib/ruby-lint/cli/base.rb +120 -0
- data/lib/ruby-lint/configuration.rb +112 -0
- data/lib/ruby-lint/constant_loader.rb +92 -0
- data/lib/ruby-lint/definition/ruby_method.rb +248 -0
- data/lib/ruby-lint/definition/ruby_object.rb +757 -0
- data/lib/ruby-lint/definition_generator.rb +155 -0
- data/lib/ruby-lint/definitions/core.rb +5 -0
- data/lib/ruby-lint/definitions/core/arg0.rb +7 -0
- data/lib/ruby-lint/definitions/core/argf.rb +7 -0
- data/lib/ruby-lint/definitions/core/argument_error.rb +12 -0
- data/lib/ruby-lint/definitions/core/argv.rb +7 -0
- data/lib/ruby-lint/definitions/core/array.rb +414 -0
- data/lib/ruby-lint/definitions/core/autoload.rb +39 -0
- data/lib/ruby-lint/definitions/core/basic_object.rb +46 -0
- data/lib/ruby-lint/definitions/core/bignum.rb +128 -0
- data/lib/ruby-lint/definitions/core/binding.rb +52 -0
- data/lib/ruby-lint/definitions/core/class.rb +23 -0
- data/lib/ruby-lint/definitions/core/comparable.rb +38 -0
- data/lib/ruby-lint/definitions/core/complex.rb +195 -0
- data/lib/ruby-lint/definitions/core/condition_variable.rb +19 -0
- data/lib/ruby-lint/definitions/core/continuation.rb +8 -0
- data/lib/ruby-lint/definitions/core/data.rb +8 -0
- data/lib/ruby-lint/definitions/core/date.rb +706 -0
- data/lib/ruby-lint/definitions/core/date_time.rb +381 -0
- data/lib/ruby-lint/definitions/core/default_record_separator.rb +7 -0
- data/lib/ruby-lint/definitions/core/digest.rb +166 -0
- data/lib/ruby-lint/definitions/core/dir.rb +496 -0
- data/lib/ruby-lint/definitions/core/encoding.rb +2030 -0
- data/lib/ruby-lint/definitions/core/encoding_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/enumerable.rb +352 -0
- data/lib/ruby-lint/definitions/core/enumerator.rb +37 -0
- data/lib/ruby-lint/definitions/core/env.rb +7 -0
- data/lib/ruby-lint/definitions/core/eoferror.rb +8 -0
- data/lib/ruby-lint/definitions/core/erb.rb +304 -0
- data/lib/ruby-lint/definitions/core/errno.rb +3331 -0
- data/lib/ruby-lint/definitions/core/etc.rb +138 -0
- data/lib/ruby-lint/definitions/core/exception.rb +72 -0
- data/lib/ruby-lint/definitions/core/false.rb +7 -0
- data/lib/ruby-lint/definitions/core/false_class.rb +30 -0
- data/lib/ruby-lint/definitions/core/fatal_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/fiber.rb +35 -0
- data/lib/ruby-lint/definitions/core/fiber_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/file.rb +1277 -0
- data/lib/ruby-lint/definitions/core/file_list.rb +727 -0
- data/lib/ruby-lint/definitions/core/file_test.rb +106 -0
- data/lib/ruby-lint/definitions/core/file_utils.rb +1027 -0
- data/lib/ruby-lint/definitions/core/fixnum.rb +156 -0
- data/lib/ruby-lint/definitions/core/float.rb +307 -0
- data/lib/ruby-lint/definitions/core/float_domain_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/gc.rb +57 -0
- data/lib/ruby-lint/definitions/core/gem.rb +3161 -0
- data/lib/ruby-lint/definitions/core/hash.rb +512 -0
- data/lib/ruby-lint/definitions/core/immediate_value.rb +19 -0
- data/lib/ruby-lint/definitions/core/index_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/integer.rb +100 -0
- data/lib/ruby-lint/definitions/core/interrupt.rb +14 -0
- data/lib/ruby-lint/definitions/core/io.rb +928 -0
- data/lib/ruby-lint/definitions/core/ioerror.rb +8 -0
- data/lib/ruby-lint/definitions/core/kernel.rb +504 -0
- data/lib/ruby-lint/definitions/core/key_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/load_error.rb +28 -0
- data/lib/ruby-lint/definitions/core/local_jump_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/main.rb +25 -0
- data/lib/ruby-lint/definitions/core/marshal.rb +466 -0
- data/lib/ruby-lint/definitions/core/match_data.rb +73 -0
- data/lib/ruby-lint/definitions/core/math.rb +205 -0
- data/lib/ruby-lint/definitions/core/memory_segmention_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/method.rb +61 -0
- data/lib/ruby-lint/definitions/core/module.rb +262 -0
- data/lib/ruby-lint/definitions/core/monitor.rb +39 -0
- data/lib/ruby-lint/definitions/core/monitor_mixin.rb +59 -0
- data/lib/ruby-lint/definitions/core/mutex.rb +32 -0
- data/lib/ruby-lint/definitions/core/name_error.rb +16 -0
- data/lib/ruby-lint/definitions/core/nil.rb +7 -0
- data/lib/ruby-lint/definitions/core/nil_class.rb +46 -0
- data/lib/ruby-lint/definitions/core/no_memory_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/no_method_error.rb +18 -0
- data/lib/ruby-lint/definitions/core/not_implemented_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/numeric.rb +123 -0
- data/lib/ruby-lint/definitions/core/object.rb +31 -0
- data/lib/ruby-lint/definitions/core/object_space.rb +41 -0
- data/lib/ruby-lint/definitions/core/open_struct.rb +49 -0
- data/lib/ruby-lint/definitions/core/option_parser.rb +1355 -0
- data/lib/ruby-lint/definitions/core/precision.rb +21 -0
- data/lib/ruby-lint/definitions/core/primitive_failure.rb +8 -0
- data/lib/ruby-lint/definitions/core/proc.rb +109 -0
- data/lib/ruby-lint/definitions/core/process.rb +602 -0
- data/lib/ruby-lint/definitions/core/psych.rb +2231 -0
- data/lib/ruby-lint/definitions/core/queue.rb +44 -0
- data/lib/ruby-lint/definitions/core/rake.rb +4784 -0
- data/lib/ruby-lint/definitions/core/rake_file_utils.rb +203 -0
- data/lib/ruby-lint/definitions/core/rakeversion.rb +7 -0
- data/lib/ruby-lint/definitions/core/random.rb +38 -0
- data/lib/ruby-lint/definitions/core/range.rb +104 -0
- data/lib/ruby-lint/definitions/core/range_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/rational.rb +96 -0
- data/lib/ruby-lint/definitions/core/rb_config.rb +36 -0
- data/lib/ruby-lint/definitions/core/regexp.rb +396 -0
- data/lib/ruby-lint/definitions/core/regexp_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/rubinius.rb +16637 -0
- data/lib/ruby-lint/definitions/core/ruby_copyright.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_description.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_engine.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_lint.rb +93 -0
- data/lib/ruby-lint/definitions/core/ruby_patchlevel.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_platform.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_release_date.rb +7 -0
- data/lib/ruby-lint/definitions/core/ruby_version.rb +7 -0
- data/lib/ruby-lint/definitions/core/runtime_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/scan_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/script_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/security_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/shellwords.rb +37 -0
- data/lib/ruby-lint/definitions/core/signal.rb +37 -0
- data/lib/ruby-lint/definitions/core/signal_exception.rb +19 -0
- data/lib/ruby-lint/definitions/core/singleton.rb +37 -0
- data/lib/ruby-lint/definitions/core/sized_queue.rb +42 -0
- data/lib/ruby-lint/definitions/core/standard_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/stderr.rb +7 -0
- data/lib/ruby-lint/definitions/core/stdin.rb +7 -0
- data/lib/ruby-lint/definitions/core/stdout.rb +7 -0
- data/lib/ruby-lint/definitions/core/stop_iteration.rb +8 -0
- data/lib/ruby-lint/definitions/core/string.rb +713 -0
- data/lib/ruby-lint/definitions/core/string_io.rb +287 -0
- data/lib/ruby-lint/definitions/core/string_scanner.rb +158 -0
- data/lib/ruby-lint/definitions/core/struct.rb +357 -0
- data/lib/ruby-lint/definitions/core/syck.rb +30 -0
- data/lib/ruby-lint/definitions/core/symbol.rb +90 -0
- data/lib/ruby-lint/definitions/core/syntax_error.rb +44 -0
- data/lib/ruby-lint/definitions/core/system_call_error.rb +31 -0
- data/lib/ruby-lint/definitions/core/system_exit.rb +19 -0
- data/lib/ruby-lint/definitions/core/system_stack_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/thread.rb +209 -0
- data/lib/ruby-lint/definitions/core/thread_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/thread_group.rb +22 -0
- data/lib/ruby-lint/definitions/core/time.rb +233 -0
- data/lib/ruby-lint/definitions/core/toplevel_binding.rb +7 -0
- data/lib/ruby-lint/definitions/core/true.rb +7 -0
- data/lib/ruby-lint/definitions/core/true_class.rb +30 -0
- data/lib/ruby-lint/definitions/core/type_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/unbound_method.rb +51 -0
- data/lib/ruby-lint/definitions/core/unmarshalable.rb +13 -0
- data/lib/ruby-lint/definitions/core/unsupported_library_error.rb +8 -0
- data/lib/ruby-lint/definitions/core/weak_ref.rb +42 -0
- data/lib/ruby-lint/definitions/core/zero_division_error.rb +8 -0
- data/lib/ruby-lint/definitions_builder.rb +692 -0
- data/lib/ruby-lint/extensions/string.rb +15 -0
- data/lib/ruby-lint/helper/constant_paths.rb +41 -0
- data/lib/ruby-lint/helper/conversion.rb +33 -0
- data/lib/ruby-lint/helper/current_scope.rb +98 -0
- data/lib/ruby-lint/helper/methods.rb +91 -0
- data/lib/ruby-lint/inspector.rb +191 -0
- data/lib/ruby-lint/iterator.rb +187 -127
- data/lib/ruby-lint/node.rb +107 -0
- data/lib/ruby-lint/parser.rb +510 -1137
- data/lib/ruby-lint/parser_error.rb +15 -27
- data/lib/ruby-lint/presenter/json.rb +19 -0
- data/lib/ruby-lint/presenter/text.rb +37 -0
- data/lib/ruby-lint/report.rb +95 -53
- data/lib/ruby-lint/report/entry.rb +71 -0
- data/lib/ruby-lint/template/definition.erb +24 -0
- data/lib/ruby-lint/template/scope.rb +25 -0
- data/lib/ruby-lint/variable_predicates.rb +109 -0
- data/lib/ruby-lint/version.rb +1 -1
- data/ruby-lint.gemspec +19 -8
- data/spec/helper.rb +10 -2
- data/spec/ruby-lint/analyze/argument_amount.rb +91 -0
- data/spec/ruby-lint/analyze/shadowing_variables.rb +69 -14
- data/spec/ruby-lint/analyze/undefined_methods.rb +174 -0
- data/spec/ruby-lint/analyze/undefined_variables.rb +70 -179
- data/spec/ruby-lint/analyze/unused_variables.rb +63 -183
- data/spec/ruby-lint/configuration.rb +15 -0
- data/spec/ruby-lint/constant_loader.rb +32 -0
- data/spec/ruby-lint/definition/dsl.rb +142 -0
- data/spec/ruby-lint/definition/method_calls.rb +26 -0
- data/spec/ruby-lint/definition/ruby_method.rb +175 -0
- data/spec/ruby-lint/definition/ruby_object.rb +228 -0
- data/spec/ruby-lint/definitions_builder/assignments/arrays.rb +71 -0
- data/spec/ruby-lint/definitions_builder/assignments/hashes.rb +65 -0
- data/spec/ruby-lint/definitions_builder/assignments/objects.rb +23 -0
- data/spec/ruby-lint/definitions_builder/assignments/optional.rb +22 -0
- data/spec/ruby-lint/definitions_builder/assignments/return_values.rb +78 -0
- data/spec/ruby-lint/definitions_builder/assignments/variables.rb +71 -0
- data/spec/ruby-lint/definitions_builder/associate_nodes.rb +17 -0
- data/spec/ruby-lint/definitions_builder/blocks.rb +40 -0
- data/spec/ruby-lint/definitions_builder/classes.rb +230 -0
- data/spec/ruby-lint/definitions_builder/for.rb +16 -0
- data/spec/ruby-lint/definitions_builder/methods.rb +147 -0
- data/spec/ruby-lint/definitions_builder/modules.rb +175 -0
- data/spec/ruby-lint/definitions_builder/reference_amount.rb +31 -0
- data/spec/ruby-lint/definitions_builder/unused.rb +15 -0
- data/spec/ruby-lint/extensions/string.rb +7 -0
- data/spec/ruby-lint/iterator.rb +42 -417
- data/spec/ruby-lint/node.rb +38 -0
- data/spec/ruby-lint/parser/assignments.rb +225 -0
- data/spec/ruby-lint/parser/classes.rb +80 -122
- data/spec/ruby-lint/parser/errors.rb +7 -14
- data/spec/ruby-lint/parser/metadata.rb +17 -0
- data/spec/ruby-lint/parser/method_definitions.rb +111 -0
- data/spec/ruby-lint/parser/methods.rb +184 -216
- data/spec/ruby-lint/parser/modules.rb +54 -33
- data/spec/ruby-lint/parser/operators.rb +30 -65
- data/spec/ruby-lint/parser/statements/begin.rb +55 -0
- data/spec/ruby-lint/parser/statements/case.rb +34 -0
- data/spec/ruby-lint/parser/statements/defined.rb +11 -0
- data/spec/ruby-lint/parser/statements/for.rb +34 -0
- data/spec/ruby-lint/parser/statements/if.rb +46 -0
- data/spec/ruby-lint/parser/statements/return.rb +14 -0
- data/spec/ruby-lint/parser/statements/super.rb +49 -0
- data/spec/ruby-lint/parser/statements/unless.rb +42 -0
- data/spec/ruby-lint/parser/statements/until.rb +25 -0
- data/spec/ruby-lint/parser/statements/while.rb +25 -0
- data/spec/ruby-lint/parser/statements/yield.rb +18 -0
- data/spec/ruby-lint/parser/types/arrays.rb +47 -0
- data/spec/ruby-lint/parser/types/booleans.rb +11 -0
- data/spec/ruby-lint/parser/types/constants.rb +32 -0
- data/spec/ruby-lint/parser/types/hashes.rb +55 -0
- data/spec/ruby-lint/parser/types/nil.rb +7 -0
- data/spec/ruby-lint/parser/types/numbers.rb +11 -0
- data/spec/ruby-lint/parser/types/procs.rb +11 -0
- data/spec/ruby-lint/parser/types/ranges.rb +11 -0
- data/spec/ruby-lint/parser/types/regexp.rb +27 -0
- data/spec/ruby-lint/parser/types/strings.rb +44 -0
- data/spec/ruby-lint/parser/types/symbols.rb +15 -0
- data/spec/ruby-lint/presenter/json.rb +31 -0
- data/spec/ruby-lint/presenter/text.rb +22 -0
- data/spec/ruby-lint/report.rb +45 -15
- data/spec/ruby-lint/report/entry.rb +24 -0
- data/spec/support/bacon.rb +33 -0
- data/spec/support/building.rb +43 -0
- data/spec/support/definitions.rb +23 -0
- data/spec/support/parsing.rb +23 -0
- data/spec/support/simplecov.rb +16 -0
- data/task/build.rake +9 -0
- data/task/checksum.rake +13 -0
- data/task/coverage.rake +6 -0
- data/task/doc.rake +5 -0
- data/task/generate.rake +34 -0
- data/task/graphviz.rake +12 -0
- data/task/stdlib.rake +2 -9
- data/task/tag.rake +6 -0
- metadata +337 -68
- metadata.gz.asc +17 -0
- data/.rbenv-version +0 -1
- data/lib/ruby-lint/analyze/coding_style.rb +0 -407
- data/lib/ruby-lint/analyze/definitions.rb +0 -244
- data/lib/ruby-lint/analyze/method_validation.rb +0 -104
- data/lib/ruby-lint/callback.rb +0 -67
- data/lib/ruby-lint/constant_importer.rb +0 -112
- data/lib/ruby-lint/definition.rb +0 -230
- data/lib/ruby-lint/formatter/text.rb +0 -54
- data/lib/ruby-lint/helper/definition_resolver.rb +0 -143
- data/lib/ruby-lint/helper/scoping.rb +0 -138
- data/lib/ruby-lint/options.rb +0 -58
- data/lib/ruby-lint/token/assignment_token.rb +0 -35
- data/lib/ruby-lint/token/begin_rescue_token.rb +0 -57
- data/lib/ruby-lint/token/block_token.rb +0 -26
- data/lib/ruby-lint/token/case_token.rb +0 -44
- data/lib/ruby-lint/token/class_token.rb +0 -24
- data/lib/ruby-lint/token/keyword_token.rb +0 -43
- data/lib/ruby-lint/token/method_definition_token.rb +0 -64
- data/lib/ruby-lint/token/method_token.rb +0 -56
- data/lib/ruby-lint/token/parameters_token.rb +0 -99
- data/lib/ruby-lint/token/regexp_token.rb +0 -15
- data/lib/ruby-lint/token/statement_token.rb +0 -69
- data/lib/ruby-lint/token/token.rb +0 -176
- data/lib/ruby-lint/token/variable_token.rb +0 -18
- data/spec/benchmarks/memory.rb +0 -52
- data/spec/benchmarks/parse_parser.rb +0 -16
- data/spec/fixtures/stdlib/un.rb +0 -348
- data/spec/ruby-lint/analyze/coding_style.rb +0 -224
- data/spec/ruby-lint/analyze/complex/un.rb +0 -29
- data/spec/ruby-lint/analyze/definitions/classes.rb +0 -114
- data/spec/ruby-lint/analyze/definitions/methods.rb +0 -91
- data/spec/ruby-lint/analyze/definitions/modules.rb +0 -207
- data/spec/ruby-lint/analyze/definitions/variables.rb +0 -103
- data/spec/ruby-lint/analyze/method_validation.rb +0 -177
- data/spec/ruby-lint/callback.rb +0 -28
- data/spec/ruby-lint/constant_importer.rb +0 -27
- data/spec/ruby-lint/definition.rb +0 -96
- data/spec/ruby-lint/formatter/text.rb +0 -21
- data/spec/ruby-lint/parser/arrays.rb +0 -147
- data/spec/ruby-lint/parser/expander_assignments.rb +0 -183
- data/spec/ruby-lint/parser/hashes.rb +0 -136
- data/spec/ruby-lint/parser/keywords.rb +0 -89
- data/spec/ruby-lint/parser/objects.rb +0 -39
- data/spec/ruby-lint/parser/procs.rb +0 -113
- data/spec/ruby-lint/parser/ranges.rb +0 -49
- data/spec/ruby-lint/parser/regexp.rb +0 -31
- data/spec/ruby-lint/parser/scalars.rb +0 -93
- data/spec/ruby-lint/parser/statements.rb +0 -591
- data/spec/ruby-lint/parser/variables.rb +0 -230
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class String
|
|
2
|
+
unless method_defined?(:snake_case)
|
|
3
|
+
##
|
|
4
|
+
# Creates a new string that is `snake_cased`.
|
|
5
|
+
#
|
|
6
|
+
# @example
|
|
7
|
+
# "FooBar".snake_case # => "foo_bar"
|
|
8
|
+
#
|
|
9
|
+
# @return [String]
|
|
10
|
+
#
|
|
11
|
+
def snake_case
|
|
12
|
+
return self.gsub(/([a-z])([A-Z])/, '\\1_\\2').gsub('::', '_').downcase
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end # String
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Helper
|
|
3
|
+
##
|
|
4
|
+
# The ConstantPaths helper module can be used to easily iterate over the
|
|
5
|
+
# segments of a constant path and perform lookups on each segment.
|
|
6
|
+
#
|
|
7
|
+
module ConstantPaths
|
|
8
|
+
##
|
|
9
|
+
# Iterates over each segment of the constant path and yields the supplied
|
|
10
|
+
# block.
|
|
11
|
+
#
|
|
12
|
+
# @example
|
|
13
|
+
# path = s(:constant_path, s(:constant, 'A'), s(:constant, 'B')
|
|
14
|
+
#
|
|
15
|
+
# iterate_constant_path(path) do |name, segment, definition|
|
|
16
|
+
# puts name
|
|
17
|
+
# end
|
|
18
|
+
#
|
|
19
|
+
# @param [RubyLint::Node] node The constant path to iterate over.
|
|
20
|
+
#
|
|
21
|
+
# @yieldparam [String] name The name of the current segment.
|
|
22
|
+
# @yieldparam [RubyLint::Node] node The raw AST node of the current
|
|
23
|
+
# segment.
|
|
24
|
+
# @yieldparam [RubyLint::Definition::RubyObject] definition The
|
|
25
|
+
# definition object of the current segment.
|
|
26
|
+
#
|
|
27
|
+
def iterate_constant_path(node)
|
|
28
|
+
definitions = current_scope
|
|
29
|
+
|
|
30
|
+
node.children.each do |segment|
|
|
31
|
+
name = segment.children[0]
|
|
32
|
+
definition = definitions.lookup(:constant, name)
|
|
33
|
+
|
|
34
|
+
yield name, segment, definition
|
|
35
|
+
|
|
36
|
+
definition ? definitions = definition : break
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end # ConstantPaths
|
|
40
|
+
end # Helper
|
|
41
|
+
end # RubyLint
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Helper
|
|
3
|
+
##
|
|
4
|
+
# The Conversion helper can be used to easily convert {RubyLint::Node}
|
|
5
|
+
# instances into specific definition objects.
|
|
6
|
+
#
|
|
7
|
+
module Conversion
|
|
8
|
+
##
|
|
9
|
+
# Returns a {RubyLint::Definition::RubyObject} instance that represents
|
|
10
|
+
# an instance of the Node's corresponding Ruby class.
|
|
11
|
+
#
|
|
12
|
+
# @param [RubyLint::Node] node
|
|
13
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
14
|
+
#
|
|
15
|
+
def instance_for_ruby_type(node)
|
|
16
|
+
return unless node.ruby_class
|
|
17
|
+
|
|
18
|
+
definition = nil
|
|
19
|
+
class_def = RubyLint.global_constant(node.ruby_class)
|
|
20
|
+
|
|
21
|
+
if class_def
|
|
22
|
+
definition = Definition::RubyObject.new_from_node(
|
|
23
|
+
node,
|
|
24
|
+
:instance_type => :instance,
|
|
25
|
+
:parents => [class_def]
|
|
26
|
+
)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
return definition
|
|
30
|
+
end
|
|
31
|
+
end # Conversion
|
|
32
|
+
end # Helper
|
|
33
|
+
end # RubyLint
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Helper
|
|
3
|
+
##
|
|
4
|
+
# {RubyLint::Helper::CurrentScope} is a helper module that makes it easier
|
|
5
|
+
# to retrieve the current scope in callback methods. Instead of having to
|
|
6
|
+
# manually retrieve the scope to use based on the current node all you have
|
|
7
|
+
# to do is include this module and call `current_scope`.
|
|
8
|
+
#
|
|
9
|
+
# ## Inheritance
|
|
10
|
+
#
|
|
11
|
+
# Due to this module defining a few common callback methods such as
|
|
12
|
+
# `on_class` you should **always** call `super` if you override these
|
|
13
|
+
# methods in a class. For example, this will prevent the helper from
|
|
14
|
+
# working properly:
|
|
15
|
+
#
|
|
16
|
+
# class MyIterator < RubyLint::Iterator
|
|
17
|
+
# include RubyLint::Helper::CurrentScope
|
|
18
|
+
#
|
|
19
|
+
# def on_class(node)
|
|
20
|
+
# # ...
|
|
21
|
+
# end
|
|
22
|
+
# end
|
|
23
|
+
#
|
|
24
|
+
# This however will not:
|
|
25
|
+
#
|
|
26
|
+
# class MyIterator < RubyLint::Iterator
|
|
27
|
+
# include RubyLint::Helper::CurrentScope
|
|
28
|
+
#
|
|
29
|
+
# def on_class(node)
|
|
30
|
+
# super
|
|
31
|
+
#
|
|
32
|
+
# # ...
|
|
33
|
+
# end
|
|
34
|
+
# end
|
|
35
|
+
#
|
|
36
|
+
module CurrentScope
|
|
37
|
+
##
|
|
38
|
+
# @see RubyLint::Iterator#initialize
|
|
39
|
+
#
|
|
40
|
+
def initialize(*args)
|
|
41
|
+
super
|
|
42
|
+
|
|
43
|
+
@scopes = []
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
##
|
|
47
|
+
# Array containing the callback names for which a new scope should be
|
|
48
|
+
# created.
|
|
49
|
+
#
|
|
50
|
+
# @return [Array<Symbol>]
|
|
51
|
+
#
|
|
52
|
+
SCOPES = [
|
|
53
|
+
:block,
|
|
54
|
+
:class,
|
|
55
|
+
:method_definition,
|
|
56
|
+
:module,
|
|
57
|
+
:root,
|
|
58
|
+
:sclass
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
SCOPES.each do |type|
|
|
62
|
+
define_method("on_#{type}") do |node|
|
|
63
|
+
set_current_scope(node)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
define_method("after_#{type}") do |node|
|
|
67
|
+
set_previous_scope
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
##
|
|
72
|
+
# Returns the current scope.
|
|
73
|
+
#
|
|
74
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
75
|
+
#
|
|
76
|
+
def current_scope
|
|
77
|
+
return @scopes[-1]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
##
|
|
81
|
+
# Sets the current scope to the definition associated with the given
|
|
82
|
+
# node.
|
|
83
|
+
#
|
|
84
|
+
# @param [RubyLint::Node] node
|
|
85
|
+
#
|
|
86
|
+
def set_current_scope(node)
|
|
87
|
+
@scopes << associated_definition(node)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
##
|
|
91
|
+
# Sets the current scope back to the previous one.
|
|
92
|
+
#
|
|
93
|
+
def set_previous_scope
|
|
94
|
+
@scopes.pop
|
|
95
|
+
end
|
|
96
|
+
end # CurrentScope
|
|
97
|
+
end # Helper
|
|
98
|
+
end # RubyLint
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
module Helper
|
|
3
|
+
##
|
|
4
|
+
# Helper module that provides various methods for looking up methods,
|
|
5
|
+
# checking if they exist, etc.
|
|
6
|
+
#
|
|
7
|
+
module Methods
|
|
8
|
+
include CurrentScope
|
|
9
|
+
include Conversion
|
|
10
|
+
|
|
11
|
+
##
|
|
12
|
+
# Checks if the method for the given node is defined or not.
|
|
13
|
+
#
|
|
14
|
+
# @param [RubyLint::Node] node
|
|
15
|
+
# @return [TrueClass|FalseClass]
|
|
16
|
+
#
|
|
17
|
+
def method_defined?(node)
|
|
18
|
+
scope = method_scope(node)
|
|
19
|
+
|
|
20
|
+
if scope
|
|
21
|
+
return scope.has_definition?(scope.method_call_type, node.name)
|
|
22
|
+
else
|
|
23
|
+
return false
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# Returns a boolean that indicates if the receiver is valid or not.
|
|
29
|
+
#
|
|
30
|
+
# @param [RubyLint::Node] node
|
|
31
|
+
# @return [TrueClass|FalseClass]
|
|
32
|
+
#
|
|
33
|
+
def invalid_receiver?(node)
|
|
34
|
+
invalid = false
|
|
35
|
+
|
|
36
|
+
if node.receiver
|
|
37
|
+
receiver = method_receiver(node.receiver)
|
|
38
|
+
invalid = !receiver || (receiver.variable? && receiver.value.nil?)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
return invalid
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
##
|
|
45
|
+
# Looks up the method definition for the specified method call.
|
|
46
|
+
#
|
|
47
|
+
# @param [RubyLint::Node] node
|
|
48
|
+
# @return [RubyLint::Definition::RubyMethod]
|
|
49
|
+
#
|
|
50
|
+
def lookup_method(node)
|
|
51
|
+
scope = method_scope(node)
|
|
52
|
+
|
|
53
|
+
return scope.lookup(scope.method_call_type, node.name)
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# Determines the scope to use for a method call.
|
|
58
|
+
#
|
|
59
|
+
# @param [RubyLint::Node] node
|
|
60
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
61
|
+
#
|
|
62
|
+
def method_scope(node)
|
|
63
|
+
scope = node.receiver ? method_receiver(node.receiver) : current_scope
|
|
64
|
+
|
|
65
|
+
return scope.variable? && scope.value ? scope.value : scope
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
##
|
|
69
|
+
# Tries to determine the receiver definition of a method call.
|
|
70
|
+
#
|
|
71
|
+
# @param [RubyLint::Node|Array] receiver
|
|
72
|
+
# @return [RubyLint::Definition::RubyObject]
|
|
73
|
+
#
|
|
74
|
+
def method_receiver(receiver)
|
|
75
|
+
receiver = receiver.is_a?(Array) ? receiver[0] : receiver
|
|
76
|
+
scope = instance_for_ruby_type(receiver)
|
|
77
|
+
|
|
78
|
+
if !scope
|
|
79
|
+
scope = current_scope.lookup(receiver.type, receiver.name)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# Last resort, try to load the receiver as a global constant.
|
|
83
|
+
if !scope and receiver.constant?
|
|
84
|
+
scope = RubyLint.global_constant(receiver.name)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
return scope
|
|
88
|
+
end
|
|
89
|
+
end # Methods
|
|
90
|
+
end # Helper
|
|
91
|
+
end # RubyLint
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
module RubyLint
|
|
2
|
+
##
|
|
3
|
+
# The Inspector class is a debugging related class primarily used for making
|
|
4
|
+
# it easy to display a list of methods/constants of a given source constant.
|
|
5
|
+
#
|
|
6
|
+
# Note that this class is considered to be a private API and as such may
|
|
7
|
+
# change without any notice.
|
|
8
|
+
#
|
|
9
|
+
# @!attribute [r] constant
|
|
10
|
+
# @return [Class]
|
|
11
|
+
# @!attribute [r] constant_name
|
|
12
|
+
# @return [String]
|
|
13
|
+
#
|
|
14
|
+
class Inspector
|
|
15
|
+
attr_reader :constant, :constant_name
|
|
16
|
+
|
|
17
|
+
##
|
|
18
|
+
# @param [String|Class] constant
|
|
19
|
+
#
|
|
20
|
+
def initialize(constant)
|
|
21
|
+
@constant_name = constant
|
|
22
|
+
|
|
23
|
+
if constant.is_a?(String)
|
|
24
|
+
constant = resolve_constant(constant)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
@constant = constant
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
##
|
|
31
|
+
# Returns an Array containing all child constants and their childrne
|
|
32
|
+
# (recursively).
|
|
33
|
+
#
|
|
34
|
+
# The constants returned by this method are returned as String instances
|
|
35
|
+
# containing the full path (e.g. `Encoding::BINARY` instead of `BINARY`).
|
|
36
|
+
#
|
|
37
|
+
# @param [Class] source
|
|
38
|
+
# @param [Array] ignore
|
|
39
|
+
# @return [Array<String>]
|
|
40
|
+
#
|
|
41
|
+
def inspect_constants(source = constant, ignore = [])
|
|
42
|
+
source_name = source.to_s
|
|
43
|
+
constants = []
|
|
44
|
+
have_children = []
|
|
45
|
+
include_source = source != Object
|
|
46
|
+
|
|
47
|
+
if include_source
|
|
48
|
+
constants << source_name
|
|
49
|
+
ignore = ignore + [source.to_s]
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
source.constants.each do |name|
|
|
53
|
+
next unless source.const_defined?(name)
|
|
54
|
+
|
|
55
|
+
constant = source.const_get(name)
|
|
56
|
+
name = name.to_s
|
|
57
|
+
full_name = include_source ? "#{source_name}::#{name}" : name
|
|
58
|
+
|
|
59
|
+
next if ignore.include?(full_name)
|
|
60
|
+
|
|
61
|
+
ignore << constant
|
|
62
|
+
constants << full_name
|
|
63
|
+
|
|
64
|
+
if process_child_constants?(source, constant)
|
|
65
|
+
have_children << constant
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
have_children.each do |constant|
|
|
70
|
+
inspect_constants(constant, ignore).each do |child|
|
|
71
|
+
constants << child unless constants.include?(child)
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
return constants
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
##
|
|
79
|
+
# Returns an Array containing all method objects sorted by their names.
|
|
80
|
+
#
|
|
81
|
+
# @return [Array]
|
|
82
|
+
#
|
|
83
|
+
def inspect_methods
|
|
84
|
+
return [] unless constant.respond_to?(:methods)
|
|
85
|
+
|
|
86
|
+
methods = constant.methods(false).map do |name|
|
|
87
|
+
method_information(:method, name)
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
return methods.sort_by(&:name)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
##
|
|
94
|
+
# Returns an Array containing all instance methods sorted by their names.
|
|
95
|
+
#
|
|
96
|
+
# @return [Array]
|
|
97
|
+
#
|
|
98
|
+
def inspect_instance_methods
|
|
99
|
+
return [] unless constant.respond_to?(:instance_methods)
|
|
100
|
+
|
|
101
|
+
methods = constant.instance_methods(false).map do |name|
|
|
102
|
+
method_information(:instance_method, name)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
return methods.sort_by(&:name)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
##
|
|
109
|
+
# Formats the list of methods in a human readable format.
|
|
110
|
+
#
|
|
111
|
+
# @param [Array] methods
|
|
112
|
+
# @return [String]
|
|
113
|
+
#
|
|
114
|
+
def format_methods(methods)
|
|
115
|
+
output = []
|
|
116
|
+
longest = 0
|
|
117
|
+
|
|
118
|
+
methods.each do |method|
|
|
119
|
+
longest = method.name.length if method.name.length > longest
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
methods.each do |method|
|
|
123
|
+
output << "%-#{longest}s: %s" % [
|
|
124
|
+
method.name,
|
|
125
|
+
method.parameters.inspect
|
|
126
|
+
]
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
return output.join("\n")
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
##
|
|
133
|
+
# Formats a list of constants in a human readable format.
|
|
134
|
+
#
|
|
135
|
+
# @param [Array] constants
|
|
136
|
+
# @return [String]
|
|
137
|
+
#
|
|
138
|
+
def format_constants(constants)
|
|
139
|
+
return constants.join("\n")
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
private
|
|
143
|
+
|
|
144
|
+
##
|
|
145
|
+
# @param [Class] source
|
|
146
|
+
# @param [Class] constant
|
|
147
|
+
# @return [TrueClass|FalseClass]
|
|
148
|
+
#
|
|
149
|
+
def process_child_constants?(source, constant)
|
|
150
|
+
return constant.respond_to?(:constants) \
|
|
151
|
+
&& constant != source \
|
|
152
|
+
&& !constant.constants.empty?
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
##
|
|
156
|
+
# Returns the method object for the given type and name.
|
|
157
|
+
#
|
|
158
|
+
# @param [Symbol] type
|
|
159
|
+
# @param [Symbol] name
|
|
160
|
+
# @return [UnboundMethod]
|
|
161
|
+
#
|
|
162
|
+
def method_information(type, name)
|
|
163
|
+
return constant.send(type, name)
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
##
|
|
167
|
+
# Converts a String based constant path into an actual constant.
|
|
168
|
+
#
|
|
169
|
+
# @param [String] constant
|
|
170
|
+
# @return [Class]
|
|
171
|
+
# @raise [ArgumentError] Raised when one of the segments doesn't exist.
|
|
172
|
+
#
|
|
173
|
+
def resolve_constant(constant)
|
|
174
|
+
current = Object
|
|
175
|
+
final = nil
|
|
176
|
+
|
|
177
|
+
constant.split('::').each do |segment|
|
|
178
|
+
if current.const_defined?(segment)
|
|
179
|
+
current = final = current.const_get(segment)
|
|
180
|
+
else
|
|
181
|
+
raise(
|
|
182
|
+
ArgumentError,
|
|
183
|
+
"Constant #{segment} does not exist in #{constant}"
|
|
184
|
+
)
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
return final
|
|
189
|
+
end
|
|
190
|
+
end # Inspector
|
|
191
|
+
end # RubyLint
|