[ruby/prism] Add some samples for using prism APIs
https://github.com/ruby/prism/commit/6a4fe21088
This commit is contained in:
parent
27321290d9
commit
b0059980d0
22
sample/find_comments.rb
Normal file
22
sample/find_comments.rb
Normal file
@ -0,0 +1,22 @@
|
||||
# This script finds all of the comments within a given source file.
|
||||
|
||||
require "prism"
|
||||
|
||||
Prism.parse_comments(DATA.read).each do |comment|
|
||||
puts comment.inspect
|
||||
puts comment.slice
|
||||
end
|
||||
|
||||
# =>
|
||||
# #<Prism::InlineComment @location=#<Prism::Location @start_offset=0 @length=42 start_line=1>>
|
||||
# # This is documentation for the Foo class.
|
||||
# #<Prism::InlineComment @location=#<Prism::Location @start_offset=55 @length=43 start_line=3>>
|
||||
# # This is documentation for the bar method.
|
||||
|
||||
__END__
|
||||
# This is documentation for the Foo class.
|
||||
class Foo
|
||||
# This is documentation for the bar method.
|
||||
def bar
|
||||
end
|
||||
end
|
41
sample/find_nodes.rb
Normal file
41
sample/find_nodes.rb
Normal file
@ -0,0 +1,41 @@
|
||||
# This script finds all of the nodes of a specific type within a given source
|
||||
# file. It uses the visitor class to traverse the AST.
|
||||
|
||||
require "prism"
|
||||
|
||||
class RegexpVisitor < Prism::Visitor
|
||||
def initialize(regexps)
|
||||
@regexps = regexps
|
||||
end
|
||||
|
||||
def visit_regular_expression_node(node)
|
||||
@regexps << node
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
result = Prism.parse_stream(DATA)
|
||||
regexps = []
|
||||
|
||||
result.value.accept(RegexpVisitor.new(regexps))
|
||||
puts regexps.map(&:inspect)
|
||||
|
||||
# =>
|
||||
# @ RegularExpressionNode (location: (2,9)-(2,14))
|
||||
# ├── flags: forced_us_ascii_encoding
|
||||
# ├── opening_loc: (2,9)-(2,10) = "/"
|
||||
# ├── content_loc: (2,10)-(2,13) = "foo"
|
||||
# ├── closing_loc: (2,13)-(2,14) = "/"
|
||||
# └── unescaped: "foo"
|
||||
# @ RegularExpressionNode (location: (3,9)-(3,14))
|
||||
# ├── flags: forced_us_ascii_encoding
|
||||
# ├── opening_loc: (3,9)-(3,10) = "/"
|
||||
# ├── content_loc: (3,10)-(3,13) = "bar"
|
||||
# ├── closing_loc: (3,13)-(3,14) = "/"
|
||||
# └── unescaped: "bar"
|
||||
|
||||
__END__
|
||||
class Foo
|
||||
REG1 = /foo/
|
||||
REG2 = /bar/
|
||||
end
|
69
sample/locate_nodes.rb
Normal file
69
sample/locate_nodes.rb
Normal file
@ -0,0 +1,69 @@
|
||||
# This script locates a set of nodes determined by a line and column (in bytes).
|
||||
|
||||
require "prism"
|
||||
|
||||
def locate(node, line:, column:)
|
||||
queue = [node]
|
||||
result = []
|
||||
|
||||
while (node = queue.shift)
|
||||
# Each node that we visit should be added to the result, so that we end up
|
||||
# with an array of the nodes that we traversed.
|
||||
result << node
|
||||
|
||||
# Iterate over each child node.
|
||||
node.compact_child_nodes.each do |child_node|
|
||||
child_location = child_node.location
|
||||
|
||||
start_line = child_location.start_line
|
||||
end_line = child_location.end_line
|
||||
|
||||
# Here we determine if the given coordinates are contained within the
|
||||
# child node's location.
|
||||
if start_line == end_line
|
||||
if line == start_line && column >= child_location.start_column && column < child_location.end_column
|
||||
queue << child_node
|
||||
break
|
||||
end
|
||||
elsif (line == start_line && column >= child_location.start_column) || (line == end_line && column < child_location.end_column)
|
||||
queue << child_node
|
||||
break
|
||||
elsif line > start_line && line < end_line
|
||||
queue << child_node
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Finally, we return the result.
|
||||
result
|
||||
end
|
||||
|
||||
result = Prism.parse_stream(DATA)
|
||||
locate(result.value, line: 4, column: 14).each_with_index do |node, index|
|
||||
location = node.location
|
||||
puts "#{" " * index}#{node.type}@#{location.start_line}:#{location.start_column}-#{location.end_line}:#{location.end_column}"
|
||||
end
|
||||
|
||||
# =>
|
||||
# program_node@1:0-7:3
|
||||
# statements_node@1:0-7:3
|
||||
# module_node@1:0-7:3
|
||||
# statements_node@2:2-6:5
|
||||
# class_node@2:2-6:5
|
||||
# statements_node@3:4-5:7
|
||||
# def_node@3:4-5:7
|
||||
# statements_node@4:6-4:21
|
||||
# call_node@4:6-4:21
|
||||
# call_node@4:6-4:15
|
||||
# arguments_node@4:12-4:15
|
||||
# integer_node@4:12-4:15
|
||||
|
||||
__END__
|
||||
module Foo
|
||||
class Bar
|
||||
def baz
|
||||
111 + 222 + 333
|
||||
end
|
||||
end
|
||||
end
|
Loading…
x
Reference in New Issue
Block a user