From 138db9ccc4793b20cf7617349b462fe29236e332 Mon Sep 17 00:00:00 2001 From: Earlopain <14981592+Earlopain@users.noreply.github.com> Date: Wed, 17 Dec 2025 10:47:43 +0100 Subject: [PATCH] Add Ruby 4.1 as a version specifier --- include/prism/options.h | 5 ++++- java/org/prism/ParsingOptions.java | 3 ++- javascript/src/parsePrism.js | 2 ++ lib/prism/ffi.rb | 2 ++ lib/prism/translation.rb | 1 + lib/prism/translation/parser.rb | 4 +++- lib/prism/translation/parser41.rb | 13 +++++++++++++ lib/prism/translation/parser_current.rb | 2 ++ prism.gemspec | 2 ++ rbi/prism/translation/parser41.rbi | 6 ++++++ src/options.c | 10 ++++++++++ test/prism/api/parse_test.rb | 3 +++ test/prism/test_helper.rb | 2 +- 13 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 lib/prism/translation/parser41.rb create mode 100644 rbi/prism/translation/parser41.rbi diff --git a/include/prism/options.h b/include/prism/options.h index a663c9767e..c00c7bf755 100644 --- a/include/prism/options.h +++ b/include/prism/options.h @@ -97,8 +97,11 @@ typedef enum { /** The vendored version of prism in CRuby 4.0.x. */ PM_OPTIONS_VERSION_CRUBY_4_0 = 3, + /** The vendored version of prism in CRuby 4.1.x. */ + PM_OPTIONS_VERSION_CRUBY_4_1 = 4, + /** The current version of prism. */ - PM_OPTIONS_VERSION_LATEST = PM_OPTIONS_VERSION_CRUBY_4_0 + PM_OPTIONS_VERSION_LATEST = PM_OPTIONS_VERSION_CRUBY_4_1 } pm_options_version_t; /** diff --git a/java/org/prism/ParsingOptions.java b/java/org/prism/ParsingOptions.java index 6f7a342818..be0a8a7dba 100644 --- a/java/org/prism/ParsingOptions.java +++ b/java/org/prism/ParsingOptions.java @@ -16,7 +16,8 @@ public enum SyntaxVersion { V3_3(1), V3_4(2), V3_5(3), - V4_0(3); + V4_0(3), + V4_1(4); private final int value; diff --git a/javascript/src/parsePrism.js b/javascript/src/parsePrism.js index a2f0370993..38084da3f1 100644 --- a/javascript/src/parsePrism.js +++ b/javascript/src/parsePrism.js @@ -148,6 +148,8 @@ function dumpOptions(options) { values.push(2); } else if (options.version.match(/^3\.5(\.\d+)?$/) || options.version.match(/^4\.0(\.\d+)?$/)) { values.push(3); + } else if (options.version.match(/^4\.1(\.\d+)?$/)) { + values.push(4); } else { throw new Error(`Unsupported version '${options.version}' in compiler options`); } diff --git a/lib/prism/ffi.rb b/lib/prism/ffi.rb index 7e6103fde7..d4c9d60c9a 100644 --- a/lib/prism/ffi.rb +++ b/lib/prism/ffi.rb @@ -434,6 +434,8 @@ def dump_options_version(version) 2 when /\A3\.5(\.\d+)?\z/, /\A4\.0(\.\d+)?\z/ 3 + when /\A4\.1(\.\d+)?\z/ + 4 else if current raise CurrentVersionError, RUBY_VERSION diff --git a/lib/prism/translation.rb b/lib/prism/translation.rb index 7933b4a722..89c70ee420 100644 --- a/lib/prism/translation.rb +++ b/lib/prism/translation.rb @@ -11,6 +11,7 @@ module Translation # steep:ignore autoload :Parser34, "prism/translation/parser34" autoload :Parser35, "prism/translation/parser35" autoload :Parser40, "prism/translation/parser40" + autoload :Parser41, "prism/translation/parser41" autoload :Ripper, "prism/translation/ripper" autoload :RubyParser, "prism/translation/ruby_parser" end diff --git a/lib/prism/translation/parser.rb b/lib/prism/translation/parser.rb index 23245dc383..fed4ac4cd1 100644 --- a/lib/prism/translation/parser.rb +++ b/lib/prism/translation/parser.rb @@ -84,7 +84,7 @@ def initialize(builder = Prism::Translation::Parser::Builder.new, parser: Prism) end def version # :nodoc: - 40 + 41 end # The default encoding for Ruby files is UTF-8. @@ -358,6 +358,8 @@ def convert_for_prism(version) "3.4.0" when 35, 40 "4.0.0" + when 41 + "4.1.0" else "latest" end diff --git a/lib/prism/translation/parser41.rb b/lib/prism/translation/parser41.rb new file mode 100644 index 0000000000..ed81906400 --- /dev/null +++ b/lib/prism/translation/parser41.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true +# :markup: markdown + +module Prism + module Translation + # This class is the entry-point for Ruby 4.1 of `Prism::Translation::Parser`. + class Parser41 < Parser + def version # :nodoc: + 41 + end + end + end +end diff --git a/lib/prism/translation/parser_current.rb b/lib/prism/translation/parser_current.rb index 76d71e9409..ac6daf7082 100644 --- a/lib/prism/translation/parser_current.rb +++ b/lib/prism/translation/parser_current.rb @@ -12,6 +12,8 @@ module Translation ParserCurrent = Parser34 when /^3\.5\./, /^4\.0\./ ParserCurrent = Parser40 + when /^4\.1\./ + ParserCurrent = Parser41 else # Keep this in sync with released Ruby. parser = Parser34 diff --git a/prism.gemspec b/prism.gemspec index 10c2eaad20..d9872f88ac 100644 --- a/prism.gemspec +++ b/prism.gemspec @@ -102,6 +102,7 @@ Gem::Specification.new do |spec| "lib/prism/translation/parser34.rb", "lib/prism/translation/parser35.rb", "lib/prism/translation/parser40.rb", + "lib/prism/translation/parser41.rb", "lib/prism/translation/parser/builder.rb", "lib/prism/translation/parser/compiler.rb", "lib/prism/translation/parser/lexer.rb", @@ -125,6 +126,7 @@ Gem::Specification.new do |spec| "rbi/prism/translation/parser34.rbi", "rbi/prism/translation/parser35.rbi", "rbi/prism/translation/parser40.rbi", + "rbi/prism/translation/parser41.rbi", "rbi/prism/translation/ripper.rbi", "rbi/prism/visitor.rbi", "sig/prism.rbs", diff --git a/rbi/prism/translation/parser41.rbi b/rbi/prism/translation/parser41.rbi new file mode 100644 index 0000000000..218682365b --- /dev/null +++ b/rbi/prism/translation/parser41.rbi @@ -0,0 +1,6 @@ +# typed: strict + +class Prism::Translation::Parser40 < Prism::Translation::Parser + sig { override.returns(Integer) } + def version; end +end diff --git a/src/options.c b/src/options.c index 4a8953da7d..09d2a65a6c 100644 --- a/src/options.c +++ b/src/options.c @@ -93,6 +93,11 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length return true; } + if (strncmp(version, "4.1", 3) == 0) { + options->version = PM_OPTIONS_VERSION_CRUBY_4_1; + return true; + } + return false; } @@ -111,6 +116,11 @@ pm_options_version_set(pm_options_t *options, const char *version, size_t length options->version = PM_OPTIONS_VERSION_CRUBY_4_0; return true; } + + if (strncmp(version, "4.1.", 4) == 0) { + options->version = PM_OPTIONS_VERSION_CRUBY_4_1; + return true; + } } if (length >= 6) { diff --git a/test/prism/api/parse_test.rb b/test/prism/api/parse_test.rb index bb1761109f..bbf28201ff 100644 --- a/test/prism/api/parse_test.rb +++ b/test/prism/api/parse_test.rb @@ -122,6 +122,9 @@ def test_version assert Prism.parse_success?("1 + 1", version: "4.0") assert Prism.parse_success?("1 + 1", version: "4.0.0") + assert Prism.parse_success?("1 + 1", version: "4.1") + assert Prism.parse_success?("1 + 1", version: "4.1.0") + assert Prism.parse_success?("1 + 1", version: "latest") # Test edge case diff --git a/test/prism/test_helper.rb b/test/prism/test_helper.rb index f78e68e87c..43771110b4 100644 --- a/test/prism/test_helper.rb +++ b/test/prism/test_helper.rb @@ -241,7 +241,7 @@ def self.windows? end # All versions that prism can parse - SYNTAX_VERSIONS = %w[3.3 3.4 4.0] + SYNTAX_VERSIONS = %w[3.3 3.4 4.0 4.1] # `RUBY_VERSION` with the patch version excluded CURRENT_MAJOR_MINOR = RUBY_VERSION.split(".")[0, 2].join(".")