/
builder.rb
85 lines (80 loc) · 2.5 KB
/
builder.rb
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
# frozen_string_literal: true
module RuboCop
module AST
# `RuboCop::AST::Builder` is an AST builder that is utilized to let `Parser`
# generate ASTs with {RuboCop::AST::Node}.
#
# @example
# buffer = Parser::Source::Buffer.new('(string)')
# buffer.source = 'puts :foo'
#
# builder = RuboCop::AST::Builder.new
# require 'parser/ruby25'
# parser = Parser::Ruby25.new(builder)
# root_node = parser.parse(buffer)
class Builder < Parser::Builders::Default
NODE_MAP = {
and: AndNode,
alias: AliasNode,
args: ArgsNode,
array: ArrayNode,
block: BlockNode,
numblock: BlockNode,
break: BreakNode,
case_match: CaseMatchNode,
case: CaseNode,
class: ClassNode,
def: DefNode,
defined?: DefinedNode,
defs: DefNode,
ensure: EnsureNode,
for: ForNode,
forward_args: ForwardArgsNode,
float: FloatNode,
hash: HashNode,
if: IfNode,
int: IntNode,
irange: RangeNode,
erange: RangeNode,
kwsplat: KeywordSplatNode,
module: ModuleNode,
or: OrNode,
pair: PairNode,
regexp: RegexpNode,
resbody: ResbodyNode,
retry: RetryNode,
return: ReturnNode,
csend: SendNode,
send: SendNode,
str: StrNode,
dstr: StrNode,
xstr: StrNode,
sclass: SelfClassNode,
super: SuperNode,
zsuper: SuperNode,
sym: SymbolNode,
until: UntilNode,
until_post: UntilNode,
when: WhenNode,
while: WhileNode,
while_post: WhileNode,
yield: YieldNode
}.freeze
# Generates {Node} from the given information.
#
# @return [Node] the generated node
def n(type, children, source_map)
node_klass(type).new(type, children, location: source_map)
end
# TODO: Figure out what to do about literal encoding handling...
# More details here https://github.com/whitequark/parser/issues/283
def string_value(token)
value(token)
end
private
def node_klass(type)
NODE_MAP[type] || Node
end
end
end
end