Class: Parser::Builders::Default
- Inherits:
-
Object
- Object
- Parser::Builders::Default
- Defined in:
- lib/parser/builders/default.rb
Overview
Default AST builder. Uses AST::Nodes.
Class Attribute Summary collapse
-
.emit_arg_inside_procarg0 ⇒ Boolean
AST compatibility attribute; causes a single non-mlhs block argument to be wrapped in s(:procarg0).
-
.emit_encoding ⇒ Boolean
AST compatibility attribute; locations of
__ENCODING__are not the same as locations ofEncoding::UTF_8causing problems during rewriting, all new code should set this attribute to true. -
.emit_forward_arg ⇒ Boolean
AST compatibility attribute; arguments forwarding initially didn't have support for leading arguments (i.e.
def m(a, ...); endwas a syntax error). -
.emit_index ⇒ Boolean
AST compatibility attribute; indexed assignment,
x[] = 1, is not semantically equivalent to calling the method directly,x.[]=(1). -
.emit_kwargs ⇒ Object
AST compatibility attribute; Starting from Ruby 2.7 keyword arguments of method calls that are passed explicitly as a hash (i.e. with curly braces) are treated as positional arguments and Ruby 2.7 emits a warning on such method call.
-
.emit_lambda ⇒ Boolean
AST compatibility attribute; since
-> {}is not semantically equivalent tolambda {}, all new code should set this attribute to true. -
.emit_match_pattern ⇒ Object
AST compatibility attribute; Starting from 3.0 Ruby returns true/false from single-line pattern matching with
inkeyword. -
.emit_procarg0 ⇒ Boolean
AST compatibility attribute; block arguments of
m { |a| }are not semantically equivalent to block arguments ofm { |a,| }orm { |a, b| }, all new code should set this attribute to true.
Instance Attribute Summary collapse
-
#emit_file_line_as_literals ⇒ Boolean
If set to true (the default),
__FILE__and__LINE__are transformed to literal nodes. - #parser ⇒ Object private
Class Method Summary collapse
- .modernize ⇒ Object private
Instance Method Summary collapse
-
#initialize ⇒ Default
constructor
Initializes attributes:.
Constructor Details
#initialize ⇒ Default
Initializes attributes:
* `emit_file_line_as_literals`: `true`
243 244 245 |
# File 'lib/parser/builders/default.rb', line 243 def initialize @emit_file_line_as_literals = true end |
Class Attribute Details
.emit_arg_inside_procarg0 ⇒ Boolean
AST compatibility attribute; causes a single non-mlhs block argument to be wrapped in s(:procarg0).
If set to false (the default), block arguments |a| are emitted as
s(:args, s(:procarg0, :a))
If set to true, block arguments |a| are emitted as
s(:args, s(:procarg0, s(:arg, :a))
97 98 99 |
# File 'lib/parser/builders/default.rb', line 97 def emit_arg_inside_procarg0 @emit_arg_inside_procarg0 end |
.emit_encoding ⇒ Boolean
AST compatibility attribute; locations of __ENCODING__ are not the same
as locations of Encoding::UTF_8 causing problems during rewriting,
all new code should set this attribute to true.
If set to false (the default), __ENCODING__ is emitted as
s(:const, s(:const, nil, :Encoding), :UTF_8).
If set to true, __ENCODING__ is emitted as
s(:__ENCODING__).
58 59 60 |
# File 'lib/parser/builders/default.rb', line 58 def emit_encoding @emit_encoding end |
.emit_forward_arg ⇒ Boolean
AST compatibility attribute; arguments forwarding initially
didn't have support for leading arguments
(i.e. def m(a, ...); end was a syntax error). However, Ruby 3.0
added support for any number of arguments in front of the ....
If set to false (the default):
1. `def m(...) end` is emitted as
s(:def, :m, s(:forward_args), nil)
2. `def m(a, b, ...) end` is emitted as
s(:def, :m,
s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg)))
If set to true it uses a single format:
1. `def m(...) end` is emitted as
s(:def, :m, s(:args, s(:forward_arg)))
2. `def m(a, b, ...) end` is emitted as
s(:def, :m, s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg)))
It does't matter that much on 2.7 (because there can't be any leading arguments), but on 3.0 it should be better enabled to use a single AST format.
126 127 128 |
# File 'lib/parser/builders/default.rb', line 126 def emit_forward_arg @emit_forward_arg end |
.emit_index ⇒ Boolean
AST compatibility attribute; indexed assignment, x[] = 1, is not
semantically equivalent to calling the method directly, x.[]=(1).
Specifically, in the former case, the expression's value is always 1,
and in the latter case, the expression's value is the return value
of the []= method.
If set to false (the default), self[1] is emitted as
s(:send, s(:self), :[], s(:int, 1)), and self[1] = 2 is
emitted as s(:send, s(:self), :[]=, s(:int, 1), s(:int, 2)).
If set to true, self[1] is emitted as
s(:index, s(:self), s(:int, 1)), and self[1] = 2 is
emitted as s(:indexasgn, s(:self), s(:int, 1), s(:int, 2)).
80 81 82 |
# File 'lib/parser/builders/default.rb', line 80 def emit_index @emit_index end |
.emit_kwargs ⇒ Object
AST compatibility attribute; Starting from Ruby 2.7 keyword arguments of method calls that are passed explicitly as a hash (i.e. with curly braces) are treated as positional arguments and Ruby 2.7 emits a warning on such method call. Ruby 3.0 given an ArgumentError.
If set to false (the default) the last hash argument is emitted as hash:
(send nil :foo
(hash
(pair
(sym :bar)
(int 42))))
If set to true it is emitted as kwargs:
(send nil :foo
(kwargs
(pair
(sym :bar)
(int 42))))
Note that kwargs node is just a replacement for hash argument,
so if there's are multiple arguments (or a kwsplat) all of them
are wrapped into kwargs instead of hash:
(send nil :foo
(kwargs
(pair
(sym :a)
(int 42))
(kwsplat
(send nil :b))
(pair
(sym :c)
(int 10))))
174 175 176 |
# File 'lib/parser/builders/default.rb', line 174 def emit_kwargs @emit_kwargs end |
.emit_lambda ⇒ Boolean
AST compatibility attribute; since -> {} is not semantically
equivalent to lambda {}, all new code should set this attribute
to true.
If set to false (the default), -> {} is emitted as
s(:block, s(:send, nil, :lambda), s(:args), nil).
If set to true, -> {} is emitted as
s(:block, s(:lambda), s(:args), nil).
22 23 24 |
# File 'lib/parser/builders/default.rb', line 22 def emit_lambda @emit_lambda end |
.emit_match_pattern ⇒ Object
AST compatibility attribute; Starting from 3.0 Ruby returns
true/false from single-line pattern matching with in keyword.
Before 3.0 there was an exception if given value doesn't match pattern.
NOTE: This attribute affects only Ruby 2.7 grammar.
3.0 grammar always emits match_pattern/match_pattern_p
If compatibility attribute set to false foo in bar is emitted as in_match:
(in-match
(send nil :foo)
(match-var :bar))
If set to true it's emitted as match_pattern_p:
(match-pattern-p
(send nil :foo)
(match-var :bar))
203 204 205 |
# File 'lib/parser/builders/default.rb', line 203 def emit_match_pattern @emit_match_pattern end |
.emit_procarg0 ⇒ Boolean
AST compatibility attribute; block arguments of m { |a| } are
not semantically equivalent to block arguments of m { |a,| } or m { |a, b| },
all new code should set this attribute to true.
If set to false (the default), arguments of m { |a| } are emitted as
s(:args, s(:arg, :a)).
If set to true, arguments of m { |a| } are emitted as
`s(:args, s(:procarg0, :a)).
40 41 42 |
# File 'lib/parser/builders/default.rb', line 40 def emit_procarg0 @emit_procarg0 end |
Instance Attribute Details
#emit_file_line_as_literals ⇒ Boolean
If set to true (the default), __FILE__ and __LINE__ are transformed to
literal nodes. For example, s(:str, "lib/foo.rb") and s(:int, 10).
If set to false, __FILE__ and __LINE__ are emitted as-is,
i.e. as s(:__FILE__) and s(:__LINE__) nodes.
Source maps are identical in both cases.
237 238 239 |
# File 'lib/parser/builders/default.rb', line 237 def emit_file_line_as_literals @emit_file_line_as_literals end |
#parser ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
225 226 227 |
# File 'lib/parser/builders/default.rb', line 225 def parser @parser end |
Class Method Details
.modernize ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
211 212 213 214 215 216 217 218 219 220 |
# File 'lib/parser/builders/default.rb', line 211 def modernize @emit_lambda = true @emit_procarg0 = true @emit_encoding = true @emit_index = true @emit_arg_inside_procarg0 = true @emit_forward_arg = true @emit_kwargs = true @emit_match_pattern = true end |