Skip to content

Releases: ruby/prism

v1.3.0

21 Dec 19:57
439fd97
Compare
Choose a tag to compare

Added

  • Introduce Prism::StringQuery.
  • Introduce Prism::Relocation.
  • Track do keyword for WhileNode and UntilNode.
  • Change the way the gem is built to rely on mkmf instead of make.
  • 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

10 Oct 19:22
b08e569
Compare
Choose a tag to compare

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 implicit gets 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

02 Oct 19:43
5bf1903
Compare
Choose a tag to compare

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 an eval context, because that behavior has changed upstream in ruby/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 the version 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

28 Aug 19:40
163a265
Compare
Choose a tag to compare

Added

  • Add Node#breadth_first_search.
  • Add Node#node_id.
  • Add ArgumentsNode#contains_splat?.
  • Passing the special value false for the encoding 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 to CaseMatchNode#else_clause
    • CaseNode#consequent was renamed to CaseNode#else_clause
    • IfNode#consequent was renamed to IfNode#subsequent
    • RescueNode#consequent was renamed to RescueNode#subsequent
    • UnlessNode#consequent was renamed to UnlessNode#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

07 Jun 19:54
Compare
Choose a tag to compare

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 a numerator and denominator field instead of a numeric field. For the Ruby API we provide a RationalNode#numeric method for backwards-compatibility.

v0.29.0

10 May 17:13
1f49ca9
Compare
Choose a tag to compare

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 to binary_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

03 May 19:37
64b112c
Compare
Choose a tag to compare

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 and Prism::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 the version: parameter on all Prism.* APIs.
  • Prism::Source#lines, Prism::Location#source_lines, Prism::Node#source_lines, and Prism::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 of Prism::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 and Prism::ConstantTargetNode#child are now deprecated, replaced by two new fields on these nodes: name and name_loc.

v0.27.0

23 Apr 21:15
096d01c
Compare
Choose a tag to compare

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 into Prism::Result with subclasses Prism::ParseResult, Prism::LexResult, Prism::ParseLexResult, and Prism::LexCompat::Result.
  • Change reflection classes to have only a single IntegerField class and rename DoubleField to FloatField.
  • Fall back to default AR and CC in Makefile.
  • 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

23 Apr 21:15
b0a4810
Compare
Choose a tag to compare

Added

  • Add Prism::Node::fields, which returns a list of Prism::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 and RBS types for Prism::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.

v0.25.0

05 Apr 21:47
225c940
Compare
Choose a tag to compare

Added

  • Prism::Translation::Ripper is now able to mirror all of the Ripper APIs.
  • Prism::Location#leading_comments and Prism::Location#trailing_comments is added.
  • Prism::Comment#slice is added.
  • Warn for writing literal values in conditional predicates.
  • Check for _POSIX_MAPPED_FILES before using mmap.
  • Prism::ItParametersNode is added, to support -> { it }.
  • Parse integer and float literal values onto the tree.
  • Warn on duplicated hash keys and duplicated when clauses.
  • Ship much improved RBI and RBS types.
  • Support for the -p, -n, -a, and -l command line switches.
  • Warn on integer literals in flip-flops.
  • Support BSD make.
  • Add Prism::WhenNode#then_keyword_loc.
  • Support custom allocation functions through the PRISM_XALLOCATOR define.
  • Warn for certain keywrods at the end of the line.
  • Provide pm_visit_node, a C visitor API.
  • Prism::parse_stream is added, which works for any Ruby IO object.
  • Provide flags for regular expression literals for their derived encoding.
  • Provide flags for whether or not an interpolated string literal is frozen.
  • Add Prism::StringNode.mutable? for when a string is explicitly mutable, to support delineating chilled strings.
  • Warn for incorrect character literal syntax.
  • Warn for chained comparison operators.
  • Warn for ** interpreted as an argument prefix.
  • Warn for & interpreted as an argument prefix.
  • Prism::ShareableConstantNode added to support ractors.
  • Warn for frozen string literals found after tokens.
  • Support PRISM_BUILD_MINIMAL to provide only the minimal necessary functionality to reduce the binary size.
  • Handle CLRF inside heredocs, strings, and regular expressions.
  • Mark inner strings in interpolated strings as frozen.
  • Support the -x command line switch.
  • Error messages now much more closely mirror CRuby.
  • Provide syntax errors for invalid block exits (break, next, retry, and yield).
  • Warn on unused local variables.
  • Do not syntax error on default parameter values that only write to the parameter.

Changed

  • Many improvements to the compatibility with the whitequark/parser translation.
  • Accept newlines before pattern terminators ) or ].
  • Prism::Node#start_offset and Prism::Node#end_offset are now much more efficient.
  • Read files using fread instead of mmap when we're going to keep around the source through the Ruby API.
  • Fix Sexp#line_max setting in the seattlerb/ruby_parser translation layer.
  • Allow spaces before the encoding comment.