diff options
Diffstat (limited to 'lib/prism.rb')
-rw-r--r-- | lib/prism.rb | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/prism.rb b/lib/prism.rb new file mode 100644 index 0000000000..4d111b072f --- /dev/null +++ b/lib/prism.rb @@ -0,0 +1,64 @@ +# frozen_string_literal: true + +module YARP + # There are many files in YARP 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, "yarp/visitor" + autoload :Compiler, "yarp/compiler" + autoload :Debug, "yarp/debug" + autoload :DesugarCompiler, "yarp/desugar_compiler" + autoload :Dispatcher, "yarp/dispatcher" + autoload :DSL, "yarp/dsl" + autoload :LexCompat, "yarp/lex_compat" + autoload :LexRipper, "yarp/lex_compat" + autoload :MutationCompiler, "yarp/mutation_compiler" + autoload :NodeInspector, "yarp/node_inspector" + autoload :RipperCompat, "yarp/ripper_compat" + autoload :Pack, "yarp/pack" + autoload :Pattern, "yarp/pattern" + autoload :Serialize, "yarp/serialize" + autoload :Visitor, "yarp/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 + + # Returns an array of tokens that closely resembles that of the Ripper lexer. + # The only difference is that since we don't keep track of lexer state in the + # same way, it's going to always return the NONE state. + def self.lex_compat(source, filepath = "") + LexCompat.new(source, filepath).result + end + + # 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 + end + + # 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 "yarp/node" +require_relative "yarp/node_ext" +require_relative "yarp/parse_result" +require_relative "yarp/parse_result/comments" +require_relative "yarp/parse_result/newlines" + +# This is a Ruby implementation of the YARP parser. If we're running on CRuby +# and we haven't explicitly set the YARP_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["YARP_FFI_BACKEND"] + require "yarp/yarp" +else + require_relative "yarp/ffi" +end |