to_source 0.2.16 → 0.2.17
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Changelog.md +34 -1
- data/bin/to_source +2 -8
- data/config/flay.yml +1 -1
- data/config/site.reek +5 -0
- data/lib/to_source.rb +17 -3
- data/lib/to_source/emitter.rb +5 -1
- data/lib/to_source/emitter/alias.rb +23 -0
- data/lib/to_source/emitter/assignment.rb +23 -84
- data/lib/to_source/emitter/assignment/attribute.rb +52 -0
- data/lib/to_source/emitter/assignment/constant.rb +26 -0
- data/lib/to_source/emitter/assignment/element.rb +124 -0
- data/lib/to_source/emitter/assignment/variable.rb +29 -0
- data/lib/to_source/emitter/assignment_operator.rb +54 -0
- data/lib/to_source/emitter/back_ref.rb +23 -0
- data/lib/to_source/emitter/binary_operator_method.rb +38 -2
- data/lib/to_source/emitter/collect_splat.rb +50 -0
- data/lib/to_source/emitter/concat_arguments.rb +16 -1
- data/lib/to_source/emitter/element_reference.rb +1 -1
- data/lib/to_source/emitter/flip.rb +61 -0
- data/lib/to_source/emitter/for.rb +98 -0
- data/lib/to_source/emitter/iter.rb +23 -1
- data/lib/to_source/emitter/literal.rb +1 -18
- data/lib/to_source/emitter/literal/dynamic.rb +0 -23
- data/lib/to_source/emitter/literal/dynamic/regexp.rb +69 -0
- data/lib/to_source/emitter/literal/regexp.rb +27 -0
- data/lib/to_source/emitter/literal/regexp/options.rb +71 -0
- data/lib/to_source/emitter/match.rb +21 -0
- data/lib/to_source/emitter/match2.rb +25 -0
- data/lib/to_source/emitter/multiple_assignment.rb +43 -4
- data/lib/to_source/emitter/op_assign1.rb +37 -5
- data/lib/to_source/emitter/push_args.rb +42 -0
- data/lib/to_source/emitter/send.rb +21 -16
- data/lib/to_source/emitter/splat.rb +40 -1
- data/lib/to_source/emitter/static.rb +32 -0
- data/lib/to_source/emitter/toplevel.rb +2 -1
- data/lib/to_source/emitter/undef.rb +26 -0
- data/spec/unit/to_source/class_methods/run_spec.rb +245 -20
- data/to_source.gemspec +1 -1
- metadata +18 -4
- data/lib/to_source/emitter/attribute_assignment.rb +0 -28
- data/lib/to_source/emitter/element_assignment.rb +0 -29
data/.rspec
CHANGED
data/Changelog.md
CHANGED
@@ -1,11 +1,44 @@
|
|
1
|
-
# v0.2.
|
1
|
+
# v0.2.17 2013-01-26
|
2
|
+
|
3
|
+
* [fixed] Fix op assign 1 operators with implicit index array[] ||= etc
|
4
|
+
* [fixed] Fix op assign 1 operators with explicit index array[foo] ||= etc
|
5
|
+
* [fixed] Add support regexp in if statements with implicit haystack (Rubinius::AST::Match)
|
6
|
+
* [fixed] Add support for Rubionius::AST::Flip{2,3} (flip flops)
|
7
|
+
* [fixed] Add support for Rubionius::AST::VAlias
|
8
|
+
* [fixed] Fix multiple edge cases with array literals and splats
|
9
|
+
* [fixed] Add support for mixed splat arguments
|
10
|
+
* [fixed] Add support for __ENCODING__
|
11
|
+
* [fixed] Fix emit of splat arguments to binary method operators
|
12
|
+
* [fixed] Fix multiple assigments when assigning to element with splat index
|
13
|
+
* [fixed] Add support for retry
|
14
|
+
* [fixed] Add support for redo
|
15
|
+
* [fixed] Add support rubinius specific type constant
|
16
|
+
* [fixed] Add support for dynamic once literal
|
17
|
+
* [fixed] Emit regexp options for single and dynamic literals
|
18
|
+
* [fixed] Add support for undef keyword
|
19
|
+
* [fixed] Add support toplevel module name
|
20
|
+
* [fixed] Fix regexp emitter for edge cases
|
21
|
+
* [fixed] Fix element reference with splat arguments
|
22
|
+
* [fixed] Add support for construct
|
23
|
+
* [fixed] Add support splat assigmnent in multiple assignment
|
24
|
+
* [fixed] Add support for /s/ =~ foo (Rubinius::AST::Match2)
|
25
|
+
* [fixed] Add support for $` (Rubinius::AST::BackRef)
|
26
|
+
* [fixed] Support multiple assignments also for attribute and element assignments
|
27
|
+
|
28
|
+
[Compare v0.2.16..v0.2.17](https://github.com/mbj/to_source/compare/v0.2.16...v0.2.17)
|
29
|
+
|
30
|
+
# v0.2.16 2013-01-25
|
2
31
|
|
3
32
|
* [fixed] Handle Rubinius::AST::Case
|
4
33
|
|
34
|
+
[Compare v0.2.15..v0.2.16](https://github.com/mbj/to_source/compare/v0.2.15...v0.2.16)
|
35
|
+
|
5
36
|
# v0.2.15 2013-01-24
|
6
37
|
|
7
38
|
* [fixed] Emit dynamic regexp literals with split groups correctly
|
8
39
|
|
40
|
+
[Compare v0.2.14..v0.2.15](https://github.com/mbj/to_source/compare/v0.2.14...v0.2.15)
|
41
|
+
|
9
42
|
# v0.2.14 2013-01-09
|
10
43
|
|
11
44
|
* [fixed] Emit send with arguments and body correctly
|
data/bin/to_source
CHANGED
@@ -3,15 +3,9 @@
|
|
3
3
|
require 'to_source'
|
4
4
|
|
5
5
|
ARGV.each do |path|
|
6
|
+
$stderr.puts(path)
|
6
7
|
source = File.read(path)
|
7
8
|
ast = source.to_ast
|
8
9
|
next if ast.nil? # When file only has comments
|
9
|
-
$stderr.puts(
|
10
|
-
begin
|
11
|
-
$stdout.puts(ToSource.to_source(ast))
|
12
|
-
rescue
|
13
|
-
ast.ascii_graph
|
14
|
-
$stderr.puts("Error in: #{path}")
|
15
|
-
raise
|
16
|
-
end
|
10
|
+
$stderr.puts(ToSource.to_source(ast))
|
17
11
|
end
|
data/config/flay.yml
CHANGED
data/config/site.reek
CHANGED
@@ -42,6 +42,11 @@ IrresponsibleModule:
|
|
42
42
|
enabled: false
|
43
43
|
UncommunicativeModuleName:
|
44
44
|
accept:
|
45
|
+
- ToSource::Emitter::Match2
|
46
|
+
- ToSource::Emitter::Iter19
|
47
|
+
- ToSource::Emitter::Flip::Flip2
|
48
|
+
- ToSource::Emitter::Flip::Flip3
|
49
|
+
- ToSource::Emitter::For19
|
45
50
|
- ToSource::Emitter::Match3
|
46
51
|
- ToSource::Emitter::OpAssign1
|
47
52
|
- ToSource::Emitter::OpAssign2
|
data/lib/to_source.rb
CHANGED
@@ -8,12 +8,20 @@ require 'to_source/state'
|
|
8
8
|
require 'to_source/emitter'
|
9
9
|
require 'to_source/emitter/literal'
|
10
10
|
require 'to_source/emitter/literal/dynamic'
|
11
|
+
require 'to_source/emitter/literal/dynamic/regexp'
|
12
|
+
require 'to_source/emitter/literal/regexp'
|
13
|
+
require 'to_source/emitter/literal/regexp/options'
|
11
14
|
require 'to_source/emitter/access'
|
12
15
|
require 'to_source/emitter/formal_arguments'
|
13
16
|
require 'to_source/emitter/actual_arguments'
|
14
17
|
require 'to_source/emitter/scope'
|
15
18
|
require 'to_source/emitter/define'
|
16
19
|
require 'to_source/emitter/assignment'
|
20
|
+
require 'to_source/emitter/assignment/element'
|
21
|
+
require 'to_source/emitter/assignment/variable'
|
22
|
+
require 'to_source/emitter/assignment/attribute'
|
23
|
+
require 'to_source/emitter/assignment/constant'
|
24
|
+
require 'to_source/emitter/assignment_operator'
|
17
25
|
require 'to_source/emitter/static'
|
18
26
|
require 'to_source/emitter/block'
|
19
27
|
require 'to_source/emitter/toplevel'
|
@@ -32,6 +40,7 @@ require 'to_source/emitter/send_with_arguments'
|
|
32
40
|
require 'to_source/emitter/block_pass'
|
33
41
|
require 'to_source/emitter/block_argument'
|
34
42
|
require 'to_source/emitter/iter'
|
43
|
+
require 'to_source/emitter/for'
|
35
44
|
require 'to_source/emitter/pattern_arguments'
|
36
45
|
require 'to_source/emitter/unary_operator_method'
|
37
46
|
require 'to_source/emitter/binary_operator_method'
|
@@ -40,15 +49,19 @@ require 'to_source/emitter/element_reference'
|
|
40
49
|
require 'to_source/emitter/to_array'
|
41
50
|
require 'to_source/emitter/to_string'
|
42
51
|
require 'to_source/emitter/defined'
|
43
|
-
require 'to_source/emitter/
|
44
|
-
require 'to_source/emitter/element_assignment'
|
52
|
+
require 'to_source/emitter/undef'
|
45
53
|
require 'to_source/emitter/if'
|
54
|
+
require 'to_source/emitter/back_ref'
|
46
55
|
require 'to_source/emitter/loop'
|
47
56
|
require 'to_source/emitter/ensure'
|
48
57
|
require 'to_source/emitter/case'
|
49
58
|
require 'to_source/emitter/when'
|
59
|
+
require 'to_source/emitter/splat'
|
60
|
+
require 'to_source/emitter/push_args'
|
50
61
|
require 'to_source/emitter/splat_when'
|
62
|
+
require 'to_source/emitter/collect_splat'
|
51
63
|
require 'to_source/emitter/unless'
|
64
|
+
require 'to_source/emitter/flip'
|
52
65
|
require 'to_source/emitter/class'
|
53
66
|
require 'to_source/emitter/module'
|
54
67
|
require 'to_source/emitter/op_assign2'
|
@@ -58,10 +71,11 @@ require 'to_source/emitter/default_arguments'
|
|
58
71
|
require 'to_source/emitter/multiple_assignment'
|
59
72
|
require 'to_source/emitter/concat_arguments'
|
60
73
|
require 'to_source/emitter/super'
|
74
|
+
require 'to_source/emitter/match'
|
75
|
+
require 'to_source/emitter/match2'
|
61
76
|
require 'to_source/emitter/match3'
|
62
77
|
require 'to_source/emitter/yield'
|
63
78
|
require 'to_source/emitter/alias'
|
64
|
-
require 'to_source/emitter/splat'
|
65
79
|
require 'to_source/emitter/begin'
|
66
80
|
require 'to_source/emitter/util'
|
67
81
|
|
data/lib/to_source/emitter.rb
CHANGED
@@ -16,7 +16,11 @@ module ToSource
|
|
16
16
|
# @api private
|
17
17
|
#
|
18
18
|
def self.build(node, buffer = [])
|
19
|
-
|
19
|
+
klass = node.class
|
20
|
+
emitter = REGISTRY.fetch(klass) do
|
21
|
+
raise RuntimeError, "No emmitter for: #{klass} at line: #{node.line}"
|
22
|
+
end
|
23
|
+
emitter.new(node, buffer)
|
20
24
|
end
|
21
25
|
|
22
26
|
# Run emitter for node
|
@@ -1,5 +1,28 @@
|
|
1
1
|
module ToSource
|
2
2
|
class Emitter
|
3
|
+
class VAlias < self
|
4
|
+
|
5
|
+
handle(Rubinius::AST::VAlias)
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
delegate(:to, :from)
|
10
|
+
|
11
|
+
# Perform dispatch
|
12
|
+
#
|
13
|
+
# @return [undefined]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
#
|
17
|
+
def dispatch
|
18
|
+
emit('alias ')
|
19
|
+
emit(to)
|
20
|
+
space
|
21
|
+
emit(from)
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
3
26
|
# Emiter for alias node
|
4
27
|
class Alias < self
|
5
28
|
|
@@ -2,10 +2,23 @@ module ToSource
|
|
2
2
|
class Emitter
|
3
3
|
# Base class for various assignment nodes
|
4
4
|
class Assignment < self
|
5
|
+
include AbstractType
|
5
6
|
|
6
7
|
private
|
7
8
|
|
8
|
-
|
9
|
+
predicate(:value)
|
10
|
+
|
11
|
+
# Return value to assign
|
12
|
+
#
|
13
|
+
# @return [Rubinius::AST::Node]
|
14
|
+
# if present
|
15
|
+
#
|
16
|
+
# @return [nil]
|
17
|
+
# otherwise
|
18
|
+
#
|
19
|
+
# @api private
|
20
|
+
#
|
21
|
+
abstract_method :value
|
9
22
|
|
10
23
|
# Perform dispatch
|
11
24
|
#
|
@@ -15,105 +28,31 @@ module ToSource
|
|
15
28
|
#
|
16
29
|
def dispatch
|
17
30
|
emit_target
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
emit(' = ')
|
22
|
-
visit(val)
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
# Emitter for constant assignments
|
27
|
-
class Constant < self
|
28
|
-
|
29
|
-
handle(Rubinius::AST::ConstantAssignment)
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
# Emit name
|
34
|
-
#
|
35
|
-
# @return [undefined]
|
36
|
-
#
|
37
|
-
# @api private
|
38
|
-
#
|
39
|
-
def emit_target
|
40
|
-
visit(node.constant)
|
31
|
+
if value?
|
32
|
+
emit_operator
|
33
|
+
emit_value
|
41
34
|
end
|
42
|
-
|
43
35
|
end
|
44
36
|
|
45
|
-
#
|
46
|
-
class Variable < self
|
47
|
-
|
48
|
-
handle(Rubinius::AST::LocalVariableAssignment)
|
49
|
-
handle(Rubinius::AST::InstanceVariableAssignment)
|
50
|
-
handle(Rubinius::AST::GlobalVariableAssignment)
|
51
|
-
handle(Rubinius::AST::ClassVariableAssignment)
|
52
|
-
|
53
|
-
private
|
54
|
-
|
55
|
-
# Emit target
|
56
|
-
#
|
57
|
-
# @return [undefined]
|
58
|
-
#
|
59
|
-
# @api private
|
60
|
-
#
|
61
|
-
def emit_target
|
62
|
-
emit(node.name)
|
63
|
-
end
|
64
|
-
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Base class for assignment operators
|
69
|
-
class AssignmentOperator < self
|
70
|
-
|
71
|
-
private
|
72
|
-
|
73
|
-
delegate(:left, :right)
|
74
|
-
|
75
|
-
# Perform dispatch
|
37
|
+
# Emit value
|
76
38
|
#
|
77
39
|
# @return [undefined]
|
78
40
|
#
|
79
41
|
# @api private
|
80
42
|
#
|
81
|
-
def
|
82
|
-
|
83
|
-
visit(left)
|
84
|
-
emit(" #{self.class::SYMBOL} ")
|
85
|
-
emit_right
|
86
|
-
end
|
43
|
+
def emit_value
|
44
|
+
visit(value)
|
87
45
|
end
|
88
46
|
|
89
|
-
# Emit
|
47
|
+
# Emit operator
|
90
48
|
#
|
91
49
|
# @return [undefined]
|
92
50
|
#
|
93
51
|
# @api private
|
94
52
|
#
|
95
|
-
def
|
96
|
-
|
97
|
-
visit(right.value)
|
98
|
-
end
|
53
|
+
def emit_operator
|
54
|
+
emit(' = ')
|
99
55
|
end
|
100
|
-
|
101
|
-
# Emitter for or assigmnent operator
|
102
|
-
class Or < self
|
103
|
-
|
104
|
-
handle(Rubinius::AST::OpAssignOr19)
|
105
|
-
SYMBOL = :'||='
|
106
|
-
|
107
|
-
end
|
108
|
-
|
109
|
-
# Emitter for and assigmnent operator
|
110
|
-
class And < self
|
111
|
-
|
112
|
-
handle(Rubinius::AST::OpAssignAnd)
|
113
|
-
SYMBOL = :'&&='
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
56
|
end
|
118
57
|
end
|
119
58
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Assignment
|
4
|
+
# Emitter for attribute assignments
|
5
|
+
class Attribute < self
|
6
|
+
|
7
|
+
handle(Rubinius::AST::AttributeAssignment)
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
delegate(:receiver)
|
12
|
+
|
13
|
+
# Return name
|
14
|
+
#
|
15
|
+
# @return [Symbol]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
def name
|
20
|
+
node.name.to_s.gsub(/=\z/,'').to_sym
|
21
|
+
end
|
22
|
+
|
23
|
+
# Emit target
|
24
|
+
#
|
25
|
+
# @return [self]
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
#
|
29
|
+
def emit_target
|
30
|
+
visit(receiver)
|
31
|
+
emit('.')
|
32
|
+
emit(name)
|
33
|
+
end
|
34
|
+
|
35
|
+
# Return value
|
36
|
+
#
|
37
|
+
# @return [Rubinius::AST::Node]
|
38
|
+
# if value is present
|
39
|
+
#
|
40
|
+
# @return [nil]
|
41
|
+
# otherwise
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
#
|
45
|
+
def value
|
46
|
+
node.arguments.array.first
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Assignment
|
4
|
+
# Emitter for constant assignments
|
5
|
+
class Constant < self
|
6
|
+
|
7
|
+
handle(Rubinius::AST::ConstantAssignment)
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
delegate(:value)
|
12
|
+
|
13
|
+
# Emit name
|
14
|
+
#
|
15
|
+
# @return [undefined]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
def emit_target
|
20
|
+
visit(node.constant)
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module ToSource
|
2
|
+
class Emitter
|
3
|
+
class Assignment
|
4
|
+
|
5
|
+
class ElementDispatcher < Emitter
|
6
|
+
|
7
|
+
handle(Rubinius::AST::ElementAssignment)
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
# Perform dispatch
|
12
|
+
#
|
13
|
+
# @return [undefined]
|
14
|
+
#
|
15
|
+
# @api private
|
16
|
+
#
|
17
|
+
def dispatch
|
18
|
+
case node.arguments
|
19
|
+
when Rubinius::AST::ActualArguments
|
20
|
+
run(Element::Argument)
|
21
|
+
when Rubinius::AST::PushActualArguments
|
22
|
+
run(Element::Push)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Emitter for element assignments
|
29
|
+
class Element < self
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
delegate(:receiver, :arguments)
|
34
|
+
|
35
|
+
# Emit target
|
36
|
+
#
|
37
|
+
# @return [undefined]
|
38
|
+
#
|
39
|
+
# @api private
|
40
|
+
#
|
41
|
+
def emit_target
|
42
|
+
visit(receiver)
|
43
|
+
emit('[')
|
44
|
+
emit_index
|
45
|
+
emit(']')
|
46
|
+
end
|
47
|
+
|
48
|
+
class Argument < self
|
49
|
+
|
50
|
+
private
|
51
|
+
|
52
|
+
# Return arguments array
|
53
|
+
#
|
54
|
+
# @return [Array]
|
55
|
+
#
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
def array
|
59
|
+
arguments.array
|
60
|
+
end
|
61
|
+
|
62
|
+
# Emit index
|
63
|
+
#
|
64
|
+
# @return [undefined]
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
#
|
68
|
+
def emit_index
|
69
|
+
splat = arguments.splat
|
70
|
+
if splat
|
71
|
+
visit(splat)
|
72
|
+
else
|
73
|
+
visit(array[0])
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
# Return value
|
78
|
+
#
|
79
|
+
# @return [Rubinius::AST::Node]
|
80
|
+
# if value is present
|
81
|
+
#
|
82
|
+
# @return [nil]
|
83
|
+
# otherwise
|
84
|
+
#
|
85
|
+
def value
|
86
|
+
array[1]
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
class Push < self
|
92
|
+
|
93
|
+
# Emit index
|
94
|
+
#
|
95
|
+
# @return [undefined]
|
96
|
+
#
|
97
|
+
# @api private
|
98
|
+
#
|
99
|
+
def emit_index
|
100
|
+
# FIXME: Add reader
|
101
|
+
visit(arguments.instance_variable_get(:@arguments))
|
102
|
+
end
|
103
|
+
|
104
|
+
# Return value
|
105
|
+
#
|
106
|
+
# @return [Rubinius::AST::Node]
|
107
|
+
# if value is present
|
108
|
+
#
|
109
|
+
# @return [nil]
|
110
|
+
# otherwise
|
111
|
+
#
|
112
|
+
# @api private
|
113
|
+
#
|
114
|
+
def value
|
115
|
+
# FIXME: Add reader
|
116
|
+
arguments.instance_variable_get(:@value)
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|