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,25 @@
1
+ module CodeMiner
2
+
3
+ module ArgumentProcessor
4
+
5
+ def on_args_new
6
+ ArgumentsExpression.new(SourceExtract::Partial.new(@src, lineno(), column()))
7
+ end
8
+
9
+ def on_args_add_block(exp, block)
10
+ exp.block = block
11
+ exp
12
+ end
13
+
14
+ def on_args_add(args, exp)
15
+ args.adjust_src(exp.src_extract)
16
+ args.add(exp)
17
+ end
18
+
19
+ def on_args_add_star(args, exp)
20
+ args.add(SplatExpression.new(exp, extract_src(exp.line, exp.column - 1, exp.end_line, exp.end_column)))
21
+ end
22
+
23
+ end
24
+
25
+ end
@@ -0,0 +1,86 @@
1
+ module CodeMiner
2
+
3
+ module ArrayProcessor
4
+
5
+ def on_array(args)
6
+ ArrayExpression.new(args, extract_src_from_args(args))
7
+ end
8
+
9
+ def on_qwords_new
10
+ ArgumentsExpression.new(SourceExtract::Partial.new(@src, lineno(), column()), @qwords.pop)
11
+ end
12
+
13
+ def on_qwords_add(args, str)
14
+ args.add(str)
15
+ end
16
+
17
+ def on_qsymbols_new
18
+ ArgumentsExpression.new(SourceExtract::Partial.new(@src, lineno(), column()), @qsymbols.pop)
19
+ end
20
+
21
+ def on_qsymbols_add(args, string)
22
+ args.add(SymbolExpression.convert(string))
23
+ end
24
+
25
+ def on_symbols_new
26
+ ArgumentsExpression.new(SourceExtract::Partial.new(@src, lineno(), column()), @symbols.pop)
27
+ end
28
+
29
+ def on_symbols_add(args, string)
30
+ args.add(SymbolExpression.convert(string))
31
+ end
32
+
33
+ def on_word_add(words, word)
34
+ word
35
+ end
36
+
37
+ def on_word_new
38
+
39
+ end
40
+
41
+ def on_words_add(words, word)
42
+ words.add(StringExpression.convert(word))
43
+ end
44
+
45
+ def on_words_new
46
+ ArgumentsExpression.new(SourceExtract::Partial.new(@src, lineno(), column()), @words.pop)
47
+ end
48
+
49
+ def on_qwords_beg(*)
50
+ super.tap do |token|
51
+ @qwords << token
52
+ end
53
+ end
54
+
55
+ def on_qsymbols_beg(*)
56
+ super.tap do |token|
57
+ @qsymbols << token
58
+ end
59
+ end
60
+
61
+ def on_symbols_beg(*)
62
+ super.tap do |token|
63
+ @symbols << token
64
+ end
65
+ end
66
+
67
+ def on_words_beg(*)
68
+ super.tap do |token|
69
+ @words << token
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def extract_src_from_args(args)
76
+ if args
77
+ size = args.token ? args.token.value.length : 1
78
+ extract_src(args.line, args.column - size)
79
+ else
80
+ extract_src(lineno(), column() - 2)
81
+ end
82
+ end
83
+
84
+ end
85
+
86
+ end
@@ -0,0 +1,42 @@
1
+ module CodeMiner
2
+
3
+ module AssignmentProcessor
4
+
5
+ def on_assign(exp, body)
6
+ klass = case exp.type
7
+ when :local_variable
8
+ LocalAssignExpression
9
+ when :global_variable
10
+ GlobalVariableAssignExpression
11
+ when :instance_variable
12
+ InstanceVariableAssignExpression
13
+ when :class_variable
14
+ ClassVariableAssignExpression
15
+ when :field
16
+ AttributeAssignExpression
17
+ when :constant
18
+ ConstantAssignExpression
19
+ when :aref_field
20
+ ArefAssignExpression
21
+ when :colon2
22
+ Colon2AssignExpression
23
+ when :colon3
24
+ Colon3AssignExpression
25
+ else
26
+ assert(false, "#{exp.type} is not a valid assignment")
27
+ end
28
+ klass.new(exp, body, extract_src_by_tokens(exp, body))
29
+ end
30
+
31
+ def on_massign(container, values)
32
+ value_container = ExpressionContainer.wrap(values, :values)
33
+ MultipleAssignmentExpression.new(container, value_container, extract_src_by_tokens(container, values))
34
+ end
35
+
36
+ def on_opassign(variable, op, body)
37
+ OpAssignExpression.new(variable, op, body, extract_src_by_tokens(variable, body))
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,12 @@
1
+ module CodeMiner
2
+
3
+ module BinaryProcessor
4
+
5
+ def on_binary(left, value, right)
6
+ token = Token.new(:op, value.to_s, extract_src_by_value(value))
7
+ BinaryExpression.new(token, left, right, extract_src_by_tokens(left, right))
8
+ end
9
+
10
+ end
11
+
12
+ end
@@ -0,0 +1,32 @@
1
+ module CodeMiner
2
+
3
+ module CallProcessor
4
+
5
+ def on_vcall(token)
6
+ CallExpression.new(token, extract_src_by_token(token, token.line, token.end_column))
7
+ end
8
+
9
+ def on_call(receiver, delimiter, token)
10
+ if token == :call
11
+ token = Token.new(:ident, token.to_s, extract_src_by_value(delimiter))
12
+ end
13
+ receiver.delimiter = delimiter
14
+ CallExpression.new(token, extract_src_by_tokens(receiver, token), receiver: receiver)
15
+ end
16
+
17
+ def on_fcall(token)
18
+ CallExpression.new(token, extract_src_by_token(token))
19
+ end
20
+
21
+ def on_aref(receiver, args)
22
+ args.src = extract_src(@lbracket.line, @lbracket.column + 1, lineno(), column() - 1)
23
+ CallExpression.new(@lbracket, extract_src_by_token(receiver), receiver: receiver, arguments: args)
24
+ end
25
+
26
+ def on_aref_field(receiver, args)
27
+ ArefFieldExpression.new(@lbracket, receiver, args, extract_src_by_tokens(receiver, args))
28
+ end
29
+
30
+ end
31
+
32
+ end
@@ -0,0 +1,19 @@
1
+ module CodeMiner
2
+
3
+ module ClassProcessor
4
+
5
+ def on_class(token, parent, body)
6
+ ClassExpression.new(token, parent, body, extract_src_by_token(pop_keyword('class')))
7
+ end
8
+
9
+ def on_sclass(context, body)
10
+ SClassExpression.new(context, body, extract_src_by_token(pop_keyword('class')))
11
+ end
12
+
13
+ def on_module(token, body)
14
+ ModuleExpression.new(token, body, extract_src_by_token(pop_keyword('module')))
15
+ end
16
+
17
+ end
18
+
19
+ end
@@ -0,0 +1,15 @@
1
+ module CodeMiner
2
+
3
+ module CommandProcessor
4
+
5
+ def on_command(token, args)
6
+ CommandExpression.new(token, args, extract_src_by_tokens(token, args))
7
+ end
8
+
9
+ def on_command_call(receiver, delimiter, token, args)
10
+ CommandExpression.new(token, args, extract_src_by_tokens(receiver, args), receiver)
11
+ end
12
+
13
+ end
14
+
15
+ end
@@ -0,0 +1,59 @@
1
+ module CodeMiner
2
+
3
+ module ConditionProcessor
4
+
5
+ def on_if(test, consequence, else_statement)
6
+ token = pop_keyword('if')
7
+ ConditionExpression.new(test, consequence, else_statement, token, extract_src_by_token(token))
8
+ end
9
+
10
+ def on_elsif(test, consequence, else_statement)
11
+ token = pop_keyword('elsif')
12
+ ConditionExpression.new(test, consequence, else_statement, token, extract_src_by_token(token))
13
+ end
14
+
15
+ def on_unless(test, consequence, else_statement)
16
+ token = pop_keyword('unless')
17
+ ConditionExpression.new(test, else_statement, consequence, token, extract_src_by_token(token))
18
+ end
19
+
20
+ def on_else(body)
21
+ ElseExpression.new(body, extract_src_by_tokens(pop_keyword('else'), body))
22
+ end
23
+
24
+ def on_if_mod(test, consequence)
25
+ consequence_body = BodyExpression.from(consequence)
26
+ ConditionExpression.new(test, consequence_body, nil, pop_keyword('if'), extract_src(consequence.line, consequence.column))
27
+ end
28
+
29
+ def on_unless_mod(test, else_expression)
30
+ else_body = BodyExpression.from(else_expression)
31
+ ConditionExpression.new(test, nil, else_body, pop_keyword('unless'), extract_src_by_token(else_expression))
32
+ end
33
+
34
+ def on_ifop(test, consequence, else_statement)
35
+ ConditionExpression.new(test, BodyExpression.from(consequence), BodyExpression.from(else_statement), nil, extract_src_by_tokens(test, else_statement))
36
+ end
37
+
38
+ def on_case(test, whens)
39
+ CaseExpression.new(test, extract_whens(whens), extract_src_by_token(pop_keyword('case')))
40
+ end
41
+
42
+ def on_when(arg, body, else_exp)
43
+ WhenExpression.new(arg, body, else_exp, extract_src_by_tokens(pop_keyword('when'), body))
44
+ end
45
+
46
+ private
47
+
48
+ def extract_whens(when_exp)
49
+ [when_exp].tap do |whens|
50
+ until when_exp.else.nil? || when_exp.else.type == :else
51
+ whens << when_exp.else
52
+ when_exp = when_exp.else
53
+ end
54
+ end
55
+ end
56
+
57
+ end
58
+
59
+ end
@@ -0,0 +1,33 @@
1
+ module CodeMiner
2
+
3
+ require 'ripper'
4
+
5
+ module DefaultProcessor
6
+
7
+ Ripper::SCANNER_EVENTS.each do |event|
8
+ define_method :"on_#{event}" do |value|
9
+ Token.new(event.to_sym, value, extract_src_by_value(value))
10
+ end
11
+ end
12
+
13
+ Ripper::PARSER_EVENT_TABLE.each do |event, arity|
14
+ next if event == :parse_error
15
+ if /_new\z/ =~ event.to_s and arity == 0
16
+ define_method :"on_#{event}" do
17
+ []
18
+ end
19
+ elsif /_add\z/ =~ event.to_s
20
+ define_method :"on_#{event}" do |list, item|
21
+ list.tap { |l| l << item }
22
+ end
23
+ else
24
+ define_method :"on_#{event}" do |*args|
25
+ src = extract_src_by_token(args.first) if args.first
26
+ UnknownExpression.new(event.to_sym, nil, src, [], lineno(), column())
27
+ end
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
@@ -0,0 +1,27 @@
1
+ module CodeMiner
2
+
3
+ module HashProcessor
4
+
5
+ def on_hash(pairs)
6
+ HashExpression.new(pairs.to_a, extract_src_by_token(@lbrace.pop))
7
+ end
8
+
9
+ def on_bare_assoc_hash(pairs)
10
+ HashExpression.new(pairs.to_a, extract_src_by_tokens(pairs.first, pairs.last))
11
+ end
12
+
13
+ def on_assoclist_from_args(pairs)
14
+ pairs
15
+ end
16
+
17
+ def on_assoc_new(key, value)
18
+ HashPairExpression.new(key, value, extract_src_by_token(key, value.end_line, value.end_column))
19
+ end
20
+
21
+ def on_label(value)
22
+ Token.new(:symbol, value.chomp(':'), extract_src_by_value(value))
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,30 @@
1
+ module CodeMiner
2
+
3
+ module LoopProcessor
4
+
5
+ def on_until_mod(test, body)
6
+ pop_keyword('until')
7
+ UntilExpression.new(test, body, extract_src_by_token(body))
8
+ end
9
+
10
+ def on_until(test, body)
11
+ UntilExpression.new(test, body, extract_src_by_token(pop_keyword('until')))
12
+ end
13
+
14
+ def on_while(test, body)
15
+ WhileExpression.new(test, body, extract_src_by_token(pop_keyword('while')))
16
+ end
17
+
18
+ def on_while_mod(test, body)
19
+ pop_keyword('while')
20
+ WhileExpression.new(test, body, extract_src_by_token(body))
21
+ end
22
+
23
+ def on_for(params, receiver, body)
24
+ params_container = ExpressionContainer.wrap(params, :positional)
25
+ ForExpression.new(params_container, receiver, body, extract_src_by_token(pop_keyword('for')))
26
+ end
27
+
28
+ end
29
+
30
+ end
@@ -0,0 +1,58 @@
1
+ module CodeMiner
2
+
3
+ module MethodProcessor
4
+
5
+ def on_defs(receiver, delimiter, token, params, body)
6
+ DefsExpression.new(receiver, token, params, body, extract_src_by_token(pop_keyword('def')))
7
+ end
8
+
9
+ def on_def(token, params, body)
10
+ DefnExpression.new(token.value, params, body, extract_src_by_token(pop_keyword('def')))
11
+ end
12
+
13
+ def on_method_add_block(exp, block)
14
+ exp.block = block
15
+ exp.adjust_src(block.src_extract)
16
+ exp
17
+ end
18
+
19
+ def on_method_add_arg(exp, args)
20
+ if args
21
+ exp.args = args
22
+ exp.adjust_src(extract_src_by_tokens(exp, args))
23
+ end
24
+ exp
25
+ end
26
+
27
+ def on_arg_paren(args)
28
+ args ||= ArgumentsExpression.new
29
+ args.src = extract_src_by_token(@parens_begin.pop)
30
+ args
31
+ end
32
+
33
+ def on_brace_block(params, body)
34
+ BlockExpression.new(body, params, extract_src_by_token(@lbrace.pop))
35
+ end
36
+
37
+ def on_do_block(params, body)
38
+ BlockExpression.new(body, params, extract_src_by_token(pop_keyword('do')))
39
+ end
40
+
41
+ def on_lambda(args, body)
42
+ LambdaExpression.new(args, body, extract_src_by_token(@lambda.pop))
43
+ end
44
+
45
+ def on_blockarg(token)
46
+ token.column -= 1
47
+ BlockParamExpression.new(token, extract_src_by_tokens(token))
48
+ end
49
+
50
+ def on_tlambda(*)
51
+ super.tap do |token|
52
+ @lambda << token
53
+ end
54
+ end
55
+
56
+ end
57
+
58
+ end