codeminer 0.1.0
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.
- checksums.yaml +7 -0
- data/codeminer.gemspec +28 -0
- data/lib/codeminer.rb +112 -0
- data/lib/codeminer/expression_processor.rb +29 -0
- data/lib/codeminer/expressions/alias_expression.rb +23 -0
- data/lib/codeminer/expressions/ambiguous_operator_expression.rb +27 -0
- data/lib/codeminer/expressions/aref_assign_expression.rb +23 -0
- data/lib/codeminer/expressions/aref_field_expression.rb +28 -0
- data/lib/codeminer/expressions/arguments_expression.rb +29 -0
- data/lib/codeminer/expressions/array_expression.rb +22 -0
- data/lib/codeminer/expressions/attribute_assign_expression.rb +35 -0
- data/lib/codeminer/expressions/backref_variable_expression.rb +22 -0
- data/lib/codeminer/expressions/begin_expression.rb +38 -0
- data/lib/codeminer/expressions/binary_expression.rb +31 -0
- data/lib/codeminer/expressions/block_expression.rb +24 -0
- data/lib/codeminer/expressions/block_param_expression.rb +24 -0
- data/lib/codeminer/expressions/body_expression.rb +35 -0
- data/lib/codeminer/expressions/bodystmt_expression.rb +25 -0
- data/lib/codeminer/expressions/break_expression.rb +22 -0
- data/lib/codeminer/expressions/call_expression.rb +35 -0
- data/lib/codeminer/expressions/case_expression.rb +27 -0
- data/lib/codeminer/expressions/class_expression.rb +28 -0
- data/lib/codeminer/expressions/class_variable_assign_expression.rb +27 -0
- data/lib/codeminer/expressions/class_variable_expression.rb +22 -0
- data/lib/codeminer/expressions/colon2_assign_expression.rb +23 -0
- data/lib/codeminer/expressions/colon2_expression.rb +27 -0
- data/lib/codeminer/expressions/colon3_assign_expression.rb +23 -0
- data/lib/codeminer/expressions/colon3_expression.rb +26 -0
- data/lib/codeminer/expressions/command_expression.rb +30 -0
- data/lib/codeminer/expressions/condition_expression.rb +25 -0
- data/lib/codeminer/expressions/constant_assign_expression.rb +27 -0
- data/lib/codeminer/expressions/constant_variable_expression.rb +24 -0
- data/lib/codeminer/expressions/defined_expression.rb +22 -0
- data/lib/codeminer/expressions/defn_expression.rb +24 -0
- data/lib/codeminer/expressions/defs_expression.rb +29 -0
- data/lib/codeminer/expressions/destructured_param_expression.rb +24 -0
- data/lib/codeminer/expressions/dynamic_string_expression.rb +36 -0
- data/lib/codeminer/expressions/dynamic_symbol_expression.rb +22 -0
- data/lib/codeminer/expressions/else_expression.rb +26 -0
- data/lib/codeminer/expressions/empty_expression.rb +19 -0
- data/lib/codeminer/expressions/ensure_expression.rb +22 -0
- data/lib/codeminer/expressions/expression.rb +24 -0
- data/lib/codeminer/expressions/expression_container.rb +41 -0
- data/lib/codeminer/expressions/false_expression.rb +22 -0
- data/lib/codeminer/expressions/field_expression.rb +27 -0
- data/lib/codeminer/expressions/for_expression.rb +24 -0
- data/lib/codeminer/expressions/global_variable_assign_expression.rb +27 -0
- data/lib/codeminer/expressions/global_variable_expression.rb +22 -0
- data/lib/codeminer/expressions/hash_expression.rb +22 -0
- data/lib/codeminer/expressions/hash_pair_expression.rb +23 -0
- data/lib/codeminer/expressions/instance_variable_assign_expression.rb +27 -0
- data/lib/codeminer/expressions/instance_variable_expression.rb +22 -0
- data/lib/codeminer/expressions/int_expression.rb +24 -0
- data/lib/codeminer/expressions/keyword_param_expression.rb +31 -0
- data/lib/codeminer/expressions/lambda_expression.rb +25 -0
- data/lib/codeminer/expressions/local_assign_expression.rb +35 -0
- data/lib/codeminer/expressions/local_variable_expression.rb +24 -0
- data/lib/codeminer/expressions/magic_comment_expression.rb +23 -0
- data/lib/codeminer/expressions/module_expression.rb +27 -0
- data/lib/codeminer/expressions/multiple_assignment_expression.rb +25 -0
- data/lib/codeminer/expressions/next_expression.rb +22 -0
- data/lib/codeminer/expressions/nil_expression.rb +22 -0
- data/lib/codeminer/expressions/op_assign_expression.rb +26 -0
- data/lib/codeminer/expressions/optional_param_expression.rb +31 -0
- data/lib/codeminer/expressions/params_expression.rb +67 -0
- data/lib/codeminer/expressions/positional_param_expression.rb +32 -0
- data/lib/codeminer/expressions/range_expression.rb +28 -0
- data/lib/codeminer/expressions/redo_expression.rb +21 -0
- data/lib/codeminer/expressions/regexp_expression.rb +26 -0
- data/lib/codeminer/expressions/rescue_body_expression.rb +22 -0
- data/lib/codeminer/expressions/rescue_expression.rb +25 -0
- data/lib/codeminer/expressions/retry_expression.rb +21 -0
- data/lib/codeminer/expressions/return_expression.rb +26 -0
- data/lib/codeminer/expressions/root_expression.rb +22 -0
- data/lib/codeminer/expressions/sclass_expression.rb +23 -0
- data/lib/codeminer/expressions/self_expression.rb +22 -0
- data/lib/codeminer/expressions/splat_expression.rb +24 -0
- data/lib/codeminer/expressions/string_content_expression.rb +29 -0
- data/lib/codeminer/expressions/string_embedded_expression.rb +22 -0
- data/lib/codeminer/expressions/string_expression.rb +45 -0
- data/lib/codeminer/expressions/super_expression.rb +26 -0
- data/lib/codeminer/expressions/symbol_expression.rb +32 -0
- data/lib/codeminer/expressions/true_expression.rb +22 -0
- data/lib/codeminer/expressions/unary_expression.rb +23 -0
- data/lib/codeminer/expressions/undef_expression.rb +22 -0
- data/lib/codeminer/expressions/unknown_expression.rb +35 -0
- data/lib/codeminer/expressions/until_expression.rb +23 -0
- data/lib/codeminer/expressions/variable_expression.rb +20 -0
- data/lib/codeminer/expressions/void_expression.rb +21 -0
- data/lib/codeminer/expressions/when_expression.rb +24 -0
- data/lib/codeminer/expressions/while_expression.rb +23 -0
- data/lib/codeminer/expressions/xstring_expression.rb +24 -0
- data/lib/codeminer/expressions/yield_expression.rb +22 -0
- data/lib/codeminer/parser.rb +215 -0
- data/lib/codeminer/processors/argument_processor.rb +25 -0
- data/lib/codeminer/processors/array_processor.rb +86 -0
- data/lib/codeminer/processors/assignment_processor.rb +42 -0
- data/lib/codeminer/processors/binary_processor.rb +12 -0
- data/lib/codeminer/processors/call_processor.rb +32 -0
- data/lib/codeminer/processors/class_processor.rb +19 -0
- data/lib/codeminer/processors/command_processor.rb +15 -0
- data/lib/codeminer/processors/condition_processor.rb +59 -0
- data/lib/codeminer/processors/default_processor.rb +33 -0
- data/lib/codeminer/processors/hash_processor.rb +27 -0
- data/lib/codeminer/processors/loop_processor.rb +30 -0
- data/lib/codeminer/processors/method_processor.rb +58 -0
- data/lib/codeminer/processors/params_processor.rb +97 -0
- data/lib/codeminer/processors/range_processor.rb +15 -0
- data/lib/codeminer/processors/regexp_processor.rb +27 -0
- data/lib/codeminer/processors/return_processor.rb +15 -0
- data/lib/codeminer/processors/string_processor.rb +79 -0
- data/lib/codeminer/processors/symbol_processor.rb +31 -0
- data/lib/codeminer/processors/token_processor.rb +41 -0
- data/lib/codeminer/processors/variable_processor.rb +70 -0
- data/lib/codeminer/source_extract.rb +120 -0
- data/lib/codeminer/substitution.rb +48 -0
- data/lib/codeminer/token.rb +19 -0
- metadata +172 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class SuperExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :value, :body
|
|
6
|
+
|
|
7
|
+
def initialize(body, src)
|
|
8
|
+
@body = body
|
|
9
|
+
@src = src
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def type
|
|
13
|
+
:super
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def each
|
|
17
|
+
if body
|
|
18
|
+
body.each
|
|
19
|
+
else
|
|
20
|
+
[]
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class SymbolExpression < Expression
|
|
4
|
+
|
|
5
|
+
def self.convert(exp)
|
|
6
|
+
if exp.kind_of?(Token)
|
|
7
|
+
new(exp, exp.src_extract)
|
|
8
|
+
else
|
|
9
|
+
exp
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def initialize(token, src)
|
|
14
|
+
@token = token
|
|
15
|
+
@src = src
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def type
|
|
19
|
+
:symbol
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def value
|
|
23
|
+
@token.value
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def each
|
|
27
|
+
[]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class UnaryExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :value, :receiver
|
|
6
|
+
|
|
7
|
+
def initialize(value, receiver, src)
|
|
8
|
+
@value = value
|
|
9
|
+
@receiver = receiver
|
|
10
|
+
@src = src
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type
|
|
14
|
+
:unary
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def each
|
|
18
|
+
[@receiver]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class UndefExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :value
|
|
6
|
+
|
|
7
|
+
def initialize(symbols, src)
|
|
8
|
+
@symbols = symbols
|
|
9
|
+
@src = src
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def type
|
|
13
|
+
:undef
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def each
|
|
17
|
+
@symbols
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class UnknownExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :type, :value, :line, :column
|
|
6
|
+
|
|
7
|
+
def initialize(type, value, src, children, line, column)
|
|
8
|
+
@type, @value, @src, @children, @line, @column = type, value, src, children, line, column
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def <<(obj)
|
|
12
|
+
@children << obj
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def each
|
|
16
|
+
@children
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def add(obj, src)
|
|
20
|
+
@children << obj
|
|
21
|
+
@src = src
|
|
22
|
+
self
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def end_line
|
|
26
|
+
line
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def end_column
|
|
30
|
+
column + value.to_s.length
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class UntilExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :test, :body, :value
|
|
6
|
+
|
|
7
|
+
def initialize(test, body, src)
|
|
8
|
+
@test = test
|
|
9
|
+
@body = body
|
|
10
|
+
@src = src
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type
|
|
14
|
+
:until
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def each
|
|
18
|
+
[@test, @body]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class WhenExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :value, :else, :body
|
|
6
|
+
|
|
7
|
+
def initialize(args, body, else_exp, src)
|
|
8
|
+
@args = args
|
|
9
|
+
@body = body
|
|
10
|
+
@else = else_exp
|
|
11
|
+
@src = src
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def type
|
|
15
|
+
:when
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def each
|
|
19
|
+
[@args, @body]
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class WhileExpression < Expression
|
|
4
|
+
|
|
5
|
+
attr_reader :test, :body, :value
|
|
6
|
+
|
|
7
|
+
def initialize(test, body, src)
|
|
8
|
+
@test = test
|
|
9
|
+
@body = body
|
|
10
|
+
@src = src
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def type
|
|
14
|
+
:while
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def each
|
|
18
|
+
[@test, @body]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module CodeMiner
|
|
2
|
+
|
|
3
|
+
class XStringExpression < Expression
|
|
4
|
+
|
|
5
|
+
def initialize(token, src)
|
|
6
|
+
@token = token
|
|
7
|
+
@src = src
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def value
|
|
11
|
+
@token.value
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def type
|
|
15
|
+
:xstring
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def each
|
|
19
|
+
@token.each
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
end
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
require 'ripper'
|
|
2
|
+
require File.expand_path('../processors/argument_processor', __FILE__)
|
|
3
|
+
require File.expand_path('../processors/array_processor', __FILE__)
|
|
4
|
+
require File.expand_path('../processors/assignment_processor', __FILE__)
|
|
5
|
+
require File.expand_path('../processors/binary_processor', __FILE__)
|
|
6
|
+
require File.expand_path('../processors/call_processor', __FILE__)
|
|
7
|
+
require File.expand_path('../processors/command_processor', __FILE__)
|
|
8
|
+
require File.expand_path('../processors/class_processor', __FILE__)
|
|
9
|
+
require File.expand_path('../processors/condition_processor', __FILE__)
|
|
10
|
+
require File.expand_path('../processors/default_processor', __FILE__)
|
|
11
|
+
require File.expand_path('../processors/hash_processor', __FILE__)
|
|
12
|
+
require File.expand_path('../processors/loop_processor', __FILE__)
|
|
13
|
+
require File.expand_path('../processors/method_processor', __FILE__)
|
|
14
|
+
require File.expand_path('../processors/params_processor', __FILE__)
|
|
15
|
+
require File.expand_path('../processors/range_processor', __FILE__)
|
|
16
|
+
require File.expand_path('../processors/regexp_processor', __FILE__)
|
|
17
|
+
require File.expand_path('../processors/return_processor', __FILE__)
|
|
18
|
+
require File.expand_path('../processors/string_processor', __FILE__)
|
|
19
|
+
require File.expand_path('../processors/symbol_processor', __FILE__)
|
|
20
|
+
require File.expand_path('../processors/token_processor', __FILE__)
|
|
21
|
+
require File.expand_path('../processors/variable_processor', __FILE__)
|
|
22
|
+
|
|
23
|
+
require File.expand_path('../expression_processor', __FILE__)
|
|
24
|
+
require File.expand_path('../sexp_processor', __FILE__)
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
module CodeMiner
|
|
28
|
+
|
|
29
|
+
class Parser < Ripper
|
|
30
|
+
|
|
31
|
+
include AssignmentProcessor, CallProcessor, ClassProcessor, MethodProcessor, RegexpProcessor, TokenProcessor,
|
|
32
|
+
StringProcessor, ConditionProcessor, BinaryProcessor, ReturnProcessor, ParamsProcessor, ArgumentProcessor,
|
|
33
|
+
HashProcessor, SymbolProcessor, VariableProcessor, ArrayProcessor, CommandProcessor, LoopProcessor,
|
|
34
|
+
RangeProcessor,
|
|
35
|
+
DefaultProcessor
|
|
36
|
+
|
|
37
|
+
attr_accessor :processors, :formatters
|
|
38
|
+
|
|
39
|
+
def initialize(src, *args)
|
|
40
|
+
@src = src
|
|
41
|
+
@keywords = []
|
|
42
|
+
@begin_regex = []
|
|
43
|
+
@embexpr = []
|
|
44
|
+
@string_begin = []
|
|
45
|
+
@string_end = []
|
|
46
|
+
@symbol_begin = []
|
|
47
|
+
@string_content = []
|
|
48
|
+
@parens_begin = []
|
|
49
|
+
@qwords = []
|
|
50
|
+
@qsymbols = []
|
|
51
|
+
@lambda = []
|
|
52
|
+
@symbols = []
|
|
53
|
+
@words = []
|
|
54
|
+
@processors = []
|
|
55
|
+
@lbrace = []
|
|
56
|
+
@formatters = {}
|
|
57
|
+
super
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def self.process(rb, processors)
|
|
61
|
+
parser = new(rb).extend(ExpressionProcessor)
|
|
62
|
+
parser.processors = processors
|
|
63
|
+
parser.parse
|
|
64
|
+
processors
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def self.sexp(rb, formatters={})
|
|
68
|
+
parser = new(rb).extend(SexpProcessor)
|
|
69
|
+
parser.formatters = formatters
|
|
70
|
+
parser.parse
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def on_break(args)
|
|
74
|
+
BreakExpression.new(args, extract_src_by_token(pop_keyword('break')))
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def on_next(args)
|
|
78
|
+
NextExpression.new(args, extract_src_by_token(pop_keyword('next')))
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def on_redo
|
|
82
|
+
RedoExpression.new(extract_src_by_token(pop_keyword('redo')))
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def on_retry
|
|
86
|
+
RetryExpression.new(extract_src_by_token(pop_keyword('retry')))
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def on_zsuper
|
|
90
|
+
token = pop_keyword('super')
|
|
91
|
+
SuperExpression.new(nil, extract_src_by_token(token))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def on_super(body)
|
|
95
|
+
token = pop_keyword('super')
|
|
96
|
+
SuperExpression.new(body, extract_src_by_tokens(*[token, body].compact))
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def on_alias(left, right)
|
|
100
|
+
AliasExpression.new(left, right, extract_src_by_token(pop_keyword('alias')))
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def on_yield(args)
|
|
104
|
+
YieldExpression.new(args, extract_src_by_token(pop_keyword('yield')))
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def on_yield0
|
|
108
|
+
YieldExpression.new(nil, extract_src_by_token(pop_keyword('yield')))
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def on_undef(symbols)
|
|
112
|
+
UndefExpression.new(symbols, extract_src_by_token(pop_keyword('undef')))
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def on_int(*)
|
|
116
|
+
token = super
|
|
117
|
+
IntExpression.new(token, extract_src_by_tokens(token))
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def on_unary(value, receiver)
|
|
121
|
+
UnaryExpression.new(value.to_s.chomp('@'), receiver, extract_src(receiver.line, receiver.column - value.length - unary_offset(value), receiver.end_line, receiver.end_column))
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def on_void_stmt
|
|
125
|
+
VoidExpression.new(extract_src(lineno(), column()))
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def on_begin(body)
|
|
129
|
+
BeginExpression.new(body, extract_src_by_token(pop_keyword('begin')))
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def on_rescue(constants, assign, body, d)
|
|
133
|
+
constants ||= []
|
|
134
|
+
rescue_body = RescueBodyExpression.wrap(body)
|
|
135
|
+
src = extract_src_by_tokens(pop_keyword('rescue'), rescue_body)
|
|
136
|
+
RescueExpression.new(constants.each.to_a, assign, rescue_body, d, src)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def on_ensure(body)
|
|
140
|
+
EnsureExpression.new(body, extract_src_by_tokens(pop_keyword('ensure'), body))
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def on_bodystmt(body, rescue_exp, else_exp, ensure_exp)
|
|
144
|
+
BodystmtExpression.new(body, rescue_exp, else_exp, ensure_exp, src: extract_src_by_tokens(body, body))
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def on_stmts_new
|
|
148
|
+
BodyExpression.new(extract_src(lineno(), column()))
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
def on_stmts_add(body, statement)
|
|
152
|
+
assert body.kind_of?(BodyExpression), "Expected body #{body} to be type of BodyExpression"
|
|
153
|
+
body.add(statement)
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
def on_defined(body)
|
|
157
|
+
DefinedExpression.new(body, extract_src_by_tokens(pop_keyword('defined?'),body))
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def on_program(body)
|
|
161
|
+
RootExpression.new(body, @src)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
def on_operator_ambiguous(value, msg)
|
|
165
|
+
token = Token.new(:op, value.to_s, extract_src_by_value(value))
|
|
166
|
+
AmbiguousOperatorExpression.new(token, msg, extract_src_by_token(token))
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def on_magic_comment(key, value)
|
|
170
|
+
MagicCommentExpression.new(key, value, extract_src(lineno(), column()))
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def compile_error(msg)
|
|
174
|
+
raise CodeMiner::ParseError, msg
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
private
|
|
178
|
+
|
|
179
|
+
def extract_src_by_token(token, line=lineno(), col=column())
|
|
180
|
+
SourceExtract.extract_by_token(@src, token, line, col)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def extract_src_by_tokens(begin_token, end_token=begin_token)
|
|
184
|
+
SourceExtract.extract_by_tokens(@src, begin_token, end_token)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def extract_src_by_value(value)
|
|
188
|
+
extract_src(lineno(), column(), lineno(), column() + value.length)
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def extract_src(begin_line, begin_column, end_line=lineno(), end_column=column())
|
|
192
|
+
SourceExtract.new(@src, begin_line, begin_column, end_line, end_column)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
def extract_params_source(params)
|
|
196
|
+
extract_src(params.first.line, params.last.line, params.first.column, params.last.column)
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
def assert(t, msg)
|
|
200
|
+
raise CodeMiner::ParseError, msg unless t
|
|
201
|
+
end
|
|
202
|
+
|
|
203
|
+
def pop_keyword(type)
|
|
204
|
+
i = @keywords.index {|k| k.value == type }
|
|
205
|
+
assert(i, "Expected to find keyword of type #{type}")
|
|
206
|
+
@keywords.delete_at(i)
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
def unary_offset(value)
|
|
210
|
+
value == :-@ ? -1 : 1
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
end
|
|
214
|
+
|
|
215
|
+
end
|