rubycop 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (38) hide show
  1. data/.gitignore +4 -0
  2. data/Gemfile +4 -0
  3. data/README.md +3 -0
  4. data/Rakefile +1 -0
  5. data/lib/rubycop.rb +6 -0
  6. data/lib/rubycop/analyzer.rb +6 -0
  7. data/lib/rubycop/analyzer/gray_list.rb +28 -0
  8. data/lib/rubycop/analyzer/node_builder.rb +523 -0
  9. data/lib/rubycop/analyzer/policy.rb +354 -0
  10. data/lib/rubycop/analyzer/ruby.rb +24 -0
  11. data/lib/rubycop/analyzer/ruby/args.rb +28 -0
  12. data/lib/rubycop/analyzer/ruby/array.rb +11 -0
  13. data/lib/rubycop/analyzer/ruby/assignment.rb +45 -0
  14. data/lib/rubycop/analyzer/ruby/assoc.rb +15 -0
  15. data/lib/rubycop/analyzer/ruby/blocks.rb +23 -0
  16. data/lib/rubycop/analyzer/ruby/call.rb +33 -0
  17. data/lib/rubycop/analyzer/ruby/case.rb +24 -0
  18. data/lib/rubycop/analyzer/ruby/constants.rb +49 -0
  19. data/lib/rubycop/analyzer/ruby/definitions.rb +27 -0
  20. data/lib/rubycop/analyzer/ruby/for.rb +17 -0
  21. data/lib/rubycop/analyzer/ruby/hash.rb +13 -0
  22. data/lib/rubycop/analyzer/ruby/if.rb +33 -0
  23. data/lib/rubycop/analyzer/ruby/list.rb +17 -0
  24. data/lib/rubycop/analyzer/ruby/node.rb +11 -0
  25. data/lib/rubycop/analyzer/ruby/operators.rb +54 -0
  26. data/lib/rubycop/analyzer/ruby/params.rb +23 -0
  27. data/lib/rubycop/analyzer/ruby/position.rb +15 -0
  28. data/lib/rubycop/analyzer/ruby/range.rb +17 -0
  29. data/lib/rubycop/analyzer/ruby/statements.rb +34 -0
  30. data/lib/rubycop/analyzer/ruby/string.rb +26 -0
  31. data/lib/rubycop/analyzer/ruby/tokens.rb +46 -0
  32. data/lib/rubycop/analyzer/ruby/variables.rb +26 -0
  33. data/lib/rubycop/analyzer/ruby/while.rb +29 -0
  34. data/lib/rubycop/version.rb +3 -0
  35. data/rubycop.gemspec +25 -0
  36. data/spec/node_builder_spec.rb +374 -0
  37. data/spec/policy_spec.rb +405 -0
  38. metadata +97 -0
@@ -0,0 +1,15 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Assoc < Node
5
+ def initialize(key, value)
6
+ @key = key
7
+ @value = value
8
+ end
9
+
10
+ attr_reader :key
11
+ attr_reader :value
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,23 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Block < Statements
5
+ def initialize(statements, params=nil)
6
+ @params = params
7
+ super(statements)
8
+ end
9
+
10
+ attr_reader :params
11
+ end
12
+
13
+ class ChainedBlock < Block
14
+ def initialize(blocks, statements, params=nil)
15
+ @blocks = Array(blocks).compact
16
+ super(statements, params)
17
+ end
18
+
19
+ attr_reader :blocks
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,33 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Call < Node
5
+ def initialize(target, identifier, arguments=nil, block=nil)
6
+ @target = target
7
+ @identifier = identifier
8
+ @arguments = arguments
9
+ @block = block
10
+ end
11
+
12
+ attr_reader :target
13
+ attr_reader :identifier
14
+ attr_accessor :arguments
15
+ attr_accessor :block
16
+
17
+ def assignment(rvalue, operator)
18
+ self.class.new(@target, Identifier.new("#{@identifier.token}=", @identifier.position), @arguments, @block)
19
+ end
20
+ end
21
+
22
+ class Alias < Node
23
+ def initialize(new_name, old_name)
24
+ @new_name = new_name
25
+ @old_name = old_name
26
+ end
27
+
28
+ attr_reader :new_name
29
+ attr_reader :old_name
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,24 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Case < Node
5
+ def initialize(expression, block)
6
+ @expression = expression
7
+ @block = block
8
+ end
9
+
10
+ attr_reader :expression
11
+ attr_reader :block
12
+ end
13
+
14
+ class When < ChainedBlock
15
+ def initialize(expression, statements, block=nil)
16
+ @expression = expression
17
+ super([block], statements)
18
+ end
19
+
20
+ attr_reader :expression
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,49 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Constant < Identifier
5
+ attr_accessor :namespace
6
+
7
+ def assignment(rvalue, operator)
8
+ ConstantAssignment.new(self, rvalue, operator)
9
+ end
10
+
11
+ # def inspect
12
+ # @namespace ? "#{@namespace.inspect}::#{@token}" : @token
13
+ # end
14
+ end
15
+
16
+ class Module < Node
17
+ def initialize(const, body)
18
+ @const = const
19
+ @body = body
20
+ end
21
+
22
+ attr_reader :const
23
+ attr_reader :body
24
+ end
25
+
26
+ class Class < Node
27
+ def initialize(const, superclass, body)
28
+ @const = const
29
+ @superclass = superclass
30
+ @body = body
31
+ end
32
+
33
+ attr_reader :const
34
+ attr_reader :superclass
35
+ attr_reader :body
36
+ end
37
+
38
+ class SingletonClass < Node
39
+ def initialize(superclass, body)
40
+ @superclass = superclass
41
+ @body = body
42
+ end
43
+
44
+ attr_reader :superclass
45
+ attr_reader :body
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,27 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Method < Node
5
+ def initialize(target, identifier, params, body)
6
+ @target = target
7
+ @identifier = identifier
8
+ @params = params
9
+ @body = body
10
+ end
11
+
12
+ attr_reader :target
13
+ attr_reader :identifier
14
+ attr_reader :params
15
+ attr_reader :body
16
+ end
17
+
18
+ class Defined < Node
19
+ def initialize(expression)
20
+ @expression = expression
21
+ end
22
+
23
+ attr_reader :expression
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,17 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class For < Block
5
+ def initialize(variable, range, statements)
6
+ @variable = variable
7
+ @range = range
8
+ @statements = statements
9
+ end
10
+
11
+ attr_reader :variable
12
+ attr_reader :range
13
+ attr_reader :statements
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,13 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Hash < Node
5
+ def initialize(assocs)
6
+ @assocs = assocs
7
+ end
8
+
9
+ attr_reader :assocs
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,33 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class If < ChainedBlock
5
+ def initialize(expression, statements=nil, else_block=nil)
6
+ @expression = expression
7
+ super([else_block], statements, nil)
8
+ end
9
+ attr_reader :expression
10
+ end
11
+
12
+ class Unless < If
13
+ end
14
+
15
+ class Else < Block
16
+ end
17
+
18
+ class IfMod < Block
19
+ def initialize(expression, statements)
20
+ @expression = expression
21
+ super(statements)
22
+ end
23
+ attr_reader :expression
24
+ end
25
+
26
+ class UnlessMod < IfMod
27
+ end
28
+
29
+ class RescueMod < IfMod
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,17 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class List < Node
5
+ def initialize(elements=nil)
6
+ @elements = Array(elements).compact # TODO: compact might cause problems here
7
+ end
8
+
9
+ attr_reader :elements
10
+
11
+ def add(element)
12
+ @elements.push(element)
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Node
5
+ def accept(visitor)
6
+ visitor.visit(self)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,54 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Operator < Node
5
+ end
6
+
7
+ class Unary < Operator
8
+ def initialize(operator, operand)
9
+ @operator = operator
10
+ @operand = operand
11
+ end
12
+
13
+ attr_reader :operator
14
+ attr_reader :operand
15
+
16
+ # def inspect
17
+ # "#{@operator}(#{@operand.inspect})"
18
+ # end
19
+ end
20
+
21
+ class Binary < Operator
22
+ def initialize(lvalue, rvalue, operator)
23
+ @lvalue = lvalue
24
+ @rvalue = rvalue
25
+ @operator = operator
26
+ end
27
+
28
+ attr_reader :lvalue
29
+ attr_reader :rvalue
30
+ attr_reader :operator
31
+
32
+ # def inspect
33
+ # "#{@lvalue.inspect} #{@operator} #{@rvalue.inspect}"
34
+ # end
35
+ end
36
+
37
+ class IfOp < Operator
38
+ def initialize(condition, then_part, else_part)
39
+ @condition = condition
40
+ @then_part = then_part
41
+ @else_part = else_part
42
+ end
43
+
44
+ attr_reader :condition
45
+ attr_reader :then_part
46
+ attr_reader :else_part
47
+
48
+ # def inspect
49
+ # "#{@condition.inspect} ? #{@then_part.inspect} : #{@else_part.inspect}"
50
+ # end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Params < List
5
+ def initialize(params, optionals, rest, block)
6
+ super((Array(params) + Array(optionals) << rest << block).flatten.compact)
7
+ end
8
+ end
9
+
10
+ class RescueParams < List
11
+ def initialize(types, var)
12
+ if types
13
+ errors = Ruby::Array.new(types)
14
+ errors = Ruby::Assoc.new(errors, var) if var
15
+ super(errors)
16
+ else
17
+ super()
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Position
5
+ def initialize(lineno, column)
6
+ @lineno = lineno
7
+ @column = column
8
+ end
9
+
10
+ attr_reader :lineno
11
+ attr_reader :column
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,17 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Range < Node
5
+ def initialize(min, max, exclude_end)
6
+ @min = min
7
+ @max = max
8
+ @exclude_end = exclude_end
9
+ end
10
+
11
+ attr_reader :min
12
+ attr_reader :max
13
+ attr_reader :exclude_end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,34 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class Statements < List
5
+ # def inspect
6
+ # @elements.collect { |e| e.inspect }.join
7
+ # end
8
+
9
+ def to_block(params)
10
+ Block.new(@elements, params)
11
+ end
12
+
13
+ def to_chained_block(blocks=nil, params=nil)
14
+ ChainedBlock.new(blocks, @elements, params)
15
+ end
16
+
17
+ def to_program(src, filename)
18
+ Program.new(src, filename, @elements)
19
+ end
20
+ end
21
+
22
+ class Program < Statements
23
+ def initialize(src, filename, statements)
24
+ @src = src
25
+ @filename = filename
26
+ super(statements)
27
+ end
28
+
29
+ attr_reader :src
30
+ attr_reader :filename
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module Rubycop
2
+ module Analyzer
3
+ module Ruby
4
+ class StringConcat < List
5
+ end
6
+
7
+ class String < List
8
+ # def inspect
9
+ # @elements.join.inspect
10
+ # end
11
+ end
12
+
13
+ class DynaSymbol < String
14
+ end
15
+
16
+ class ExecutableString < String
17
+ def to_dyna_symbol
18
+ DynaSymbol.new(@elements)
19
+ end
20
+ end
21
+
22
+ class Regexp < String
23
+ end
24
+ end
25
+ end
26
+ end