summaryrefslogtreecommitdiff
path: root/ext/ripper/lib/ripper/filter.rb
blob: d1c7c4a45e7d12e73ceec54831ce5a0be9658753 (plain)
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
#
# ripper/filter.rb
#
# Copyright (C) 2004 Minero Aoki
#
# This program is free software.
# You can distribute and/or modify this program under the Ruby License.
# For details of Ruby License, see ruby/COPYING.
#

require 'ripper/core'

class Ripper

  # This class handles only scanner events,
  # and they are dispatched in the `right' order (same with input).
  class Filter

    def initialize(src, filename = '-', lineno = 1)
      @__parser = Tokenizer.new(src, filename, lineno)
      @__line = nil
      @__col = nil
    end

    # The file name of the input.
    def filename
      @__parser.filename
    end

    # The line number of the current token.
    # This value starts from 1.
    # This method is valid only in event handlers.
    def lineno
      @__line
    end

    # The column number of the current token.
    # This value starts from 0.
    # This method is valid only in event handlers.
    def column
      @__col
    end

    # Starts parsing.  _init_ is a data accumulator.
    # It is passed to the next event handler (as of Enumerable#inject).
    def parse(init)
      data = init
      @__parser.parse.each do |pos, event, tok|
        @__line, @__col = *pos
        data = if respond_to?(event, true)
               then __send__(event, tok, data)
               else on_default(event, tok, data)
               end
      end
      data
    end

    private

    # This method is called when some event handler have not defined.
    # _event_ is :on_XXX, _token_ is scanned token, _data_ is a data
    # accumulator.  The return value of this method is passed to the
    # next event handler (as of Enumerable#inject).
    def on_default(event, token, data)
      data
    end

  end

end