зеркало из https://github.com/github/ruby.git
* test/ripper/test_scanner_events.rb: tokens must be reordered.
* ext/ripper/lib/ripper/tokenizer.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@6937 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
b2a700f13e
Коммит
2c750e368d
|
@ -1,3 +1,9 @@
|
||||||
|
Mon Sep 20 17:38:43 2004 Minero Aoki <aamine@loveruby.net>
|
||||||
|
|
||||||
|
* test/ripper/test_scanner_events.rb: tokens must be reordered.
|
||||||
|
|
||||||
|
* ext/ripper/lib/ripper/tokenizer.rb: ditto.
|
||||||
|
|
||||||
Mon Sep 20 16:58:16 2004 Minero Aoki <aamine@loveruby.net>
|
Mon Sep 20 16:58:16 2004 Minero Aoki <aamine@loveruby.net>
|
||||||
|
|
||||||
* parse.y [ripper]: do not delay dispatching.
|
* parse.y [ripper]: do not delay dispatching.
|
||||||
|
|
|
@ -16,22 +16,69 @@ class Ripper
|
||||||
Tokenizer.tokenize(str)
|
Tokenizer.tokenize(str)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
class Tokenizer < ::Ripper
|
class Tokenizer < ::Ripper
|
||||||
def Tokenizer.tokenize(str)
|
|
||||||
new(str).tokenize
|
def Tokenizer.tokenize(str, filename = '-', lineno = 1)
|
||||||
|
new(str, filename, lineno).tokenize
|
||||||
|
end
|
||||||
|
|
||||||
|
def initialize(src, filename = '-', lineno = 1)
|
||||||
|
@src = src
|
||||||
|
@__filename = filename
|
||||||
|
@__linestart = lineno
|
||||||
|
@__line = nil
|
||||||
|
@__col = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
def filename
|
||||||
|
@__filename
|
||||||
|
end
|
||||||
|
|
||||||
|
def lineno
|
||||||
|
@__line
|
||||||
|
end
|
||||||
|
|
||||||
|
def column
|
||||||
|
@__col
|
||||||
end
|
end
|
||||||
|
|
||||||
def tokenize
|
def tokenize
|
||||||
@tokens = []
|
_exec_tokenizer().map {|pos, event, tok| tok }
|
||||||
parse
|
end
|
||||||
@tokens.sort_by {|tok, pos| pos }.map {|tok,| tok }
|
|
||||||
|
def parse
|
||||||
|
_exec_tokenizer().each do |pos, event, tok|
|
||||||
|
@__line, @__col = *pos
|
||||||
|
on__scan(event, tok)
|
||||||
|
__send__(event, tok)
|
||||||
|
end
|
||||||
|
data
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def on__scan(type, tok)
|
def _exec_tokenizer
|
||||||
@tokens.push [tok, [lineno(),column()]]
|
TokenSorter.new(@src, @__filename, @__linestart).parse
|
||||||
end
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
class TokenSorter < ::Ripper #:nodoc: internal use only
|
||||||
|
|
||||||
|
def parse
|
||||||
|
@data = []
|
||||||
|
super
|
||||||
|
@data.sort_by {|pos, event, tok| pos }
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
|
||||||
|
def on__scan(event, tok)
|
||||||
|
@data.push [[lineno(),column()], event, tok]
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,11 +20,11 @@ class TestRipper_ScannerEvents < Test::Unit::TestCase
|
||||||
def parse
|
def parse
|
||||||
@tokens = []
|
@tokens = []
|
||||||
super
|
super
|
||||||
@tokens
|
@tokens.sort_by {|tok,pos| pos }.map {|tok,| tok }
|
||||||
end
|
end
|
||||||
|
|
||||||
def on__scan(type, tok)
|
def on__scan(type, tok)
|
||||||
@tokens.push tok if !@target or type == @target
|
@tokens.push [tok,[lineno(),column()]] if !@target or type == @target
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -80,7 +80,8 @@ class TestRipper_ScannerEvents < Test::Unit::TestCase
|
||||||
def validate_location(src)
|
def validate_location(src)
|
||||||
data = PosInfo.new(src).parse
|
data = PosInfo.new(src).parse
|
||||||
buf = ''
|
buf = ''
|
||||||
data.each do |tok, type, line, col|
|
data.sort_by {|tok, type, line, col| [line,col] }\
|
||||||
|
.each do |tok, type, line, col|
|
||||||
assert_equal buf.count("\n") + 1, line,
|
assert_equal buf.count("\n") + 1, line,
|
||||||
"wrong lineno: #{tok.inspect} (#{type}) [#{line}:#{col}]"
|
"wrong lineno: #{tok.inspect} (#{type}) [#{line}:#{col}]"
|
||||||
assert_equal buf.sub(/\A.*\n/m, '').size, col,
|
assert_equal buf.sub(/\A.*\n/m, '').size, col,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче