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,97 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module ParamsProcessor
|
4
|
+
|
5
|
+
def on_params(positional, optional, splat, _, keyword, _, block)
|
6
|
+
ParamsExpression.new(positional_params(positional), optional_params(optional), keyword_params(keyword), splat_param(splat), block).tap do |params|
|
7
|
+
params.src = extract_src_by_tokens(params) if params.line
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def on_rest_param(token)
|
12
|
+
if token
|
13
|
+
token.column -= 1
|
14
|
+
src = extract_src(token.line, token.column, token.end_line, token.end_column)
|
15
|
+
else
|
16
|
+
src = extract_src(lineno(), column() - 1, lineno(), column())
|
17
|
+
end
|
18
|
+
SplatExpression.new(token, src)
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_paren(params)
|
22
|
+
params.src = extract_src(params.line, params.column - 1, params.end_line, params.end_column + 1) if params && params.src_extract
|
23
|
+
params
|
24
|
+
end
|
25
|
+
|
26
|
+
def on_block_var(params, _)
|
27
|
+
params
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_mlhs_new
|
31
|
+
ExpressionContainer.new([], :mlhs)
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_mrhs_new
|
35
|
+
ExpressionContainer.new([], :values)
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_mlhs_add(params, param)
|
39
|
+
params.add(param)
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_mlhs_paren(exp)
|
43
|
+
if exp.kind_of?(Token)
|
44
|
+
DestructuredParamExpression.new(exp, exp.src_extract)
|
45
|
+
else
|
46
|
+
exp.src = extract_src_by_token(@parens_begin.pop)
|
47
|
+
exp
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def on_mrhs_new_from_args(args)
|
52
|
+
ExpressionContainer.new(args.each, :values, args.src_extract)
|
53
|
+
end
|
54
|
+
|
55
|
+
def on_mrhs_add(params, exp)
|
56
|
+
params.add(exp)
|
57
|
+
end
|
58
|
+
|
59
|
+
def on_mrhs_add_star(params, exp)
|
60
|
+
params.add(SplatExpression.new(exp, extract_src(exp.line, exp.column - 1, exp.end_line, exp.end_column)))
|
61
|
+
end
|
62
|
+
|
63
|
+
alias :on_mlhs_add_star :on_mrhs_add_star
|
64
|
+
|
65
|
+
private
|
66
|
+
|
67
|
+
def positional_params(positional)
|
68
|
+
positional_expressions = positional.to_a.map do |exp|
|
69
|
+
PositionalParamExpression.convert(exp, extract_src_by_token(exp, exp.end_line, exp.end_column))
|
70
|
+
end
|
71
|
+
src = extract_src_by_token(positional.first, positional.last.end_line, positional.last.end_column) if positional
|
72
|
+
ExpressionContainer.new(positional_expressions, :positional, src)
|
73
|
+
end
|
74
|
+
|
75
|
+
def optional_params(optional)
|
76
|
+
optional_expressions = optional.to_a.map do |token, value|
|
77
|
+
OptionalParamExpression.new(token, value, extract_src_by_token(token, value.end_line, value.end_column))
|
78
|
+
end
|
79
|
+
src = extract_src_by_token(optional.first.first, optional.last.last.end_line, optional.last.last.end_column) if optional
|
80
|
+
ExpressionContainer.new(optional_expressions, :optional, src)
|
81
|
+
end
|
82
|
+
|
83
|
+
def keyword_params(keyword)
|
84
|
+
keyword_expressions = keyword.to_a.map do |token, value|
|
85
|
+
KeywordParamExpression.new(token, value || nil, extract_src_by_tokens(token, value || token))
|
86
|
+
end
|
87
|
+
src = extract_src_by_tokens(keyword_expressions.first, keyword_expressions.last) unless keyword_expressions.empty?
|
88
|
+
ExpressionContainer.new(keyword_expressions, :keyword, src)
|
89
|
+
end
|
90
|
+
|
91
|
+
def splat_param(splat)
|
92
|
+
splat unless splat == 0
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
|
97
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module RangeProcessor
|
4
|
+
|
5
|
+
def on_dot2(left, right)
|
6
|
+
RangeExpression.new(left, right, true, extract_src_by_tokens(left, right))
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_dot3(left, right)
|
10
|
+
RangeExpression.new(left, right, false, extract_src_by_tokens(left, right))
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module RegexpProcessor
|
4
|
+
|
5
|
+
def on_regexp_literal(regexp, regex_end)
|
6
|
+
regexp.tap do |r|
|
7
|
+
r.src = extract_src_by_token(@begin_regex.pop, regex_end.line, regex_end.end_column)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def on_regexp_beg(value)
|
12
|
+
super.tap do |token|
|
13
|
+
@begin_regex << token
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_regexp_add(regexp_content, regex)
|
18
|
+
regexp_content.add(regex)
|
19
|
+
end
|
20
|
+
|
21
|
+
def on_regexp_new
|
22
|
+
RegexpExpression.new
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module ReturnProcessor
|
4
|
+
|
5
|
+
def on_return(body)
|
6
|
+
ReturnExpression.new(body, extract_src_by_token(pop_keyword('return')))
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_return0
|
10
|
+
ReturnExpression.new(nil, extract_src_by_token(pop_keyword('return')))
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module StringProcessor
|
4
|
+
|
5
|
+
def on_tstring_content(value)
|
6
|
+
Token.new(:string, value, extract_src_by_value(value))
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_string_add(string_content, string)
|
10
|
+
string_content.add(string, extract_src_by_tokens(string))
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_string_content
|
14
|
+
StringContentExpression.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def on_string_concat(str1, str2)
|
18
|
+
dynamic_string = DynamicStringExpression.wrap(str1)
|
19
|
+
dynamic_string.add(str2)
|
20
|
+
end
|
21
|
+
|
22
|
+
def on_xstring_literal(token)
|
23
|
+
token.column -= 1
|
24
|
+
token.end_column += 1
|
25
|
+
XStringExpression.new(token, extract_src_by_tokens(token))
|
26
|
+
end
|
27
|
+
|
28
|
+
def on_string_embexpr(body)
|
29
|
+
body.each.last.delimiter = '}'
|
30
|
+
embedded_expression_src = extract_src_by_token(@embexpr.pop)
|
31
|
+
StringEmbeddedExpression.new(body, embedded_expression_src)
|
32
|
+
end
|
33
|
+
|
34
|
+
def on_string_literal(string_content)
|
35
|
+
string_content.src = extract_src_by_tokens(@string_begin.pop, @string_end.pop)
|
36
|
+
string_content
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_xstring_new
|
40
|
+
StringContentExpression.new
|
41
|
+
end
|
42
|
+
|
43
|
+
def on_xstring_add(body, string)
|
44
|
+
body.add(string, extract_src_by_tokens(string))
|
45
|
+
end
|
46
|
+
|
47
|
+
def on_tstring_beg(*)
|
48
|
+
super.tap do |token|
|
49
|
+
@string_begin << token
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def on_tstring_end(*)
|
54
|
+
super.tap do |token|
|
55
|
+
@string_end << token
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def on_embexpr_beg(*)
|
60
|
+
super.tap do |token|
|
61
|
+
@embexpr << token
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def on_heredoc_beg(*)
|
66
|
+
super.tap do |token|
|
67
|
+
@string_begin << token
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def on_heredoc_end(*)
|
72
|
+
super.tap do |token|
|
73
|
+
@string_end << token
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module SymbolProcessor
|
4
|
+
|
5
|
+
def on_symbol_literal(symbol)
|
6
|
+
SymbolExpression.convert(symbol)
|
7
|
+
end
|
8
|
+
|
9
|
+
def on_symbol(token)
|
10
|
+
SymbolExpression.new(token, extract_src_by_token(@symbol_begin.pop))
|
11
|
+
end
|
12
|
+
|
13
|
+
def on_dyna_symbol(*body)
|
14
|
+
body.first.src = extract_src_by_tokens(@string_begin.pop, @string_end.pop)
|
15
|
+
DynamicSymbolExpression.new(*body, extract_src_by_tokens(@symbol_begin.pop, body.last))
|
16
|
+
end
|
17
|
+
|
18
|
+
def on_symbeg(value)
|
19
|
+
super.tap do |token|
|
20
|
+
if value.end_with?('"', "'")
|
21
|
+
@symbol_begin << Token.new(:symbeg, value.chomp('"').chomp("'"), extract_src_by_token(token, token.end_line, token.end_column - 1))
|
22
|
+
@string_begin << Token.new(:tstring_beg, value.slice(1..-1), extract_src(token.line, token.column + 1, token.end_line, token.end_column - 1))
|
23
|
+
else
|
24
|
+
@symbol_begin << token
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module TokenProcessor
|
4
|
+
|
5
|
+
def self.tokens(*attrs)
|
6
|
+
attrs.each do |attr|
|
7
|
+
define_method :"on_#{attr}" do |token|
|
8
|
+
token
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
tokens :const_ref
|
14
|
+
|
15
|
+
def on_lbrace(token)
|
16
|
+
@lbrace << super
|
17
|
+
token
|
18
|
+
end
|
19
|
+
|
20
|
+
def on_kw(kw)
|
21
|
+
super.tap do |token|
|
22
|
+
if %w(do class def if else unless return alias yield break next super begin rescue case when redo retry undef elsif
|
23
|
+
until while for module defined? ensure).include?(kw.gsub(/[^a-z?]/, ''))
|
24
|
+
@keywords.unshift(token)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def on_lbracket(value)
|
30
|
+
@lbracket = super
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_lparen(*)
|
34
|
+
super.tap do |token|
|
35
|
+
@parens_begin << token
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
module VariableProcessor
|
4
|
+
|
5
|
+
def on_var_ref(exp)
|
6
|
+
if exp.kind_of?(Token)
|
7
|
+
cast_variable_to_type(exp)
|
8
|
+
else
|
9
|
+
exp
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
alias on_var_field on_var_ref
|
14
|
+
|
15
|
+
def on_gvar(value)
|
16
|
+
GlobalVariableExpression.new(value, extract_src_by_value(value))
|
17
|
+
end
|
18
|
+
|
19
|
+
def on_ivar(value)
|
20
|
+
InstanceVariableExpression.new(value, extract_src_by_value(value))
|
21
|
+
end
|
22
|
+
|
23
|
+
def on_cvar(value)
|
24
|
+
ClassVariableExpression.new(value, extract_src_by_value(value))
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_backref(value)
|
28
|
+
BackrefVariableExpression.new(value.slice(1..-1), extract_src_by_value(value))
|
29
|
+
end
|
30
|
+
|
31
|
+
def on_field(receiver, delimiter, token)
|
32
|
+
FieldExpression.new(receiver, token, extract_src_by_tokens(receiver, token))
|
33
|
+
end
|
34
|
+
|
35
|
+
def on_const_path_ref(const, token)
|
36
|
+
Colon2Expression.new(token, const, extract_src_by_tokens(const, token))
|
37
|
+
end
|
38
|
+
|
39
|
+
alias on_const_path_field on_const_path_ref
|
40
|
+
|
41
|
+
def on_top_const_ref(token)
|
42
|
+
Colon3Expression.new(token, extract_src(token.line, token.column - 2, token.end_line, token.end_column))
|
43
|
+
end
|
44
|
+
|
45
|
+
alias on_top_const_field on_top_const_ref
|
46
|
+
|
47
|
+
private
|
48
|
+
|
49
|
+
def cast_variable_to_type(exp)
|
50
|
+
if exp.type == :const
|
51
|
+
ConstantVariableExpression.new(exp, exp.src_extract)
|
52
|
+
else
|
53
|
+
case exp.value
|
54
|
+
when 'nil'
|
55
|
+
NilExpression.new(exp, extract_src_by_tokens(exp))
|
56
|
+
when 'self'
|
57
|
+
SelfExpression.new(exp, extract_src_by_tokens(exp))
|
58
|
+
when 'false'
|
59
|
+
FalseExpression.new(exp, extract_src_by_tokens(exp))
|
60
|
+
when 'true'
|
61
|
+
TrueExpression.new(exp, extract_src_by_tokens(exp))
|
62
|
+
else
|
63
|
+
LocalVariableExpression.new(exp, exp.src_extract)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
module CodeMiner
|
2
|
+
|
3
|
+
class SourceExtract
|
4
|
+
|
5
|
+
attr_accessor :line, :column
|
6
|
+
attr_accessor :end_line, :end_column
|
7
|
+
|
8
|
+
class Partial
|
9
|
+
|
10
|
+
attr_reader :end_line, :end_column, :line, :column
|
11
|
+
|
12
|
+
def initialize(src, end_line, end_column)
|
13
|
+
@src = src
|
14
|
+
@end_line = end_line
|
15
|
+
@end_column = end_column
|
16
|
+
@line = end_line
|
17
|
+
@column = end_column
|
18
|
+
end
|
19
|
+
|
20
|
+
def adjust(other)
|
21
|
+
SourceExtract.new(@src, other.line, other.column, end_line, end_column)
|
22
|
+
end
|
23
|
+
|
24
|
+
def extract
|
25
|
+
''
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
module Usage
|
31
|
+
|
32
|
+
def line
|
33
|
+
src_extract.line
|
34
|
+
end
|
35
|
+
|
36
|
+
def column
|
37
|
+
src_extract.column
|
38
|
+
end
|
39
|
+
|
40
|
+
def end_line
|
41
|
+
src_extract.end_line
|
42
|
+
end
|
43
|
+
|
44
|
+
def end_column
|
45
|
+
src_extract.end_column
|
46
|
+
end
|
47
|
+
|
48
|
+
def line=(line)
|
49
|
+
src_extract.line = line
|
50
|
+
end
|
51
|
+
|
52
|
+
def column=(column)
|
53
|
+
src_extract.column = column
|
54
|
+
end
|
55
|
+
|
56
|
+
def end_line=(line)
|
57
|
+
src_extract.end_line = line
|
58
|
+
end
|
59
|
+
|
60
|
+
def end_column=(column)
|
61
|
+
src_extract.end_column = column
|
62
|
+
end
|
63
|
+
|
64
|
+
def src
|
65
|
+
extracted_source = src_extract.extract
|
66
|
+
if delimiter
|
67
|
+
extracted_source.chomp(delimiter.to_s)
|
68
|
+
else
|
69
|
+
extracted_source
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def adjust_src(other)
|
74
|
+
if @src
|
75
|
+
@src = @src.adjust(other)
|
76
|
+
else
|
77
|
+
@src = other
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def src_extract
|
82
|
+
@src || @src_fallback
|
83
|
+
end
|
84
|
+
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.extract_by_token(src, token, end_line, end_column)
|
88
|
+
new(src, token.line, token.column, end_line, end_column)
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.extract_by_tokens(src, token, end_token)
|
92
|
+
new(src, token.line, token.column, end_token.end_line, end_token.end_column)
|
93
|
+
end
|
94
|
+
|
95
|
+
def initialize(src, line, column, end_line=nil, end_column=nil)
|
96
|
+
@src = src
|
97
|
+
@line = line
|
98
|
+
@column = column
|
99
|
+
@end_line = end_line
|
100
|
+
@end_column = end_column
|
101
|
+
end
|
102
|
+
|
103
|
+
def extract
|
104
|
+
lines = extract_lines(line-1..end_line-1).join
|
105
|
+
lines.slice(column, lines.length - (lines.lines.last.length - end_column) - column).to_s.chomp
|
106
|
+
end
|
107
|
+
|
108
|
+
def adjust(other)
|
109
|
+
self.class.new(@src, line, column, other.end_line, other.end_column)
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
|
114
|
+
def extract_lines(range)
|
115
|
+
@src.lines.slice(range)
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
119
|
+
|
120
|
+
end
|