shard-ameba/src/contrib/read_type_doc.cr

30 lines
614 B
Crystal

require "compiler/crystal/syntax/*"
private class DocFinder < Crystal::Visitor
getter type_name : String
getter doc : String?
def initialize(nodes, @type_name)
self.accept(nodes)
end
def visit(node : Crystal::ASTNode)
return false if @doc
if node.responds_to?(:name) && (name = node.name).is_a?(Crystal::Path)
@doc = node.doc if name.names.last? == @type_name
end
true
end
end
type_name, path_to_source_file = ARGV
source = File.read(path_to_source_file)
nodes = Crystal::Parser.new(source)
.tap(&.wants_doc = true)
.parse
puts DocFinder.new(nodes, type_name).doc