Class: Iro::Ruby::Parser
- Inherits:
-
Ripper::SexpBuilderPP
- Object
- Ripper::SexpBuilderPP
- Iro::Ruby::Parser
- Defined in:
- lib/iro/ruby/parser.rb
Constant Summary collapse
- EVENT_NAME_TO_HIGHLIGT_NAME =
{ tstring_content: 'String', CHAR: 'Character', int: 'Number', float: 'Float', comment: 'Comment', embdoc: 'Comment', embdoc_beg: 'Comment', embdoc_end: 'Comment', const: 'Type', regexp_beg: 'Delimiter', regexp_end: 'Delimiter', heredoc_beg: 'Delimiter', heredoc_end: 'Delimiter', tstring_beg: 'Delimiter', tstring_end: 'Delimiter', embexpr_beg: 'Delimiter', embexpr_end: 'Delimiter', backtick: 'Delimiter', symbeg: 'rubySymbolDelimiter', ivar: 'rubyInstanceVariable', cvar: 'rubyClassVariable', gvar: 'rubyGlobalVariable', }.freeze
Instance Attribute Summary collapse
-
#tokens ⇒ Object
readonly
Returns the value of attribute tokens.
Class Method Summary collapse
Instance Method Summary collapse
-
#initialize ⇒ Parser
constructor
A new instance of Parser.
- #kw_group(str) ⇒ Object
- #on_def(name, params, body) ⇒ Object
- #on_defs(recv, period, name, params, body) ⇒ Object
- #on_kw(str) ⇒ Object
-
#on_label(str) ⇒ Object
foo: bar ^^^ rubySymbol ^ no highlight.
- #on_symbol(node) ⇒ Object
- #on_var_ref(name) ⇒ Object
-
#register_scanner_event(group, event) ⇒ Object
TODO: Maybe multiline support is needed.
- #register_token(group, token) ⇒ Object
- #traverse(node) ⇒ Object
- #unhighlight!(scanner_event) ⇒ Object
Constructor Details
#initialize ⇒ Parser
Returns a new instance of Parser.
38 39 40 41 |
# File 'lib/iro/ruby/parser.rb', line 38 def initialize(*) super @tokens = {} end |
Instance Attribute Details
#tokens ⇒ Object (readonly)
Returns the value of attribute tokens.
36 37 38 |
# File 'lib/iro/ruby/parser.rb', line 36 def tokens @tokens end |
Class Method Details
.tokens(source) ⇒ Object
139 140 141 142 143 144 |
# File 'lib/iro/ruby/parser.rb', line 139 def self.tokens(source) parser = self.new(source) sexp = parser.parse parser.traverse(sexp) unless parser.error? parser.tokens end |
Instance Method Details
#kw_group(str) ⇒ Object
93 94 95 96 97 98 |
# File 'lib/iro/ruby/parser.rb', line 93 def kw_group(str) { 'def' => 'rubyDefine', 'alias' => 'rubyDefine', }[str] || 'Keyword' end |
#on_def(name, params, body) ⇒ Object
100 101 102 103 104 |
# File 'lib/iro/ruby/parser.rb', line 100 def on_def(name, params, body) super.tap do register_scanner_event 'rubyFunction', name end end |
#on_defs(recv, period, name, params, body) ⇒ Object
106 107 108 109 110 |
# File 'lib/iro/ruby/parser.rb', line 106 def on_defs(recv, period, name, params, body) super.tap do register_scanner_event 'rubyFunction', name end end |
#on_kw(str) ⇒ Object
79 80 81 82 83 |
# File 'lib/iro/ruby/parser.rb', line 79 def on_kw(str) group = kw_group(str) register_token group, [lineno, column+1, str.size] super end |
#on_label(str) ⇒ Object
foo: bar ^^^ rubySymbol
^ no highlight
88 89 90 91 |
# File 'lib/iro/ruby/parser.rb', line 88 def on_label(str) register_token 'rubySymbol', [lineno, column+1, str.size-1] super end |
#on_symbol(node) ⇒ Object
112 113 114 115 116 117 |
# File 'lib/iro/ruby/parser.rb', line 112 def on_symbol(node) super.tap do unhighlight! node if node.gvar_type? || node.ivar_type? || node.cvar_type? register_scanner_event 'rubySymbol', node end end |
#on_var_ref(name) ⇒ Object
119 120 121 122 123 124 125 |
# File 'lib/iro/ruby/parser.rb', line 119 def on_var_ref(name) super.tap do if name.ident_type? register_scanner_event 'rubyLocalVariable', name end end end |
#register_scanner_event(group, event) ⇒ Object
TODO: Maybe multiline support is needed.
49 50 51 52 |
# File 'lib/iro/ruby/parser.rb', line 49 def register_scanner_event(group, event) pos = event.position register_token group, [pos[0], pos[1]+1, event.content.size] end |
#register_token(group, token) ⇒ Object
43 44 45 46 |
# File 'lib/iro/ruby/parser.rb', line 43 def register_token(group, token) @tokens[group] ||= [] @tokens[group] << token end |
#traverse(node) ⇒ Object
127 128 129 130 131 132 133 134 135 136 137 |
# File 'lib/iro/ruby/parser.rb', line 127 def traverse(node) if node.kw_type? unhighlight!(node) end return if node.scanner_event? node.children.each do |child| traverse(child) if child.is_a?(Array) end end |
#unhighlight!(scanner_event) ⇒ Object
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/iro/ruby/parser.rb', line 54 def unhighlight!(scanner_event) t = scanner_event.type[1..-1].to_sym group = EVENT_NAME_TO_HIGHLIGT_NAME[t] || (scanner_event.kw_type? && kw_group(scanner_event.content)) raise 'bug' unless group t = scanner_event.position + [scanner_event.content.size] t[1] += 1 @tokens[group].reject! { |ev| ev == t } end |