类 RubyVM::AbstractSyntaxTree::Node
RubyVM::AbstractSyntaxTree::Node
实例由 RubyVM::AbstractSyntaxTree
中的解析方法创建。
此类是 MRI 特定的。
公共实例方法
all_tokens → array 点击切换源代码
返回输入脚本的所有标记,无论接收器节点是什么。如果解析方法调用时未启用 keep_tokens
,则返回 nil
。
root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true) root.all_tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...] root.children[-1].all_tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...]
# File ast.rb, line 206 def all_tokens Primitive.ast_node_all_tokens end
children → array 点击切换源代码
返回此节点下的 AST 节点。每种节点都有不同的子节点,具体取决于节点的类型。
返回的数组可能包含其他节点或 nil
。
# File ast.rb, line 217 def children Primitive.ast_node_children end
first_column → integer 点击切换源代码
源代码中此 AST 文本开始处的列号。
# File ast.rb, line 149 def first_column Primitive.ast_node_first_column end
first_lineno → integer 点击切换源代码
源代码中此 AST 文本开始处的行号。
# File ast.rb, line 141 def first_lineno Primitive.ast_node_first_lineno end
inspect → string 点击切换源代码
以字符串形式返回有关此节点的调试信息。
# File ast.rb, line 225 def inspect Primitive.ast_node_inspect end
last_column → integer 点击切换源代码
源代码中此 AST 文本结束处的列号。
# File ast.rb, line 165 def last_column Primitive.ast_node_last_column end
last_lineno → integer 点击切换源代码
此 AST 的文本在源代码中的行号。
# File ast.rb, line 157 def last_lineno Primitive.ast_node_last_lineno end
node_id → integer 点击切换源代码
返回一个内部 node_id
数字。请注意,这是一个供 Ruby 内部使用、调试和研究的 API。不要将其用于任何其他目的。兼容性无法保证。
# File ast.rb, line 236 def node_id Primitive.ast_node_node_id end
pretty_print(q) 点击切换源代码
# File lib/pp.rb, line 592 def pretty_print(q) q.group(1, "(#{type}@#{first_lineno}:#{first_column}-#{last_lineno}:#{last_column}", ")") { case type when :SCOPE pretty_print_children(q, %w"tbl args body") when :ARGS pretty_print_children(q, %w[pre_num pre_init opt first_post post_num post_init rest kw kwrest block]) when :DEFN pretty_print_children(q, %w[mid body]) when :ARYPTN pretty_print_children(q, %w[const pre rest post]) when :HSHPTN pretty_print_children(q, %w[const kw kwrest]) else pretty_print_children(q) end } end
pretty_print_children(q, names = []) 点击切换源代码
# File lib/pp.rb, line 579 def pretty_print_children(q, names = []) children.zip(names) do |c, n| if n q.breakable q.text "#{n}:" end q.group(2) do q.breakable q.pp c end end end
script_lines → array 点击切换源代码
将原始源代码作为行数组返回。
请注意,这是一个供 Ruby 内部使用、调试和研究的 API。不要将其用于任何其他目的。兼容性无法保证。
# File ast.rb, line 248 def script_lines Primitive.ast_node_script_lines end
source → string 点击切换源代码
返回与该 AST 对应的代码片段。
请注意,这是一个供 Ruby 内部使用、调试和研究的 API。不要将其用于任何其他目的。兼容性无法保证。
另请注意,此 API 可能会返回一个不完整的代码片段,该片段无法解析;例如,表达式后面的 here 文档可能会被删除。
# File ast.rb, line 264 def source lines = script_lines if lines lines = lines[first_lineno - 1 .. last_lineno - 1] lines[-1] = lines[-1].byteslice(0...last_column) lines[0] = lines[0].byteslice(first_column..-1) lines.join else nil end end
tokens → array 点击切换源代码
返回与节点位置相对应的标记。如果在调用解析方法时未启用 keep_tokens
,则返回 nil
。
root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true) root.tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...] root.tokens.map{_1[2]}.join # => "x = 1 + 2"
标记是一个数组,包含:
-
id
-
标记类型
-
源代码文本
-
位置 [
first_lineno
,first_column
,last_lineno
,last_column
]
# File ast.rb, line 185 def tokens return nil unless all_tokens all_tokens.each_with_object([]) do |token, a| loc = token.last if ([first_lineno, first_column] <=> [loc[0], loc[1]]) <= 0 && ([last_lineno, last_column] <=> [loc[2], loc[3]]) >= 0 a << token end end end
type → symbol 点击切换源代码
将此节点的类型作为符号返回。
root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2") root.type # => :SCOPE lasgn = root.children[2] lasgn.type # => :LASGN call = lasgn.children[1] call.type # => :OPCALL
# File ast.rb, line 133 def type Primitive.ast_node_type end