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.
Files changed (118) hide show
  1. checksums.yaml +7 -0
  2. data/codeminer.gemspec +28 -0
  3. data/lib/codeminer.rb +112 -0
  4. data/lib/codeminer/expression_processor.rb +29 -0
  5. data/lib/codeminer/expressions/alias_expression.rb +23 -0
  6. data/lib/codeminer/expressions/ambiguous_operator_expression.rb +27 -0
  7. data/lib/codeminer/expressions/aref_assign_expression.rb +23 -0
  8. data/lib/codeminer/expressions/aref_field_expression.rb +28 -0
  9. data/lib/codeminer/expressions/arguments_expression.rb +29 -0
  10. data/lib/codeminer/expressions/array_expression.rb +22 -0
  11. data/lib/codeminer/expressions/attribute_assign_expression.rb +35 -0
  12. data/lib/codeminer/expressions/backref_variable_expression.rb +22 -0
  13. data/lib/codeminer/expressions/begin_expression.rb +38 -0
  14. data/lib/codeminer/expressions/binary_expression.rb +31 -0
  15. data/lib/codeminer/expressions/block_expression.rb +24 -0
  16. data/lib/codeminer/expressions/block_param_expression.rb +24 -0
  17. data/lib/codeminer/expressions/body_expression.rb +35 -0
  18. data/lib/codeminer/expressions/bodystmt_expression.rb +25 -0
  19. data/lib/codeminer/expressions/break_expression.rb +22 -0
  20. data/lib/codeminer/expressions/call_expression.rb +35 -0
  21. data/lib/codeminer/expressions/case_expression.rb +27 -0
  22. data/lib/codeminer/expressions/class_expression.rb +28 -0
  23. data/lib/codeminer/expressions/class_variable_assign_expression.rb +27 -0
  24. data/lib/codeminer/expressions/class_variable_expression.rb +22 -0
  25. data/lib/codeminer/expressions/colon2_assign_expression.rb +23 -0
  26. data/lib/codeminer/expressions/colon2_expression.rb +27 -0
  27. data/lib/codeminer/expressions/colon3_assign_expression.rb +23 -0
  28. data/lib/codeminer/expressions/colon3_expression.rb +26 -0
  29. data/lib/codeminer/expressions/command_expression.rb +30 -0
  30. data/lib/codeminer/expressions/condition_expression.rb +25 -0
  31. data/lib/codeminer/expressions/constant_assign_expression.rb +27 -0
  32. data/lib/codeminer/expressions/constant_variable_expression.rb +24 -0
  33. data/lib/codeminer/expressions/defined_expression.rb +22 -0
  34. data/lib/codeminer/expressions/defn_expression.rb +24 -0
  35. data/lib/codeminer/expressions/defs_expression.rb +29 -0
  36. data/lib/codeminer/expressions/destructured_param_expression.rb +24 -0
  37. data/lib/codeminer/expressions/dynamic_string_expression.rb +36 -0
  38. data/lib/codeminer/expressions/dynamic_symbol_expression.rb +22 -0
  39. data/lib/codeminer/expressions/else_expression.rb +26 -0
  40. data/lib/codeminer/expressions/empty_expression.rb +19 -0
  41. data/lib/codeminer/expressions/ensure_expression.rb +22 -0
  42. data/lib/codeminer/expressions/expression.rb +24 -0
  43. data/lib/codeminer/expressions/expression_container.rb +41 -0
  44. data/lib/codeminer/expressions/false_expression.rb +22 -0
  45. data/lib/codeminer/expressions/field_expression.rb +27 -0
  46. data/lib/codeminer/expressions/for_expression.rb +24 -0
  47. data/lib/codeminer/expressions/global_variable_assign_expression.rb +27 -0
  48. data/lib/codeminer/expressions/global_variable_expression.rb +22 -0
  49. data/lib/codeminer/expressions/hash_expression.rb +22 -0
  50. data/lib/codeminer/expressions/hash_pair_expression.rb +23 -0
  51. data/lib/codeminer/expressions/instance_variable_assign_expression.rb +27 -0
  52. data/lib/codeminer/expressions/instance_variable_expression.rb +22 -0
  53. data/lib/codeminer/expressions/int_expression.rb +24 -0
  54. data/lib/codeminer/expressions/keyword_param_expression.rb +31 -0
  55. data/lib/codeminer/expressions/lambda_expression.rb +25 -0
  56. data/lib/codeminer/expressions/local_assign_expression.rb +35 -0
  57. data/lib/codeminer/expressions/local_variable_expression.rb +24 -0
  58. data/lib/codeminer/expressions/magic_comment_expression.rb +23 -0
  59. data/lib/codeminer/expressions/module_expression.rb +27 -0
  60. data/lib/codeminer/expressions/multiple_assignment_expression.rb +25 -0
  61. data/lib/codeminer/expressions/next_expression.rb +22 -0
  62. data/lib/codeminer/expressions/nil_expression.rb +22 -0
  63. data/lib/codeminer/expressions/op_assign_expression.rb +26 -0
  64. data/lib/codeminer/expressions/optional_param_expression.rb +31 -0
  65. data/lib/codeminer/expressions/params_expression.rb +67 -0
  66. data/lib/codeminer/expressions/positional_param_expression.rb +32 -0
  67. data/lib/codeminer/expressions/range_expression.rb +28 -0
  68. data/lib/codeminer/expressions/redo_expression.rb +21 -0
  69. data/lib/codeminer/expressions/regexp_expression.rb +26 -0
  70. data/lib/codeminer/expressions/rescue_body_expression.rb +22 -0
  71. data/lib/codeminer/expressions/rescue_expression.rb +25 -0
  72. data/lib/codeminer/expressions/retry_expression.rb +21 -0
  73. data/lib/codeminer/expressions/return_expression.rb +26 -0
  74. data/lib/codeminer/expressions/root_expression.rb +22 -0
  75. data/lib/codeminer/expressions/sclass_expression.rb +23 -0
  76. data/lib/codeminer/expressions/self_expression.rb +22 -0
  77. data/lib/codeminer/expressions/splat_expression.rb +24 -0
  78. data/lib/codeminer/expressions/string_content_expression.rb +29 -0
  79. data/lib/codeminer/expressions/string_embedded_expression.rb +22 -0
  80. data/lib/codeminer/expressions/string_expression.rb +45 -0
  81. data/lib/codeminer/expressions/super_expression.rb +26 -0
  82. data/lib/codeminer/expressions/symbol_expression.rb +32 -0
  83. data/lib/codeminer/expressions/true_expression.rb +22 -0
  84. data/lib/codeminer/expressions/unary_expression.rb +23 -0
  85. data/lib/codeminer/expressions/undef_expression.rb +22 -0
  86. data/lib/codeminer/expressions/unknown_expression.rb +35 -0
  87. data/lib/codeminer/expressions/until_expression.rb +23 -0
  88. data/lib/codeminer/expressions/variable_expression.rb +20 -0
  89. data/lib/codeminer/expressions/void_expression.rb +21 -0
  90. data/lib/codeminer/expressions/when_expression.rb +24 -0
  91. data/lib/codeminer/expressions/while_expression.rb +23 -0
  92. data/lib/codeminer/expressions/xstring_expression.rb +24 -0
  93. data/lib/codeminer/expressions/yield_expression.rb +22 -0
  94. data/lib/codeminer/parser.rb +215 -0
  95. data/lib/codeminer/processors/argument_processor.rb +25 -0
  96. data/lib/codeminer/processors/array_processor.rb +86 -0
  97. data/lib/codeminer/processors/assignment_processor.rb +42 -0
  98. data/lib/codeminer/processors/binary_processor.rb +12 -0
  99. data/lib/codeminer/processors/call_processor.rb +32 -0
  100. data/lib/codeminer/processors/class_processor.rb +19 -0
  101. data/lib/codeminer/processors/command_processor.rb +15 -0
  102. data/lib/codeminer/processors/condition_processor.rb +59 -0
  103. data/lib/codeminer/processors/default_processor.rb +33 -0
  104. data/lib/codeminer/processors/hash_processor.rb +27 -0
  105. data/lib/codeminer/processors/loop_processor.rb +30 -0
  106. data/lib/codeminer/processors/method_processor.rb +58 -0
  107. data/lib/codeminer/processors/params_processor.rb +97 -0
  108. data/lib/codeminer/processors/range_processor.rb +15 -0
  109. data/lib/codeminer/processors/regexp_processor.rb +27 -0
  110. data/lib/codeminer/processors/return_processor.rb +15 -0
  111. data/lib/codeminer/processors/string_processor.rb +79 -0
  112. data/lib/codeminer/processors/symbol_processor.rb +31 -0
  113. data/lib/codeminer/processors/token_processor.rb +41 -0
  114. data/lib/codeminer/processors/variable_processor.rb +70 -0
  115. data/lib/codeminer/source_extract.rb +120 -0
  116. data/lib/codeminer/substitution.rb +48 -0
  117. data/lib/codeminer/token.rb +19 -0
  118. 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