File: binary.rb

package info (click to toggle)
ruby-unparser 0.6.13-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 936 kB
  • sloc: ruby: 7,691; sh: 6; makefile: 4
file content (99 lines) | stat: -rw-r--r-- 1,792 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# frozen_string_literal: true

module Unparser
  module Writer
    class Binary
      include Writer, Adamantium

      children :left, :right

      OPERATOR_TOKENS =
        {
          and: '&&',
          or:  '||'
        }.freeze

      KEYWORD_TOKENS =
        {
          and: 'and',
          or:  'or'
        }.freeze

      KEYWORD_SYMBOLS =
        {
          and: :kAND,
          or:  :kOR
        }.freeze

      OPERATOR_SYMBOLS =
        {
          and: :tANDOP,
          or:  :tOROP
        }.freeze

      MAP =
        {
          kAND:   'and',
          kOR:    'or',
          tOROP:  '||',
          tANDOP: '&&'
        }.freeze

      NEED_KEYWORD = %i[return break next].freeze

      private_constant(*constants(false))

      def emit_operator
        emit_with(OPERATOR_TOKENS)
      end

      def symbol_name
        true
      end

      def dispatch
        left_emitter.write_to_buffer
        write(' ', MAP.fetch(effective_symbol), ' ')
        visit(right)
      end

    private

      def effective_symbol
        if NEED_KEYWORD.include?(right.type) || NEED_KEYWORD.include?(left.type)
          return keyword_symbol
        end

        unless left_emitter.symbol_name
          return operator_symbol
        end

        keyword_symbol
      end

      def emit_with(map)
        visit(left)
        write(' ', map.fetch(node.type), ' ')
        visit(right)
      end

      def keyword_symbol
        KEYWORD_SYMBOLS.fetch(node.type)
      end

      def operator_symbol
        OPERATOR_SYMBOLS.fetch(node.type)
      end

      def left_emitter
        emitter(left)
      end
      memoize :left_emitter

      def right_emitter
        emitter(right)
      end
      memoize :right_emitter
    end # Binary
  end # Writer
end # Unparser