mirror of
https://github.com/ruby/ruby.git
synced 2025-08-28 15:36:16 +02:00

Having the @newline instance variable in every node adds up, and
since it is so rarely used, we only want to add it when necessary.
Moving this into an autoloaded file and moving the instance variable
out of the default initializers reduces allocated memory because the
nodes are now smaller and some fit into the compact list. On my
machine, I'm seeing about an 8% drop.
eea92c07d2
89 lines
2.9 KiB
Ruby
89 lines
2.9 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# The Prism Ruby parser.
|
|
#
|
|
# "Parsing Ruby is suddenly manageable!"
|
|
# - You, hopefully
|
|
#
|
|
module Prism
|
|
# There are many files in prism that are templated to handle every node type,
|
|
# which means the files can end up being quite large. We autoload them to make
|
|
# our require speed faster since consuming libraries are unlikely to use all
|
|
# of these features.
|
|
|
|
autoload :BasicVisitor, "prism/visitor"
|
|
autoload :Compiler, "prism/compiler"
|
|
autoload :Debug, "prism/debug"
|
|
autoload :DesugarCompiler, "prism/desugar_compiler"
|
|
autoload :Dispatcher, "prism/dispatcher"
|
|
autoload :DotVisitor, "prism/dot_visitor"
|
|
autoload :DSL, "prism/dsl"
|
|
autoload :InspectVisitor, "prism/inspect_visitor"
|
|
autoload :LexCompat, "prism/lex_compat"
|
|
autoload :LexRipper, "prism/lex_compat"
|
|
autoload :MutationCompiler, "prism/mutation_compiler"
|
|
autoload :Pack, "prism/pack"
|
|
autoload :Pattern, "prism/pattern"
|
|
autoload :Reflection, "prism/reflection"
|
|
autoload :Serialize, "prism/serialize"
|
|
autoload :Translation, "prism/translation"
|
|
autoload :Visitor, "prism/visitor"
|
|
|
|
# Some of these constants are not meant to be exposed, so marking them as
|
|
# private here.
|
|
|
|
private_constant :Debug
|
|
private_constant :LexCompat
|
|
private_constant :LexRipper
|
|
|
|
# :call-seq:
|
|
# Prism::lex_compat(source, **options) -> LexCompat::Result
|
|
#
|
|
# Returns a parse result whose value is an array of tokens that closely
|
|
# resembles the return value of Ripper::lex. The main difference is that the
|
|
# `:on_sp` token is not emitted.
|
|
#
|
|
# For supported options, see Prism::parse.
|
|
def self.lex_compat(source, **options)
|
|
LexCompat.new(source, **options).result # steep:ignore
|
|
end
|
|
|
|
# :call-seq:
|
|
# Prism::lex_ripper(source) -> Array
|
|
#
|
|
# This lexes with the Ripper lex. It drops any space events but otherwise
|
|
# returns the same tokens. Raises SyntaxError if the syntax in source is
|
|
# invalid.
|
|
def self.lex_ripper(source)
|
|
LexRipper.new(source).result # steep:ignore
|
|
end
|
|
|
|
# :call-seq:
|
|
# Prism::load(source, serialized) -> ParseResult
|
|
#
|
|
# Load the serialized AST using the source as a reference into a tree.
|
|
def self.load(source, serialized)
|
|
Serialize.load(source, serialized)
|
|
end
|
|
end
|
|
|
|
require_relative "prism/polyfill/byteindex"
|
|
require_relative "prism/node"
|
|
require_relative "prism/node_ext"
|
|
require_relative "prism/parse_result"
|
|
|
|
# This is a Ruby implementation of the prism parser. If we're running on CRuby
|
|
# and we haven't explicitly set the PRISM_FFI_BACKEND environment variable, then
|
|
# it's going to require the built library. Otherwise, it's going to require a
|
|
# module that uses FFI to call into the library.
|
|
if RUBY_ENGINE == "ruby" and !ENV["PRISM_FFI_BACKEND"]
|
|
require "prism/prism"
|
|
|
|
# The C extension is the default backend on CRuby.
|
|
Prism::BACKEND = :CEXT
|
|
else
|
|
require_relative "prism/ffi"
|
|
|
|
# The FFI backend is used on other Ruby implementations.
|
|
Prism::BACKEND = :FFI
|
|
end
|