From: "Eregon (Benoit Daloze) via ruby-core" Date: 2025-10-02T09:15:12+00:00 Subject: [ruby-core:123370] [Ruby Bug#21618] Allow to use the build-in prism version to parse code Issue #21618 has been updated by Eregon (Benoit Daloze). Why is `Prism.parse_file(filepath, version: RUBY_VERSION)` not good enough? In which concrete scenarios does it not work? The `prism` default gem shipped with Ruby 3.3+ will always support `version: RUBY_VERSION`. Another `prism` version might be used when using `bundler` or installing a newer `prism` (e.g. `gem install prism`). If that prism version is newer, `version: RUBY_VERSION` will work. If that prism version is older, it's possible it doesn't recognize the RUBY_VERSION. That case though could be seen as "that old prism doesn't support a recent Ruby", i.e. the prism dependency should be updated to be less old. In that sense it's not different than many other gems with older versions which might not work on the newest Ruby version. Another POV here is: either `prism` is not specified in the Gemfile, and `version: RUBY_VERSION` will always work, or it's specified in the Gemfile and then it's the responsibility of the maintainers of that Gemfile to keep it recent enough, e.g. by not using a `Gemfile.lock` or by regularly updating the `Gemfile.lcok`, at least when supported a new Ruby version (which is the same workflow as for other gem dependencies). --- I'm guessing what you are asking is to get the Prism Ruby API for the prism C parser used by the Ruby interpreter to parse Ruby code? I think that cannot be provided easily, because it would conflict with the prism gem, of which another version might be loaded. I suppose one could try to nest that "current Ruby" Prism Ruby API under a different module than `::Prism`, but it feels suboptimal and complicated, I think there is not a strong enough need to justify such complexity. ---------------------------------------- Bug #21618: Allow to use the build-in prism version to parse code https://bugs.ruby-lang.org/issues/21618#change-114741 * Author: Earlopain (Earlopain _) * Status: Open * Backport: 3.2: UNKNOWN, 3.3: UNKNOWN, 3.4: UNKNOWN ---------------------------------------- Prism is a multi-version parser, which is a great feature. If one calls `Prism.parse("foo")`, it will always use the latest version prism knows about. This may or may not be the version that is currently executing. This is problematic when one wants to introspect code the same way that the currently running ruby version would. Consider that some syntax will be disallowed in the next ruby version. I would have to specify the ruby version I want to parse as in order to not run into syntax errors: `Prism.parse("foo", version: RUBY_VERSION)`. But doing so is not feasable because `prism` is distributed out of sync with ruby itself. If the user already has prism in their lockfile, the user may run a prism version that doesn't yet know about lets say ruby 4.0 and thus raise. Similarly, it may parse as an older patch version that has subtle behaviour differences. `ripper` does not have this issue because it is always tied to the ruby version and it is not distributed as a gem, so what the user has will always be exactly what ruby shipped with. I wish for a similar API that utilizes the prism version bundled with ruby itself. Libraries like `rails` have moved from ripper to prism because of its superior developer experience but it risks breaking in unexpected ways with new `prism` versions that know about more recent syntax. `error_highlight` for example also suffers from the same defect. It seems like prism currently has 34 methods that optionally take a version (per the rbi file). Many of these are trivial helper methods like `Prism.parse_success?` (does the parse result have any errors?). I would be happy with supporting only the minimal functions like `Prism.parse` and `Prism.parse_file`. Currently I don't have a use-case for any of the other methods. Pretty much just functions to mirror `RubyVM::InstructionSequence.compile_file` and `RubyVM::InstructionSequence.compile`. It would be optimal if I would be able to transparently call `Prism.parse("foo", version: "current")` (or maybe even have an unspecified version mean the build-in prism version) but I am not sure how feasable that is since I'm pretty sure logic for this would have to live in ruby itself. @kddnewton does this feature request make sense? Do you have any other ideas/inputs? -- https://bugs.ruby-lang.org/ ______________________________________________ ruby-core mailing list -- ruby-core@ml.ruby-lang.org To unsubscribe send an email to ruby-core-leave@ml.ruby-lang.org ruby-core info -- https://ml.ruby-lang.org/mailman3/lists/ruby-core.ml.ruby-lang.org/