модуль Prism
Парсер Ruby.
«Парсинг Ruby стал неожиданно управляемым!»
- You, hopefully
Этот файл сгенерирован скриптом templates/template.rb и не должен изменяться вручную. Обратитесь к templates/lib/prism/compiler.rb.erb, если вы хотите изменить шаблон
Этот файл сгенерирован скриптом templates/template.rb и не должен изменяться вручную. Обратитесь к templates/lib/prism/dispatcher.rb.erb, если вы хотите изменить шаблон
Этот файл сгенерирован скриптом templates/template.rb и не должен изменяться вручную. Обратитесь к templates/lib/prism/dsl.rb.erb, если вы хотите изменить шаблон
Этот файл сгенерирован скриптом templates/template.rb и не должен изменяться вручную. Обратитесь к templates/lib/prism/mutation_compiler.rb.erb, если вы хотите изменить шаблон
Этот файл сгенерирован скриптом templates/template.rb и не должен изменяться вручную. Обратитесь к templates/lib/prism/node.rb.erb, если вы хотите изменить шаблон
Здесь мы повторно открываем модуль prism, чтобы предоставить методы для узлов, которые не являются шаблонными и предназначены как удобные методы.
Этот файл сгенерирован скриптом templates/template.rb и не должен изменяться вручную. Обратитесь к templates/lib/prism/visitor.rb.erb, если вы хотите изменить шаблон
Константы
- BACKEND
- VERSION
-
Константа версии устанавливается, считывая результат вызова pm_version.
Методы публичного класса
# File lib/prism/ffi.rb, line 182
def dump(code, **options)
LibRubyParser::PrismBuffer.with do |buffer|
LibRubyParser.pm_serialize_parse(buffer.pointer, code, code.bytesize, dump_options(options))
buffer.read
end
end Отражает API Prism.dump с использованием API сериализации.
# File lib/prism/ffi.rb, line 190
def dump_file(filepath, **options)
LibRubyParser::PrismString.with(filepath) do |string|
dump(string.read, **options, filepath: filepath)
end
end Отражает API Prism.dump_file с использованием API сериализации.
# File lib/prism/ffi.rb, line 197
def lex(code, **options)
LibRubyParser::PrismBuffer.with do |buffer|
LibRubyParser.pm_serialize_lex(buffer.pointer, code, code.bytesize, dump_options(options))
Serialize.load_tokens(Source.new(code), buffer.read)
end
end Отражает API Prism.lex с использованием API сериализации.
# File lib/prism.rb, line 46 def self.lex_compat(source, **options) LexCompat.new(source, **options).result end
Возвращает результат разбора, значение которого представляет собой массив токенов, очень похожий на возвращаемое значение Ripper::lex. Основное отличие заключается в том, что токен ‘:on_sp` не генерируется.
Для поддерживаемых параметров см. Prism::parse.
# File lib/prism/ffi.rb, line 205
def lex_file(filepath, **options)
LibRubyParser::PrismString.with(filepath) do |string|
lex(string.read, **options, filepath: filepath)
end
end Отражает API Prism.lex_file с использованием API сериализации.
# File lib/prism.rb, line 56 def self.lex_ripper(source) LexRipper.new(source).result end
Выполняет лексический анализ с помощью лексического анализатора Ripper. Он отбрасывает все события пробелов, но в остальном возвращает те же токены. Вызывает SyntaxError, если синтаксис в источнике некорректен.
# File lib/prism.rb, line 64 def self.load(source, serialized) Serialize.load(source, serialized) end
Загружает сериализованное АСТ, используя источник в качестве ссылки в дерево.
# File lib/prism/ffi.rb, line 212 def parse(code, **options) Prism.load(code, dump(code, **options)) end
Отражает API Prism.parse с использованием API сериализации.
# File lib/prism/ffi.rb, line 226
def parse_comments(code, **options)
LibRubyParser::PrismBuffer.with do |buffer|
LibRubyParser.pm_serialize_parse_comments(buffer.pointer, code, code.bytesize, dump_options(options))
source = Source.new(code)
loader = Serialize::Loader.new(source, buffer.read)
loader.load_header
loader.load_encoding
loader.load_start_line
loader.load_comments
end
end Отражает API Prism.parse_comments с использованием API сериализации.
# File lib/prism.rb, line 72 def self.parse_failure?(source, **options) !parse_success?(source, **options) end
Возвращает true, если источник содержит ошибки при разборе.
# File lib/prism/ffi.rb, line 219
def parse_file(filepath, **options)
LibRubyParser::PrismString.with(filepath) do |string|
parse(string.read, **options, filepath: filepath)
end
end Отражает API Prism.parse_file с использованием API сериализации. Использует базовые строки вместо строк Ruby, что позволяет использовать mmap, когда это доступно.
# File lib/prism/ffi.rb, line 243
def parse_file_comments(filepath, **options)
LibRubyParser::PrismString.with(filepath) do |string|
parse_comments(string.read, **options, filepath: filepath)
end
end Отражает API Prism.parse_file_comments с использованием API сериализации. Использует базовые строки вместо строк Ruby, что позволяет использовать mmap, когда это доступно.
# File lib/prism.rb, line 80 def self.parse_file_failure?(filepath, **options) !parse_file_success?(filepath, **options) end
Возвращает true, если файл в пути filepath парсится с ошибками.
# File lib/prism/ffi.rb, line 278
def parse_file_success?(filepath, **options)
LibRubyParser::PrismString.with(filepath) do |string|
parse_success?(string.read, **options, filepath: filepath)
end
end Отражает API Prism.parse_file_success? с использованием API сериализации.
# File lib/prism/ffi.rb, line 250
def parse_lex(code, **options)
LibRubyParser::PrismBuffer.with do |buffer|
LibRubyParser.pm_serialize_parse_lex(buffer.pointer, code, code.bytesize, dump_options(options))
source = Source.new(code)
loader = Serialize::Loader.new(source, buffer.read)
tokens = loader.load_tokens
node, comments, magic_comments, data_loc, errors, warnings = loader.load_nodes
tokens.each { |token,| token.value.force_encoding(loader.encoding) }
ParseResult.new([node, tokens], comments, magic_comments, data_loc, errors, warnings, source)
end
end Отражает API Prism.parse_lex с использованием API сериализации.
# File lib/prism/ffi.rb, line 266
def parse_lex_file(filepath, **options)
LibRubyParser::PrismString.with(filepath) do |string|
parse_lex(string.read, **options, filepath: filepath)
end
end Отражает API Prism.parse_lex_file с использованием API сериализации.
# File lib/prism/ffi.rb, line 273 def parse_success?(code, **options) LibRubyParser.pm_parse_success_p(code, code.bytesize, dump_options(options)) end
Отражает API Prism.parse_success? с использованием API сериализации.
Методы класса (приватные)
# File lib/prism/ffi.rb, line 287
def dump_options(options)
template = +""
values = []
template << "L"
if (filepath = options[:filepath])
values.push(filepath.bytesize, filepath.b)
template << "A*"
else
values << 0
end
template << "L"
values << options.fetch(:line, 1)
template << "L"
if (encoding = options[:encoding])
name = encoding.name
values.push(name.bytesize, name.b)
template << "A*"
else
values << 0
end
template << "C"
values << (options.fetch(:frozen_string_literal, false) ? 1 : 0)
template << "C"
values << (options.fetch(:verbose, true) ? 0 : 1)
template << "L"
if (scopes = options[:scopes])
values << scopes.length
scopes.each do |scope|
template << "L"
values << scope.length
scope.each do |local|
name = local.name
template << "L"
values << name.bytesize
template << "A*"
values << name.b
end
end
else
values << 0
end
values.pack(template)
end Преобразует заданные параметры в сериализованную строку параметров.
Ruby Core © 1993–2022 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.