Releases: ruby/prism
Releases · ruby/prism
v1.4.0
Added
- Support
3.5
as a version option. - Many, many compatibility fixes for the parser translation layer.
- Handle escapes in named capture names.
- The
freeze
option is added to the variousPrism::
APIs to deeply freeze the AST. - Properly support
it
for the parser and ruby_parser translation layers. - Track the
then
keyword onrescue
nodes. - Add a
multiple_statements?
flag to parentheses nodes to support desireddefined?
behavior.
Changed
- The strings used in the AST are now frozen.
- Fixed handling escaped characters after control sequences in character literals.
- Fix reading off the end of an unterminated global variable.
- Raise a syntax error for defining
[]=
with endless method syntax. - Increase value of
PRISM_DEPTH_MAXIMUM
to10000
. - Freeze
Prism::VERSION
. - Fix up rescue modifier precedence.
v1.3.0
Added
- Introduce
Prism::StringQuery
. - Introduce
Prism::Relocation
. - Track
do
keyword forWhileNode
andUntilNode
. - Change the way the gem is built to rely on
mkmf
instead ofmake
. - Lots more documentation on node fields.
Changed
- Properly add an error for
def @foo; end
. - Properly add an error for
foo(**, *)
. - Fix up regression in string parsing in
RubyParser
translation. - Reject invalid dot method call after match expression.
- Reject invalid operator after match expression.
- Fix up %-literals delimited by newlines.
- Properly add an error for
-> { _1; -> { _1 } }
. - Reject blocks and keywords in index writes.
v1.2.0
Added
- Introduce
Prism::CodeUnitsCache
.
Changed
- Properly handle lexing global variables that begin with
$-
. - Properly reject invalid multi writes within parentheses.
- Fix unary
*
binding power. - Set
contains_keywords
flag for implicitgets
calls when-p
is used. - Properly reject invalid non-associative operator patterns.
- Do not warn about unused variables declared on negative lines.
v1.1.0
Added
- Explicitly type each child node field in the Ruby API.
- Add the
main_script
option to the parse APIs, which controls whether or not shebangs are considered. - Add the
partial_script
options to the parse APIs, which controls whether or not jumps that would otherwise be considered invalid are allowed. This is useful for parsing things like ERB sources, where you know it will be evaluated in a different context. Note that this functionality is replacing the previous idiom of passing in a list of scopes to indicate aneval
context, because that behavior has changed upstream inruby/ruby
. - Add
ArgumentsNode#contains_multiple_splats?
. - Add
ArgumentsNode#contains_forwarding?
. - Accept all valid Ruby versions for the
version
option on parse APIs. - Accept version shorthands like
"3.3"
and"3.4"
for theversion
option on parse APIs. - Support a max depth to protect against malicious payloads without hitting the stack limit.
Changed
- Fix some token incompatibilities in the
parser
translation. - Fix up parsing tempfiles on Windows.
- Fix up handling UTF-8 characters in file paths on Windows.
- Do not warn for a
\r
at the end of a shebang on Windows. - Properly handle erroring for parsing a directory on Windows.
- When a numbered reference is out of range, warn instead of raise.
- Allow returns in default parameter values.
- Reject many more invalid syntax patterns.
v1.0.0
Added
- Add
Node#breadth_first_search
. - Add
Node#node_id
. - Add
ArgumentsNode#contains_splat?
. - Passing the special value
false
for theencoding
option tells Prism to ignore magic encoding comments. - Expose flags on every node type (allows checking static literal and newline).
- Implement mismatched indentation warning.
- Add C API for receiving a callback when parsing shebangs with additional flags.
Changed
- BREAKING: Some fields are renamed that had illogical names. The previous names all now emit deprecation warnings.
CaseMatchNode#consequent
was renamed toCaseMatchNode#else_clause
CaseNode#consequent
was renamed toCaseNode#else_clause
IfNode#consequent
was renamed toIfNode#subsequent
RescueNode#consequent
was renamed toRescueNode#subsequent
UnlessNode#consequent
was renamed toUnlessNode#else_clause
- Block exits are now allowed in loop predicates (e.g.,
while _ && break do end
). - Multi-writes are now disallowed when not at the statement level.
- Ensure that range operators are non-associative.
- (JavaScript) Correctly deserialize encoded strings.
- Properly support parsing regular expressions in extended mode.
- Use gmake on FreeBSD.
- Parsing streams now handles NUL bytes in the middle of the stream.
- Properly detect invalid returns.
v0.30.0
Added
- More correctly raise mixed encoding errors.
- Implement ambiguous binary operator warning.
- Fix up regexp escapes with control and meta characters.
- Fix up support for the
it
implicit local variable. - Heredoc identifiers now properly disallow CLRF.
- Errors added for void value expressions in begin clauses.
- Many updates to more closely match the
parser
gem in parser translation. - Many errors added for invalid regular expressions.
Changed
- Handle parser translation missing the
parser
gem. - Handle ruby_parser translation missing the
ruby_parser
gem. - Various error messages have been updated to more closely match CRuby.
RationalNode
now has anumerator
anddenominator
field instead of anumeric
field. For the Ruby API we provide aRationalNode#numeric
method for backwards-compatibility.
v0.29.0
Added
- Added
Prism::CallNode#full_message_loc
, which gives the location including the=
if there is one. - A warning for when
# shareable_constant_value
is not used on its own line. - An error for invalid implicit local variable writes.
- Implicit hash patterns in array patterns are disallowed.
- We now validate that Unicode escape sequences are not surrogates.
Changed
- All fields named
operator
have been renamed tobinary_operator
for*OperatorWriteNode
nodes. This is to make it easier to provide C++ support. In the Ruby API, the old fields are aliased to the new fields with a deprecation warning. - Many updated error messages to more closely match CRuby.
- We ensure keyword parameters do not end in
!
or?
. - Fixed some escaping in string literals with control sequences and hex escapes.
- Fix a bug with RBS types when used outside the
ruby/prism
codebase.
v0.28.0
Added
- Nested hashes will now warn for duplicated keys, as in:
{ foo: 1, **{ foo: 2 } }
. Prism::ReturnNode
now has a flag on it to indicate if it is redundant.Prism::Location#slice_lines
andPrism::Node#slice_lines
are now provided to slice the source code of a node including the content before the node on the same line that it starts on and the content after the node on the same line that it ends on.- Symbols with invalid byte sequences now give errors.
- You can now pass
"3.3.1"
to theversion:
parameter on allPrism.*
APIs. Prism::Source#lines
,Prism::Location#source_lines
,Prism::Node#source_lines
, andPrism::Node#script_lines
are now provided, which will all return the source code of the source as an array of strings.Prism::ASCIISource
is now provided, which is a subclass ofPrism::Source
but specialized to increase performance when the source is entirely ASCII.- Prism now provides errors when parsing Ruby 3.4+ syntax for index expressions with keywords or blocks.
- Prism now provides an error when
**nil
is used after other keyword parameters. - Prism now provides errors when safe navigation is used in call target expressions, e.g.,
foo&.bar, = 1
. Prism::Node#tunnel
is now provided, which returns an array of nodes starting at the current node that contain a given line and column.
Changed
- All translation layers now assume an eval context, which means they will not return errors for invalid jumps like
yield
. Prism::Node#inspect
now uses a queue instead of recursion to avoid stack overflows.- Prism now more closely mirrors CRuby interpolation semantics, which means you could potentially have a static literal string that directly interpolates another static literal string.
- The shipped RBI sorbet types no longer use generics.
Prism::ConstantPathNode#child
andPrism::ConstantTargetNode#child
are now deprecated, replaced by two new fields on these nodes:name
andname_loc
.
v0.27.0
Added
- Implemented
===
for each of the nodes, which will check if equality but ignore the specific ranges of locations.
Changed
- Fix translation of
ItParametersNode
for parser translation. - Fix translation of
dstr
for ruby_parser translation. - Do not allow omitted hash values whose keys end with
!
or?
. - Split up
Prism::ParseResult
intoPrism::Result
with subclassesPrism::ParseResult
,Prism::LexResult
,Prism::ParseLexResult
, andPrism::LexCompat::Result
. - Change reflection classes to have only a single
IntegerField
class and renameDoubleField
toFloatField
. - Fall back to default
AR
andCC
inMakefile
. - Use GC-able symbols for the syntax tree to avoid adding to the global symbol table.
- Fix a bug with karatsuba_multiply that would result in a stack overflow.
- Fix parser translation when looking for tokens with
srange_find
.
v0.26.0
Added
- Add
Prism::Node::fields
, which returns a list ofPrism::Reflection::Field
objects representing the fields of the node class. This is useful in metaprogramming contexts. Prism::Location#chop
, for removing the last byte from a location.- The void statement warning is now implemented.
- The unreachable statement warning is now implemented.
- A syntax error has been added for block arguments on yields, e.g.,
yield(&foo)
.
Changed
- Better fidelity to
parser
when translating heredocs with interpolation. - Fixed
RBI
andRBS
types forPrism::parse_*
signatures. - Remove some incorrect warnings about unused local variables.
- More closely match CRuby error messages for global variables.
- Fix an issue with
parser
translation when line continuations are found in string literals.