Class: Prism::Translation::Parser
- Inherits:
-
Parser::Base
- Object
- Parser::Base
- Prism::Translation::Parser
- Defined in:
- lib/prism/translation/parser.rb,
lib/prism/translation/parser/lexer.rb,
lib/prism/translation/parser/builder.rb,
lib/prism/translation/parser/compiler.rb
Overview
This class is the entry-point for converting a prism syntax tree into the whitequark/parser gem’s syntax tree. It inherits from the base parser for the parser gem, and overrides the parse* methods to parse with prism and then translate.
Defined Under Namespace
Classes: Builder, Compiler, PrismDiagnostic
Constant Summary collapse
- Racc_debug_parser =
:nodoc:
false
Instance Method Summary collapse
-
#default_encoding ⇒ Object
The default encoding for Ruby files is UTF-8.
-
#initialize(builder = Prism::Translation::Parser::Builder.new, parser: Prism) ⇒ Parser
constructor
The ‘builder` argument is used to create the parser using our custom builder class by default.
-
#parse(source_buffer) ⇒ Object
Parses a source buffer and returns the AST.
-
#parse_with_comments(source_buffer) ⇒ Object
Parses a source buffer and returns the AST and the source code comments.
-
#tokenize(source_buffer, recover = false) ⇒ Object
Parses a source buffer and returns the AST, the source code comments, and the tokens emitted by the lexer.
-
#try_declare_numparam(node) ⇒ Object
Since prism resolves num params for us, we don’t need to support this kind of logic here.
-
#version ⇒ Object
:nodoc:.
-
#yyerror ⇒ Object
:nodoc:.
Constructor Details
#initialize(builder = Prism::Translation::Parser::Builder.new, parser: Prism) ⇒ Parser
The ‘builder` argument is used to create the parser using our custom builder class by default.
By using the ‘:parser` keyword argument, you can translate in a way that is compatible with the Parser gem using any parser.
For example, in RuboCop for Ruby LSP, the following approach can be used to improve performance by reusing a pre-parsed ‘Prism::ParseLexResult`:
class PrismPreparsed
def initialize(prism_result)
@prism_result = prism_result
end
def parse_lex(source, **)
@prism_result
end
end
prism_preparsed = PrismPreparsed.new(prism_result)
Prism::Translation::Ruby34.new(builder, parser: prism_preparsed)
In an object passed to the ‘:parser` keyword argument, the `parse` and `parse_lex` methods should be implemented as needed.
61 62 63 64 65 |
# File 'lib/prism/translation/parser.rb', line 61 def initialize(builder = Prism::Translation::Parser::Builder.new, parser: Prism) @parser = parser super(builder) end |
Instance Method Details
#default_encoding ⇒ Object
The default encoding for Ruby files is UTF-8.
72 73 74 |
# File 'lib/prism/translation/parser.rb', line 72 def default_encoding Encoding::UTF_8 end |
#parse(source_buffer) ⇒ Object
Parses a source buffer and returns the AST.
80 81 82 83 84 85 86 87 88 89 90 |
# File 'lib/prism/translation/parser.rb', line 80 def parse(source_buffer) @source_buffer = source_buffer source = source_buffer.source offset_cache = build_offset_cache(source) result = unwrap(@parser.parse(source, **), offset_cache) build_ast(result.value, offset_cache) ensure @source_buffer = nil end |
#parse_with_comments(source_buffer) ⇒ Object
Parses a source buffer and returns the AST and the source code comments.
93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# File 'lib/prism/translation/parser.rb', line 93 def parse_with_comments(source_buffer) @source_buffer = source_buffer source = source_buffer.source offset_cache = build_offset_cache(source) result = unwrap(@parser.parse(source, **), offset_cache) [ build_ast(result.value, offset_cache), build_comments(result.comments, offset_cache) ] ensure @source_buffer = nil end |
#tokenize(source_buffer, recover = false) ⇒ Object
Parses a source buffer and returns the AST, the source code comments, and the tokens emitted by the lexer.
110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'lib/prism/translation/parser.rb', line 110 def tokenize(source_buffer, recover = false) @source_buffer = source_buffer source = source_buffer.source offset_cache = build_offset_cache(source) result = begin unwrap(@parser.parse_lex(source, **), offset_cache) rescue ::Parser::SyntaxError raise if !recover end program, tokens = result.value ast = build_ast(program, offset_cache) if result.success? [ ast, build_comments(result.comments, offset_cache), build_tokens(tokens, offset_cache) ] ensure @source_buffer = nil end |
#try_declare_numparam(node) ⇒ Object
Since prism resolves num params for us, we don’t need to support this kind of logic here.
136 137 138 |
# File 'lib/prism/translation/parser.rb', line 136 def try_declare_numparam(node) node.children[0].match?(/\A_[1-9]\z/) end |
#version ⇒ Object
:nodoc:
67 68 69 |
# File 'lib/prism/translation/parser.rb', line 67 def version # :nodoc: 34 end |
#yyerror ⇒ Object
:nodoc:
76 77 |
# File 'lib/prism/translation/parser.rb', line 76 def yyerror # :nodoc: end |