code-ruby-parser 0.1.8 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/code-ruby-parser.gemspec +3 -1
  3. data/lib/code-ruby-parser.rb +1 -7
  4. data/lib/template-ruby-parser.rb +1 -7
  5. data/template-ruby-parser.gemspec +3 -1
  6. metadata +18 -137
  7. data/.overcommit.yml +0 -4
  8. data/CHANGELOG.md +0 -35
  9. data/Gemfile +0 -5
  10. data/Gemfile.lock +0 -32
  11. data/bin/code-parser +0 -27
  12. data/bin/deploy +0 -16
  13. data/bin/format +0 -3
  14. data/bin/parse-docs +0 -6
  15. data/bin/template-parser +0 -27
  16. data/docs/class.code +0 -9
  17. data/docs/meetup.code +0 -14
  18. data/docs/precedence.code +0 -1
  19. data/docs/precedence.template +0 -35
  20. data/docs/rain.code +0 -23
  21. data/docs/slack.code +0 -17
  22. data/docs/stripe.code +0 -7
  23. data/docs/twitter.code +0 -7
  24. data/lib/code/parser/addition.rb +0 -13
  25. data/lib/code/parser/and_operator.rb +0 -13
  26. data/lib/code/parser/bitwise_and.rb +0 -13
  27. data/lib/code/parser/bitwise_or.rb +0 -13
  28. data/lib/code/parser/boolean.rb +0 -13
  29. data/lib/code/parser/call.rb +0 -183
  30. data/lib/code/parser/chained_call.rb +0 -41
  31. data/lib/code/parser/class.rb +0 -55
  32. data/lib/code/parser/code.rb +0 -20
  33. data/lib/code/parser/comments.rb +0 -46
  34. data/lib/code/parser/dictionnary.rb +0 -52
  35. data/lib/code/parser/equal.rb +0 -68
  36. data/lib/code/parser/equality.rb +0 -20
  37. data/lib/code/parser/error/syntax_error.rb +0 -36
  38. data/lib/code/parser/error.rb +0 -6
  39. data/lib/code/parser/function.rb +0 -118
  40. data/lib/code/parser/greater_than.rb +0 -13
  41. data/lib/code/parser/group.rb +0 -15
  42. data/lib/code/parser/if.rb +0 -81
  43. data/lib/code/parser/if_modifier.rb +0 -39
  44. data/lib/code/parser/list.rb +0 -20
  45. data/lib/code/parser/multiplication.rb +0 -13
  46. data/lib/code/parser/name.rb +0 -14
  47. data/lib/code/parser/negation.rb +0 -18
  48. data/lib/code/parser/not_keyword.rb +0 -26
  49. data/lib/code/parser/nothing.rb +0 -13
  50. data/lib/code/parser/number.rb +0 -57
  51. data/lib/code/parser/operation.rb +0 -65
  52. data/lib/code/parser/or_keyword.rb +0 -13
  53. data/lib/code/parser/or_operator.rb +0 -13
  54. data/lib/code/parser/power.rb +0 -33
  55. data/lib/code/parser/range.rb +0 -13
  56. data/lib/code/parser/rescue.rb +0 -38
  57. data/lib/code/parser/shift.rb +0 -13
  58. data/lib/code/parser/splat.rb +0 -35
  59. data/lib/code/parser/statement.rb +0 -9
  60. data/lib/code/parser/string.rb +0 -62
  61. data/lib/code/parser/ternary.rb +0 -73
  62. data/lib/code/parser/unary_minus.rb +0 -23
  63. data/lib/code/parser/while.rb +0 -36
  64. data/lib/code/parser.rb +0 -238
  65. data/lib/code.rb +0 -2
  66. data/lib/template/parser.rb +0 -32
  67. data/lib/template.rb +0 -2
  68. data/spec/code/parser/addition_spec.rb +0 -26
  69. data/spec/code/parser/and_operator_spec.rb +0 -26
  70. data/spec/code/parser/bitwise_and_spec.rb +0 -26
  71. data/spec/code/parser/bitwise_or_spec.rb +0 -26
  72. data/spec/code/parser/boolean_spec.rb +0 -13
  73. data/spec/code/parser/call_spec.rb +0 -52
  74. data/spec/code/parser/chained_call_spec.rb +0 -33
  75. data/spec/code/parser/class_spec.rb +0 -32
  76. data/spec/code/parser/code_spec.rb +0 -13
  77. data/spec/code/parser/dictionnary_spec.rb +0 -40
  78. data/spec/code/parser/equal_spec.rb +0 -42
  79. data/spec/code/parser/equality_spec.rb +0 -26
  80. data/spec/code/parser/function_spec.rb +0 -43
  81. data/spec/code/parser/greater_than_spec.rb +0 -26
  82. data/spec/code/parser/group_spec.rb +0 -13
  83. data/spec/code/parser/if_modifier_spec.rb +0 -26
  84. data/spec/code/parser/if_spec.rb +0 -39
  85. data/spec/code/parser/list_spec.rb +0 -27
  86. data/spec/code/parser/multiplication_spec.rb +0 -26
  87. data/spec/code/parser/negation_spec.rb +0 -13
  88. data/spec/code/parser/not_keyword_spec.rb +0 -21
  89. data/spec/code/parser/nothing_spec.rb +0 -20
  90. data/spec/code/parser/number_spec.rb +0 -24
  91. data/spec/code/parser/or_keyword_spec.rb +0 -26
  92. data/spec/code/parser/or_operator_spec.rb +0 -26
  93. data/spec/code/parser/power_spec.rb +0 -21
  94. data/spec/code/parser/range_spec.rb +0 -21
  95. data/spec/code/parser/rescue_spec.rb +0 -26
  96. data/spec/code/parser/shift_spec.rb +0 -26
  97. data/spec/code/parser/string_spec.rb +0 -28
  98. data/spec/code/parser/ternary_spec.rb +0 -26
  99. data/spec/code/parser/unary_minus_spec.rb +0 -21
  100. data/spec/code/parser/while_spec.rb +0 -32
  101. data/spec/code/parser_spec.rb +0 -13
  102. data/spec/spec_helper.rb +0 -6
  103. data/spec/template/parser_spec.rb +0 -13
@@ -1,81 +0,0 @@
1
- class Code
2
- class Parser
3
- class If < ::Code::Parser
4
- def parse
5
- if first_operator = match([IF_KEYWORD, UNLESS_KEYWORD])
6
- previous_cursor = cursor
7
- first_comments = parse_comments
8
- first_condition = parse_subclass(::Code::Parser::If)
9
-
10
- if first_condition
11
- first_body = parse_code
12
-
13
- others = []
14
-
15
- while (other = parse_else) || (other = parse_elsif)
16
- others << other
17
- end
18
-
19
- others = nil if others.empty?
20
-
21
- match(END_KEYWORD)
22
-
23
- {
24
- if: {
25
- first_operator: first_operator,
26
- first_comments: first_comments,
27
- first_condition: first_condition,
28
- first_body: first_body,
29
- others: others
30
- }.compact
31
- }
32
- else
33
- @cursor = previous_cursor
34
- buffer!
35
- parse_subclass(::Code::Parser::IfModifier)
36
- end
37
- else
38
- parse_subclass(::Code::Parser::IfModifier)
39
- end
40
- end
41
-
42
- private
43
-
44
- def parse_else
45
- return unless match(ELSE_KEYWORD)
46
- comments_before = parse_comments
47
-
48
- operator = match([IF_KEYWORD, UNLESS_KEYWORD]) || ELSE_KEYWORD
49
-
50
- comments_after = parse_comments
51
-
52
- condition = parse_subclass(::Code::Parser::If)
53
-
54
- body = parse_code
55
-
56
- {
57
- operator: operator,
58
- comments_before: comments_before,
59
- comments_after: comments_after,
60
- condition: condition,
61
- body: body
62
- }.compact
63
- end
64
-
65
- def parse_elsif
66
- return unless operator = match([ELSIF_KEYWORD, ELSUNLESS_KEYWORD])
67
-
68
- comments = parse_comments
69
- condition = parse_subclass(::Code::Parser::If)
70
- body = parse_code
71
-
72
- {
73
- operator: operator,
74
- comments: comments,
75
- condition: condition,
76
- body: body
77
- }.compact
78
- end
79
- end
80
- end
81
- end
@@ -1,39 +0,0 @@
1
- class Code
2
- class Parser
3
- class IfModifier < ::Code::Parser
4
- def parse
5
- left = parse_subclass(::Code::Parser::OrKeyword)
6
-
7
- previous_cursor = cursor
8
-
9
- comments_before = parse_comments(whitespace: [SPACE])
10
-
11
- if left && (operator = match(IF_KEYWORD)) ||
12
- (operator = match(UNLESS_KEYWORD))
13
- comments_after = parse_comments
14
- right = parse_subclass(::Code::Parser::IfModifier)
15
-
16
- if right
17
- {
18
- if_modifier: {
19
- left: left,
20
- right: right,
21
- operator: operator,
22
- comments_before: comments_before,
23
- comments_after: comments_after
24
- }.compact
25
- }
26
- else
27
- @cursor = previous_cursor
28
- buffer!
29
- left
30
- end
31
- else
32
- @cursor = previous_cursor
33
- buffer!
34
- left
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,20 +0,0 @@
1
- class Code
2
- class Parser
3
- class List < ::Code::Parser
4
- def parse
5
- if match(OPENING_SQUARE_BRACKET)
6
- list = []
7
-
8
- list << parse_code
9
- list << parse_code while match(COMMA) && !end_of_input?
10
-
11
- match(CLOSING_SQUARE_BRACKET)
12
-
13
- { list: list.reject(&:empty?) }
14
- else
15
- parse_subclass(::Code::Parser::String)
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- class Code
2
- class Parser
3
- class Multiplication < ::Code::Parser
4
- def parse
5
- parse_subclass(
6
- ::Code::Parser::Operation,
7
- operators: [ASTERISK, SLASH, PERCENT],
8
- subclass: ::Code::Parser::UnaryMinus
9
- )
10
- end
11
- end
12
- end
13
- end
@@ -1,14 +0,0 @@
1
- class Code
2
- class Parser
3
- class Name < ::Code::Parser
4
- def parse
5
- return if end_of_input?
6
- return if next?(SPECIAL)
7
- return if next?(KEYWORDS)
8
- consume while !next?(SPECIAL) && !end_of_input?
9
- match(QUESTION_MARK) || match(EXCLAMATION_POINT)
10
- buffer!
11
- end
12
- end
13
- end
14
- end
@@ -1,18 +0,0 @@
1
- class Code
2
- class Parser
3
- class Negation < ::Code::Parser
4
- def parse
5
- if operator = match([EXCLAMATION_POINT, TILDE, PLUS])
6
- {
7
- negation: {
8
- operator: operator,
9
- statement: parse_subclass(::Code::Parser::Negation)
10
- }
11
- }
12
- else
13
- parse_subclass(::Code::Parser::Splat)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,26 +0,0 @@
1
- class Code
2
- class Parser
3
- class NotKeyword < ::Code::Parser
4
- def parse
5
- previous_cursor = cursor
6
-
7
- if match(NOT_KEYWORD)
8
- buffer!
9
- consume while next?(WHITESPACE)
10
- comments = parse_comments
11
- right = parse_subclass(::Code::Parser::NotKeyword)
12
-
13
- if right && (comments || buffer?)
14
- { not: { right: right, comments: comments }.compact }
15
- else
16
- @cursor = previous_cursor
17
- buffer!
18
- parse_subclass(::Code::Parser::Equal)
19
- end
20
- else
21
- parse_subclass(::Code::Parser::Equal)
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,13 +0,0 @@
1
- class Code
2
- class Parser
3
- class Nothing < ::Code::Parser
4
- def parse
5
- if match(NOTHING_KEYWORDS)
6
- { nothing: buffer }
7
- else
8
- parse_subclass(::Code::Parser::Group)
9
- end
10
- end
11
- end
12
- end
13
- end
@@ -1,57 +0,0 @@
1
- class Code
2
- class Parser
3
- class Number < ::Code::Parser
4
- def parse
5
- if match(DIGITS)
6
- if match(X)
7
- parse_base(16)
8
- elsif match(O)
9
- parse_base(8)
10
- elsif match(B)
11
- parse_base(2)
12
- else
13
- parse_number
14
- end
15
- else
16
- parse_subclass(::Code::Parser::Boolean)
17
- end
18
- end
19
-
20
- def parse_base(base)
21
- buffer!
22
- consume while (next?(DIGITS) || next?(UNDERSCORE)) && !end_of_input?
23
-
24
- { integer: buffer.gsub(UNDERSCORE, EMPTY_STRING).to_i(base) }
25
- end
26
-
27
- def parse_number
28
- consume while (next?(DIGITS) || next?(UNDERSCORE)) && !end_of_input?
29
-
30
- if next?(DOT) && next_next?(DIGITS)
31
- consume
32
- consume while (next?(DIGITS) || next?(UNDERSCORE)) && !end_of_input?
33
-
34
- decimal = buffer!.gsub(UNDERSCORE, EMPTY_STRING)
35
-
36
- if match(E)
37
- buffer!
38
- exponent = parse_number
39
- { decimal: { value: decimal, exponent: exponent } }
40
- else
41
- { decimal: decimal }
42
- end
43
- else
44
- integer = buffer!.gsub(UNDERSCORE, EMPTY_STRING).to_i
45
-
46
- if match(E)
47
- buffer!
48
- exponent = parse_number
49
- { integer: { value: integer, exponent: exponent } }
50
- else
51
- { integer: integer }
52
- end
53
- end
54
- end
55
- end
56
- end
57
- end
@@ -1,65 +0,0 @@
1
- class Code
2
- class Parser
3
- class Operation < ::Code::Parser
4
- def initialize(input, operators:, subclass:, **kargs)
5
- super(input, **kargs)
6
-
7
- @operators = operators
8
- @subclass = subclass
9
- end
10
-
11
- def parse
12
- previous_cursor = cursor
13
- left = parse_subclass(subclass)
14
- if left
15
- previous_cursor = cursor
16
- comments = parse_comments
17
- right = []
18
-
19
- while operator = match(operators)
20
- comments_before = parse_comments
21
- statement = parse_subclass(subclass)
22
- comments_after = parse_comments
23
-
24
- if statement
25
- right << {
26
- statement: statement,
27
- operator: operator,
28
- comments_before: comments_before,
29
- comments_after: comments_after
30
- }.compact
31
- else
32
- @cursor = previous_cursor
33
- buffer!
34
- break
35
- end
36
- end
37
-
38
- if right.empty?
39
- @cursor = previous_cursor
40
- buffer!
41
- left
42
- else
43
- right[-1].delete(:comments_after)
44
-
45
- {
46
- operation: {
47
- left: left,
48
- right: right,
49
- comments: comments
50
- }.compact
51
- }
52
- end
53
- else
54
- @cursor = previous_cursor
55
- buffer!
56
- return
57
- end
58
- end
59
-
60
- private
61
-
62
- attr_reader :operators, :subclass
63
- end
64
- end
65
- end
@@ -1,13 +0,0 @@
1
- class Code
2
- class Parser
3
- class OrKeyword < ::Code::Parser
4
- def parse
5
- parse_subclass(
6
- ::Code::Parser::Operation,
7
- operators: [AND_KEYWORD, OR_KEYWORD],
8
- subclass: ::Code::Parser::NotKeyword
9
- )
10
- end
11
- end
12
- end
13
- end
@@ -1,13 +0,0 @@
1
- class Code
2
- class Parser
3
- class OrOperator < ::Code::Parser
4
- def parse
5
- parse_subclass(
6
- ::Code::Parser::Operation,
7
- operators: [PIPE + PIPE],
8
- subclass: ::Code::Parser::AndOperator
9
- )
10
- end
11
- end
12
- end
13
- end
@@ -1,33 +0,0 @@
1
- class Code
2
- class Parser
3
- class Power < ::Code::Parser
4
- def parse
5
- left = parse_subclass(::Code::Parser::Negation)
6
- previous_cursor = cursor
7
- comments_before = parse_comments
8
- if match(ASTERISK + ASTERISK)
9
- comments_after = parse_comments
10
- right = parse_subclass(::Code::Parser::Power)
11
- if right
12
- {
13
- power: {
14
- left: left,
15
- right: right,
16
- comments_before: comments_before,
17
- comments_after: comments_after
18
- }.compact
19
- }
20
- else
21
- @cursor = previous_cursor
22
- buffer!
23
- left
24
- end
25
- else
26
- @cursor = previous_cursor
27
- buffer!
28
- left
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,13 +0,0 @@
1
- class Code
2
- class Parser
3
- class Range < ::Code::Parser
4
- def parse
5
- parse_subclass(
6
- ::Code::Parser::Operation,
7
- operators: [DOT + DOT + DOT, DOT + DOT],
8
- subclass: ::Code::Parser::OrOperator
9
- )
10
- end
11
- end
12
- end
13
- end
@@ -1,38 +0,0 @@
1
- class Code
2
- class Parser
3
- class Rescue < ::Code::Parser
4
- def parse
5
- left = parse_subclass(::Code::Parser::Ternary)
6
-
7
- previous_cursor = cursor
8
-
9
- comments_before = parse_comments
10
-
11
- if match(RESCUE_KEYWORD)
12
- previous_cursor = cursor
13
- comments_after = parse_comments
14
- right = parse_subclass(::Code::Parser::Rescue)
15
-
16
- if right
17
- {
18
- rescue: {
19
- left: left,
20
- right: right,
21
- comments_before: comments_before,
22
- comments_after: comments_after
23
- }.compact
24
- }
25
- else
26
- @cursor = previous_cursor
27
- buffer!
28
- { rescue: { left: left, comments_before: comments_before }.compact }
29
- end
30
- else
31
- @cursor = previous_cursor
32
- buffer!
33
- left
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,13 +0,0 @@
1
- class Code
2
- class Parser
3
- class Shift < ::Code::Parser
4
- def parse
5
- parse_subclass(
6
- ::Code::Parser::Operation,
7
- operators: [GREATER + GREATER, LESSER + LESSER],
8
- subclass: ::Code::Parser::Addition
9
- )
10
- end
11
- end
12
- end
13
- end
@@ -1,35 +0,0 @@
1
- class Code
2
- class Parser
3
- class Splat < ::Code::Parser
4
- def parse
5
- previous_cursor = cursor
6
-
7
- if operator = match([AMPERSAND, ASTERISK + ASTERISK, ASTERISK])
8
- comments = parse_comments
9
- right = parse_next
10
- if right
11
- {
12
- splat: {
13
- right: right,
14
- operator: operator,
15
- comments: comments
16
- }.compact
17
- }
18
- else
19
- @cursor = previous_cursor
20
- buffer!
21
- parse_next
22
- end
23
- else
24
- parse_next
25
- end
26
- end
27
-
28
- private
29
-
30
- def parse_next
31
- parse_subclass(::Code::Parser::Function)
32
- end
33
- end
34
- end
35
- end
@@ -1,9 +0,0 @@
1
- class Code
2
- class Parser
3
- class Statement < ::Code::Parser
4
- def parse
5
- parse_subclass(::Code::Parser::Class)
6
- end
7
- end
8
- end
9
- end
@@ -1,62 +0,0 @@
1
- class Code
2
- class Parser
3
- class String < ::Code::Parser
4
- def parse
5
- if match(SINGLE_QUOTE)
6
- parse_string(SINGLE_QUOTE)
7
- elsif match(DOUBLE_QUOTE)
8
- parse_string(DOUBLE_QUOTE)
9
- elsif match(COLON) && !next?(SPECIAL)
10
- buffer!
11
- consume while !next?(SPECIAL) && !end_of_input?
12
- match(QUESTION_MARK) || match(EXCLAMATION_POINT)
13
- { string: buffer }
14
- else
15
- parse_subclass(::Code::Parser::Number)
16
- end
17
- end
18
-
19
- private
20
-
21
- def parse_string(quote)
22
- buffer!
23
- output = []
24
-
25
- while !next?(quote) && !end_of_input?
26
- c = consume
27
-
28
- if c == BACKSLASH
29
- match(OPENING_CURLY_BRACKET) || match(quote)
30
- elsif c == OPENING_CURLY_BRACKET
31
- output << { text: escape_string(buffer![..-2]) } if buffer?
32
-
33
- output << { code: parse_code }
34
-
35
- match(CLOSING_CURLY_BRACKET)
36
- buffer!
37
- end
38
- end
39
-
40
- output << { text: escape_string(buffer) } if buffer?
41
-
42
- match(quote)
43
-
44
- if output.empty?
45
- { string: EMPTY_STRING }
46
- elsif output.one? && output.first.key?(:text)
47
- { string: output.first[:text] }
48
- else
49
- { string: output }
50
- end
51
- end
52
-
53
- def escape_string(string)
54
- string
55
- .gsub(SPECIAL_NEWLINE, SPECIAL_NEWLINE_ESCAPED)
56
- .gsub(BACKSLASH + OPENING_CURLY_BRACKET, OPENING_CURLY_BRACKET)
57
- .gsub(BACKSLASH + SINGLE_QUOTE, SINGLE_QUOTE)
58
- .gsub(BACKSLASH + DOUBLE_QUOTE, DOUBLE_QUOTE)
59
- end
60
- end
61
- end
62
- end
@@ -1,73 +0,0 @@
1
- class Code
2
- class Parser
3
- class Ternary < ::Code::Parser
4
- def parse
5
- left = parse_subclass(::Code::Parser::Range)
6
-
7
- previous_cursor = cursor
8
- return left if !match(WHITESPACE) && !(first_comments = parse_comments)
9
- first_comments ||= parse_comments
10
-
11
- if match(QUESTION_MARK)
12
- second_comments = parse_comments
13
-
14
- middle = parse_subclass(::Code::Parser::Ternary)
15
-
16
- if middle
17
- previous_cursor = cursor
18
- third_comments = parse_comments
19
-
20
- if match(COLON)
21
- fourth_comments = parse_comments
22
- right = parse_subclass(::Code::Parser::Ternary)
23
-
24
- if right
25
- {
26
- ternary: {
27
- left: left,
28
- middle: middle,
29
- right: right,
30
- first_comments: first_comments,
31
- second_comments: second_comments,
32
- third_comments: third_comments,
33
- fourth_comments: fourth_comments
34
- }.compact
35
- }
36
- else
37
- @cursor = previous_cursor
38
- buffer!
39
- {
40
- ternary: {
41
- left: left,
42
- middle: middle,
43
- first_comments: first_comments,
44
- second_comments: second_comments
45
- }.compact
46
- }
47
- end
48
- else
49
- @cursor = previous_cursor
50
- buffer!
51
- {
52
- ternary: {
53
- left: left,
54
- middle: middle,
55
- first_comments: first_comments,
56
- second_comments: second_comments
57
- }.compact
58
- }
59
- end
60
- else
61
- @cursor = previous_cursor
62
- buffer!
63
- left
64
- end
65
- else
66
- @cursor = previous_cursor
67
- buffer!
68
- left
69
- end
70
- end
71
- end
72
- end
73
- end
@@ -1,23 +0,0 @@
1
- class Code
2
- class Parser
3
- class UnaryMinus < ::Code::Parser
4
- def parse
5
- if match(MINUS)
6
- previous_cursor = cursor
7
- comments = parse_comments
8
- right = parse_subclass(::Code::Parser::UnaryMinus)
9
-
10
- if right
11
- { unary_minus: { right: right, comments: comments }.compact }
12
- else
13
- @cursor = previous_cursor
14
- buffer!
15
- parse_subclass(::Code::Parser::Power)
16
- end
17
- else
18
- parse_subclass(::Code::Parser::Power)
19
- end
20
- end
21
- end
22
- end
23
- end