類別 RubyVM::AbstractSyntaxTree::Node

RubyVM::AbstractSyntaxTree::Node 執行個體是由 RubyVM::AbstractSyntaxTree 中的剖析方法所建立的。

此類別是 MRI 專屬的。

公開執行個體方法

all_tokens → 陣列 按一下以切換來源

傳回輸入指令碼的所有權杖,不論接收器節點為何。如果在呼叫剖析方法時未啟用 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 → 陣列 按一下以切換來源

傳回此節點下的 AST 節點。每種類型的節點都有不同的子節點,視其為哪種類型的節點而定。

傳回的陣列可能包含其他節點或 nil

# File ast.rb, line 217
def children
  Primitive.ast_node_children
end
first_column → 整數 按一下以切換來源

此 AST 文字開始的來源程式碼中的欄位號碼。

# File ast.rb, line 149
def first_column
  Primitive.ast_node_first_column
end
first_lineno → 整數 按一下以切換來源

此 AST 文字開始的來源程式碼中的行號。

# File ast.rb, line 141
def first_lineno
  Primitive.ast_node_first_lineno
end
inspect → 字串 按一下以切換來源

傳回關於此節點的除錯資訊,以字串表示。

# File ast.rb, line 225
def inspect
  Primitive.ast_node_inspect
end
last_column → 整數 按一下以切換來源

此 AST 文字結束的來源程式碼中的欄位號碼。

# File ast.rb, line 165
def last_column
  Primitive.ast_node_last_column
end
last_lineno → 整數 按一下以切換來源

此 AST 文字結束的來源程式碼中的行號。

# File ast.rb, line 157
def last_lineno
  Primitive.ast_node_last_lineno
end
node_id → 整數 按一下以切換來源

傳回一個內部 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 → 陣列 按一下以切換來源

傳回原始程式碼作為陣列的線條。

請注意,這是供 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"

代碼是陣列

# 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