code-ruby-parser 0.1.8 → 0.2.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 (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