Repository: ruby/prism
Pull request #2099 (2023-12-15 19:36:42)

RBS type fixes for positional parameters
Hello, I noticed there was mismatches between definitions of Node methods which used positional parameters and the RBS definitions which used keyword. This PR adjusts the templates to emit positional. I also updated prism_static.rbs based on the changes I saw in the other classes.

Question: I used steep to figure out what needed work. Do you want to add tests to prevent stuff from going out of sync, or is it too soon?


Patch:
diff --git a/.github/workflows/rust-bindings.yml b/.github/workflows/rust-bindings.yml
index 0887496c..1544f5b0 100644
--- a/.github/workflows/rust-bindings.yml
+++ b/.github/workflows/rust-bindings.yml
@@ -104,37 +104,3 @@ jobs:
           components: "rust-src"
       - name: Test with sanitizer
         run: bundle exec rake cargo:sanitize:${{ matrix.sanitizer }}
-
-  # We need to figure out what to do here. When you run publish it checks
-  # against the latest version published to crates, which means if we have any
-  # breaking changes in the bindings then this fails.
-  #
-  # publish:
-  #   name: cargo:publish
-  #   strategy:
-  #     fail-fast: false
-  #   runs-on: ubuntu-latest
-  #   steps:
-  #     - uses: actions/checkout@v3
-  #     - name: Set up Ruby
-  #       uses: ruby/setup-ruby@v1
-  #       with:
-  #         ruby-version: head
-  #         bundler-cache: true
-  #     - name: Set up Rust
-  #       uses: dtolnay/rust-toolchain@master
-  #       with:
-  #         toolchain: "1.71.1"
-  #         targets: wasm32-wasi
-  #     - uses: actions/cache@v3
-  #       with:
-  #         path: |
-  #           ~/.cargo/registry
-  #           ~/.cargo/git
-  #           target
-  #         key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
-  #         restore-keys: |
-  #           ${{ runner.os }}-cargo-${{ hashFiles('Cargo.toml') }}
-  #           ${{ runner.os }}-cargo
-  #     - name: Publish crates (dry-run)
-  #       run: bundle exec rake cargo:publish:dry
diff --git a/README.md b/README.md
index 0e2b57b5..f26bdac1 100644
--- a/README.md
+++ b/README.md
@@ -32,8 +32,8 @@ The repository contains the infrastructure for both a shared library (libprism)
 │   └── prism.rb          main entrypoint for the Ruby library
 ├── rakelib               various Rake tasks for the project
 ├── rust
-│   ├── ruby-prism        Rustified crate for the shared library
-│   └── ruby-prism-sys    FFI binding for Rust
+│   ├── prism             Rustified crate for the shared library
+│   └── prism-sys         FFI binding for Rust
 ├── src
 │   ├── enc               various encoding files
 │   ├── util              various utility files
diff --git a/config.yml b/config.yml
index 7bbe88e6..d3b6b087 100644
--- a/config.yml
+++ b/config.yml
@@ -368,8 +368,8 @@ flags:
     comment: Flags for integer nodes that correspond to the base of the integer.
   - name: KeywordHashNodeFlags
     values:
-      - name: SYMBOL_KEYS
-        comment: "a keyword hash which only has `AssocNode` elements all with symbol keys, which means the elements can be treated as keyword arguments"
+      - name: STATIC_KEYS
+        comment: "a keyword hash which only has `AssocNode` elements all with static literal keys, which means the elements can be treated as keyword arguments"
     comment: Flags for keyword hash nodes.
   - name: LoopFlags
     values:
diff --git a/docs/releasing.md b/docs/releasing.md
index ae6548b3..f19215a5 100644
--- a/docs/releasing.md
+++ b/docs/releasing.md
@@ -13,13 +13,13 @@ To release a new version of Prism, perform the following steps:
   * `ext/prism/extension.h` in the `EXPECTED_PRISM_VERSION` macro
   * `include/prism/version.h` in the version macros
   * `javascript/package.json` in the `version` field
-  * `rust/ruby-prism-sys/tests/utils_tests.rs` in the `version_test` function
+  * `rust/prism-sys/tests/utils_tests.rs` in the `version_test` function
   * `templates/java/org/prism/Loader.java.erb` in the `load` function
   * `templates/javascript/src/deserialize.js.erb` in the version constants
   * `templates/lib/prism/serialize.rb.erb` in the version constants
 * Run `bundle install` to update the `Gemfile.lock` file.
-* Update `rust/ruby-prism-sys/Cargo.toml` to match the new version and run `cargo build`
-* Update `rust/ruby-prism/Cargo.toml` to match the new version and run `cargo build`
+* Update `rust/prism-sys/Cargo.toml` to match the new version and run `cargo build`
+* Update `rust/prism/Cargo.toml` to match the new version and run `cargo build`
 * Commit all of the updated files.
 
 ## Publishing
diff --git a/include/prism/parser.h b/include/prism/parser.h
index 2c58131b..7f26054f 100644
--- a/include/prism/parser.h
+++ b/include/prism/parser.h
@@ -17,6 +17,12 @@
 
 #include <stdbool.h>
 
+// TODO: remove this by renaming the original flag
+/**
+ * Temporary alias for the PM_NODE_FLAG_STATIC_KEYS flag.
+ */
+#define PM_KEYWORD_HASH_NODE_FLAGS_SYMBOL_KEYS PM_KEYWORD_HASH_NODE_FLAGS_STATIC_KEYS
+
 /**
  * This enum provides various bits that represent different kinds of states that
  * the lexer can track. This is used to determine which kind of token to return
diff --git a/rakelib/cargo.rake b/rakelib/cargo.rake
index e7e98afb..c989d70d 100644
--- a/rakelib/cargo.rake
+++ b/rakelib/cargo.rake
@@ -1,11 +1,10 @@
 namespace :cargo do
-  CRATES = ["ruby-prism-sys", "ruby-prism"]
+  CRATES = ["prism-sys", "prism"]
 
   desc "Build and test the Rust packages"
   task build: [:templates] do
     gemspec = Gem::Specification.load("prism.gemspec")
-
-    prism_sys_dir = Pathname(File.expand_path(File.join(__dir__, "../rust", "ruby-prism-sys")))
+    prism_sys_dir = Pathname(File.expand_path(File.join(__dir__, "../rust", "prism-sys")))
     prism_sys_vendor_dir = prism_sys_dir.join("vendor/prism-#{gemspec.version}")
 
     rm_rf(prism_sys_vendor_dir)
@@ -13,21 +12,11 @@ namespace :cargo do
     cp_r("./include", prism_sys_vendor_dir.join("include"))
     cp_r("./src", prism_sys_vendor_dir.join("src"))
 
-    prism_dir = Pathname(File.expand_path(File.join(__dir__, "../rust", "ruby-prism")))
-    prism_vendor_dir = prism_dir.join("vendor/prism-#{gemspec.version}")
-
-    rm_rf(prism_vendor_dir)
-    mkdir_p(prism_vendor_dir)
-    cp(File.expand_path("../config.yml", __dir__), prism_vendor_dir.join("config.yml"))
-
     # Align the Cargo.toml version with the gemspec version
     CRATES.each do |crate|
       cargo_toml_path = Pathname.new("rust/#{crate}/Cargo.toml")
       old_cargo_toml = cargo_toml_path.read
-      new_cargo_toml = old_cargo_toml
-        .gsub(/^version = ".*"/, %(version = "#{gemspec.version}"))
-        .gsub(/^ruby-prism-sys = { version = ".*",/, %(ruby-prism-sys = { version = "#{gemspec.version}",))
-
+      new_cargo_toml = old_cargo_toml.gsub(/^version = ".*"/, %(version = "#{gemspec.version}"))
       File.write(cargo_toml_path, new_cargo_toml)
     end
   end
@@ -43,7 +32,7 @@ namespace :cargo do
 
   desc "Run all examples"
   task examples: [:build] do
-    Dir.chdir("rust/ruby-prism") do
+    Dir.chdir("rust/prism") do
       Dir.glob("examples/*").each do |example|
         puts "Running #{example}"
 
@@ -124,7 +113,7 @@ namespace :cargo do
       CRATES.each do |crate|
         Dir.chdir("rust/#{crate}") do
           puts "🚢 Publishing #{crate} to crates.io"
-          sh "cargo publish --allow-dirty"
+          sh "cargo publish --dry-run"
         end
       end
     end
@@ -143,7 +132,7 @@ namespace :cargo do
       CRATES.each do |crate|
         Dir.chdir("rust/#{crate}") do
           puts "🌵 [dry-run] Checking publish of #{crate} to crates.io"
-          sh "cargo publish --dry-run --allow-dirty"
+          sh "cargo publish --dry-run"
         end
       end
     end
diff --git a/rust/Cargo.toml b/rust/Cargo.toml
deleted file mode 100644
index f7abf574..00000000
--- a/rust/Cargo.toml
+++ /dev/null
@@ -1,7 +0,0 @@
-[workspace]
-members = [
-  "ruby-prism",
-  "ruby-prism-sys",
-]
-
-resolver = "2" # Use 2021 edition
diff --git a/rust/ruby-prism-sys/.gitignore b/rust/prism-sys/.gitignore
similarity index 100%
rename from rust/ruby-prism-sys/.gitignore
rename to rust/prism-sys/.gitignore
diff --git a/rust/prism-sys/Cargo.lock b/rust/prism-sys/Cargo.lock
new file mode 100644
index 00000000..91c3600a
--- /dev/null
+++ b/rust/prism-sys/Cargo.lock
@@ -0,0 +1,283 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.66.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
+dependencies = [
+ "bitflags",
+ "cexpr",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "log",
+ "peeking_take_while",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+ "syn",
+ "which",
+]
+
+[[package]]
+name = "bitflags"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
+
+[[package]]
+name = "cc"
+version = "1.0.83"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cexpr"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
+dependencies = [
+ "nom",
+]
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "clang-sys"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "either"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "lazycell"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
+
+[[package]]
+name = "libc"
+version = "0.2.147"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
+
+[[package]]
+name = "libloading"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f"
+dependencies = [
+ "cfg-if",
+ "winapi",
+]
+
+[[package]]
+name = "log"
+version = "0.4.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4"
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "minimal-lexical"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
+
+[[package]]
+name = "nom"
+version = "7.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
+dependencies = [
+ "memchr",
+ "minimal-lexical",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "prettyplease"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62"
+dependencies = [
+ "proc-macro2",
+ "syn",
+]
+
+[[package]]
+name = "prism-sys"
+version = "0.19.0"
+dependencies = [
+ "bindgen",
+ "cc",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.66"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "regex"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-syntax"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
+
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
+[[package]]
+name = "shlex"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
+
+[[package]]
+name = "syn"
+version = "2.0.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
+
+[[package]]
+name = "which"
+version = "4.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
+dependencies = [
+ "either",
+ "libc",
+ "once_cell",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
diff --git a/rust/ruby-prism-sys/Cargo.toml b/rust/prism-sys/Cargo.toml
similarity index 96%
rename from rust/ruby-prism-sys/Cargo.toml
rename to rust/prism-sys/Cargo.toml
index b879383b..586f3b68 100644
--- a/rust/ruby-prism-sys/Cargo.toml
+++ b/rust/prism-sys/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "ruby-prism-sys"
+name = "prism-sys"
 version = "0.19.0"
 edition = "2021"
 license-file = "../../LICENSE.md"
diff --git a/rust/ruby-prism-sys/README.md b/rust/prism-sys/README.md
similarity index 92%
rename from rust/ruby-prism-sys/README.md
rename to rust/prism-sys/README.md
index 56fb0cff..794f40b4 100644
--- a/rust/ruby-prism-sys/README.md
+++ b/rust/prism-sys/README.md
@@ -1,4 +1,4 @@
-# ruby-prism-sys
+# prism-sys
 
 Rust bindings to [ruby/prism](https://github.com/ruby/prism)'s C API.
 
@@ -10,7 +10,7 @@ Currently the best examples are found in the integration tests (in `tests/`).
 
 Since this crate has not been released, docs are not yet online anywhere. You can generate them,
 however, from this directory in this repo by running `cargo doc`, then opening
-`target/doc/ruby_prism_sys/index.html` in your browser. (You could, instead, combine those two steps by
+`target/doc/prism_sys/index.html` in your browser. (You could, instead, combine those two steps by
 doing `cargo doc --open`!)
 
 ## Development
diff --git a/rust/ruby-prism-sys/build/main.rs b/rust/prism-sys/build/main.rs
similarity index 100%
rename from rust/ruby-prism-sys/build/main.rs
rename to rust/prism-sys/build/main.rs
diff --git a/rust/ruby-prism-sys/build/vendored.rs b/rust/prism-sys/build/vendored.rs
similarity index 100%
rename from rust/ruby-prism-sys/build/vendored.rs
rename to rust/prism-sys/build/vendored.rs
diff --git a/rust/ruby-prism-sys/rustfmt.toml b/rust/prism-sys/rustfmt.toml
similarity index 100%
rename from rust/ruby-prism-sys/rustfmt.toml
rename to rust/prism-sys/rustfmt.toml
diff --git a/rust/ruby-prism-sys/src/lib.rs b/rust/prism-sys/src/lib.rs
similarity index 97%
rename from rust/ruby-prism-sys/src/lib.rs
rename to rust/prism-sys/src/lib.rs
index ecaf83a8..702e0579 100644
--- a/rust/ruby-prism-sys/src/lib.rs
+++ b/rust/prism-sys/src/lib.rs
@@ -1,4 +1,4 @@
-//! # ruby-prism-sys
+//! # prism-sys
 //!
 //! FFI-bindings for `prism`.
 //!
diff --git a/rust/ruby-prism/.gitignore b/rust/prism/.gitignore
similarity index 96%
rename from rust/ruby-prism/.gitignore
rename to rust/prism/.gitignore
index 6c73f667..7f88f54a 100644
--- a/rust/ruby-prism/.gitignore
+++ b/rust/prism/.gitignore
@@ -1,7 +1,6 @@
 # will have compiled files and executables
 debug/
 target/
-vendor/
 
 # These are backup files generated by rustfmt
 **/*.rs.bk
diff --git a/rust/Cargo.lock b/rust/prism/Cargo.lock
similarity index 51%
rename from rust/Cargo.lock
rename to rust/prism/Cargo.lock
index c5ef5364..c9cca905 100644
--- a/rust/Cargo.lock
+++ b/rust/prism/Cargo.lock
@@ -4,9 +4,9 @@ version = 3
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.2"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a"
 dependencies = [
  "memchr",
 ]
@@ -36,9 +36,9 @@ dependencies = [
 
 [[package]]
 name = "bitflags"
-version = "2.4.1"
+version = "2.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
+checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
 
 [[package]]
 name = "cc"
@@ -87,16 +87,6 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
-[[package]]
-name = "errno"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "glob"
 version = "0.3.1"
@@ -105,24 +95,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
 
 [[package]]
 name = "hashbrown"
-version = "0.14.3"
+version = "0.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
-
-[[package]]
-name = "home"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
-dependencies = [
- "windows-sys 0.48.0",
-]
+checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a"
 
 [[package]]
 name = "indexmap"
-version = "2.1.0"
+version = "2.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
+checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d"
 dependencies = [
  "equivalent",
  "hashbrown",
@@ -148,9 +129,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
 
 [[package]]
 name = "libc"
-version = "0.2.150"
+version = "0.2.147"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
+checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
 
 [[package]]
 name = "libloading"
@@ -162,12 +143,6 @@ dependencies = [
  "winapi",
 ]
 
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
-
 [[package]]
 name = "log"
 version = "0.4.20"
@@ -176,9 +151,9 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
 
 [[package]]
 name = "memchr"
-version = "2.6.4"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
 
 [[package]]
 name = "minimal-lexical"
@@ -210,37 +185,54 @@ checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
 
 [[package]]
 name = "prettyplease"
-version = "0.2.15"
+version = "0.2.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d"
+checksum = "6c64d9ba0963cdcea2e1b2230fbae2bab30eb25a174be395c41e764bfb65dd62"
 dependencies = [
  "proc-macro2",
  "syn",
 ]
 
+[[package]]
+name = "prism"
+version = "0.19.0"
+dependencies = [
+ "prism-sys",
+ "serde",
+ "serde_yaml",
+]
+
+[[package]]
+name = "prism-sys"
+version = "0.19.0"
+dependencies = [
+ "bindgen",
+ "cc",
+]
+
 [[package]]
 name = "proc-macro2"
-version = "1.0.70"
+version = "1.0.66"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
+checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.33"
+version = "1.0.32"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
+checksum = "50f3b39ccfb720540debaa0164757101c08ecb8d326b15358ce76a62c7e85965"
 dependencies = [
  "proc-macro2",
 ]
 
 [[package]]
 name = "regex"
-version = "1.10.2"
+version = "1.9.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343"
+checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -250,9 +242,9 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.3"
+version = "0.3.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f"
+checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -261,26 +253,9 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.2"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
-
-[[package]]
-name = "ruby-prism"
-version = "0.19.0"
-dependencies = [
- "ruby-prism-sys",
- "serde",
- "serde_yaml",
-]
-
-[[package]]
-name = "ruby-prism-sys"
-version = "0.19.0"
-dependencies = [
- "bindgen",
- "cc",
-]
+checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
 
 [[package]]
 name = "rustc-hash"
@@ -288,19 +263,6 @@ version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
 
-[[package]]
-name = "rustix"
-version = "0.38.26"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a"
-dependencies = [
- "bitflags",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.52.0",
-]
-
 [[package]]
 name = "ryu"
 version = "1.0.15"
@@ -309,18 +271,18 @@ checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
 
 [[package]]
 name = "serde"
-version = "1.0.193"
+version = "1.0.183"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
+checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.193"
+version = "1.0.183"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
+checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -329,9 +291,9 @@ dependencies = [
 
 [[package]]
 name = "serde_yaml"
-version = "0.9.27"
+version = "0.9.25"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cc7a1570e38322cfe4154732e5110f887ea57e22b76f4bfd32b5bdd3368666c"
+checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574"
 dependencies = [
  "indexmap",
  "itoa",
@@ -342,15 +304,15 @@ dependencies = [
 
 [[package]]
 name = "shlex"
-version = "1.2.0"
+version = "1.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380"
+checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
 
 [[package]]
 name = "syn"
-version = "2.0.39"
+version = "2.0.28"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
+checksum = "04361975b3f5e348b2189d8dc55bc942f278b2d482a6a0365de5bdd62d351567"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -359,9 +321,9 @@ dependencies = [
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.12"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c"
 
 [[package]]
 name = "unsafe-libyaml"
@@ -371,14 +333,13 @@ checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa"
 
 [[package]]
 name = "which"
-version = "4.4.2"
+version = "4.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269"
 dependencies = [
  "either",
- "home",
+ "libc",
  "once_cell",
- "rustix",
 ]
 
 [[package]]
@@ -402,135 +363,3 @@ name = "winapi-x86_64-pc-windows-gnu"
 version = "0.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows-sys"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
-dependencies = [
- "windows-targets 0.52.0",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "windows_aarch64_gnullvm 0.48.5",
- "windows_aarch64_msvc 0.48.5",
- "windows_i686_gnu 0.48.5",
- "windows_i686_msvc 0.48.5",
- "windows_x86_64_gnu 0.48.5",
- "windows_x86_64_gnullvm 0.48.5",
- "windows_x86_64_msvc 0.48.5",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
diff --git a/rust/ruby-prism/Cargo.toml b/rust/prism/Cargo.toml
similarity index 78%
rename from rust/ruby-prism/Cargo.toml
rename to rust/prism/Cargo.toml
index 64bb0205..228b51be 100644
--- a/rust/ruby-prism/Cargo.toml
+++ b/rust/prism/Cargo.toml
@@ -1,5 +1,5 @@
 [package]
-name = "ruby-prism"
+name = "prism"
 version = "0.19.0"
 edition = "2021"
 license-file = "../../LICENSE.md"
@@ -19,15 +19,14 @@ categories = [
 ]
 
 # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
-include = ["src/", "build.rs", "Cargo.toml", "Cargo.lock", "vendor"]
 
 [build-dependencies]
 serde = { version = "1.0", features = ["derive"] }
 serde_yaml = "0.9"
 
 [dependencies]
-ruby-prism-sys = { version = "0.19.0", path = "../ruby-prism-sys" }
+prism-sys = { path = "../prism-sys" }
 
 [features]
 default = ["vendored"]
-vendored = ["ruby-prism-sys/vendored"]
+vendored = ["prism-sys/vendored"]
diff --git a/rust/ruby-prism/build.rs b/rust/prism/build.rs
similarity index 97%
rename from rust/ruby-prism/build.rs
rename to rust/prism/build.rs
index bb235af5..d9283373 100644
--- a/rust/ruby-prism/build.rs
+++ b/rust/prism/build.rs
@@ -3,7 +3,7 @@
 use serde::Deserialize;
 use std::fs::File;
 use std::io::Write;
-use std::path::Path;
+use std::path::PathBuf;
 
 #[derive(Debug, Deserialize)]
 enum NodeFieldType {
@@ -88,18 +88,27 @@ struct Config {
 /// building the library.
 ///
 fn main() -> Result<(), Box<dyn std::error::Error>> {
-    let prism_dir = format!("prism-{}", env!("CARGO_PKG_VERSION"));
-    let config_path = Path::new(env!("CARGO_MANIFEST_DIR")).join("vendor").join(prism_dir).join("config.yml");
+    let path = config_path();
+    let file = std::fs::File::open(&path)?;
+    println!("cargo:rerun-if-changed={}", path.to_str().unwrap());
+    let config: Config = serde_yaml::from_reader(file)?;
 
-    let config_file = std::fs::File::open(&config_path)?;
-    println!("cargo:rerun-if-changed={}", config_path.to_str().unwrap());
-
-    let config: Config = serde_yaml::from_reader(config_file)?;
     write_bindings(&config)?;
-
     Ok(())
 }
 
+/// Gets the path to the config.yml file at `[root]/config.yml`.
+///
+fn config_path() -> PathBuf {
+    cargo_manifest_path().join("../../config.yml").canonicalize().unwrap()
+}
+
+/// Gets the path to the root directory at `[root]`.
+///
+fn cargo_manifest_path() -> PathBuf {
+    PathBuf::from(std::env::var_os("CARGO_MANIFEST_DIR").unwrap())
+}
+
 /// Returns the name of a C struct from the given node name.
 fn struct_name(name: &str) -> String {
     let mut result = String::with_capacity(1 + name.len());
@@ -484,18 +493,17 @@ fn write_visit(file: &mut File, config: &Config) -> Result<(), Box<dyn std::erro
 /// Write the bindings to the `$OUT_DIR/bindings.rs` file. We'll pull these into
 /// the actual library in `src/lib.rs`.
 fn write_bindings(config: &Config) -> Result<(), Box<dyn std::error::Error>> {
-    let out_dir = std::env::var_os("OUT_DIR").unwrap();
-    let dest_path = Path::new(&out_dir).join("bindings.rs");
-    let mut file = std::fs::File::create(&dest_path).expect("Unable to create file");
+    let out_path = PathBuf::from(std::env::var_os("OUT_DIR").unwrap()).join("bindings.rs");
+    let mut file = std::fs::File::create(&out_path).expect("Unable to create file");
 
-    write!(
+    writeln!(
         file,
         r#"
 use std::marker::PhantomData;
 use std::ptr::NonNull;
 
 #[allow(clippy::wildcard_imports)]
-use ruby_prism_sys::*;
+use prism_sys::*;
 
 /// A range in the source file.
 pub struct Location<'pr> {{
diff --git a/rust/ruby-prism/examples/wasm/main.rs b/rust/prism/examples/wasm/main.rs
similarity index 88%
rename from rust/ruby-prism/examples/wasm/main.rs
rename to rust/prism/examples/wasm/main.rs
index bfb8e002..2ab01191 100644
--- a/rust/ruby-prism/examples/wasm/main.rs
+++ b/rust/prism/examples/wasm/main.rs
@@ -3,7 +3,7 @@ use std::io::{stdin, Read};
 fn main() {
     let mut source = String::new();
     stdin().read_to_string(&mut source).unwrap();
-    let result = ruby_prism::parse(source.as_ref());
+    let result = prism::parse(source.as_ref());
     let comments_count = result.comments().count();
     let warnings_count = result.warnings().count();
     let errors_count = result.errors().count();
diff --git a/rust/ruby-prism/examples/wasm/run.sh b/rust/prism/examples/wasm/run.sh
similarity index 100%
rename from rust/ruby-prism/examples/wasm/run.sh
rename to rust/prism/examples/wasm/run.sh
diff --git a/rust/ruby-prism/rustfmt.toml b/rust/prism/rustfmt.toml
similarity index 100%
rename from rust/ruby-prism/rustfmt.toml
rename to rust/prism/rustfmt.toml
diff --git a/rust/ruby-prism/src/lib.rs b/rust/prism/src/lib.rs
similarity index 99%
rename from rust/ruby-prism/src/lib.rs
rename to rust/prism/src/lib.rs
index 54919fad..7b444825 100644
--- a/rust/ruby-prism/src/lib.rs
+++ b/rust/prism/src/lib.rs
@@ -1,4 +1,4 @@
-//! # ruby-prism
+//! # prism
 //!
 //! Rustified version of Ruby's prism parser.
 //!
@@ -19,7 +19,7 @@ use std::mem::MaybeUninit;
 use std::ptr::NonNull;
 
 pub use self::bindings::*;
-use ruby_prism_sys::{pm_comment_t, pm_diagnostic_t, pm_node_destroy, pm_node_t, pm_parse, pm_parser_free, pm_parser_init, pm_parser_t};
+use prism_sys::{pm_comment_t, pm_diagnostic_t, pm_node_destroy, pm_node_t, pm_parse, pm_parser_free, pm_parser_init, pm_parser_t};
 
 /// A diagnostic message that came back from the parser.
 #[derive(Debug)]
diff --git a/sig/prism_static.rbs b/sig/prism_static.rbs
index d5a45f67..d94e5dc4 100644
--- a/sig/prism_static.rbs
+++ b/sig/prism_static.rbs
@@ -1,32 +1,79 @@
 module Prism
-  class ParseResult
-    def value: () -> ProgramNode
-    def comments: () -> Array[Comment]
-    def errors: () -> Array[ParseError]
-    def warnings: () -> Array[ParseWarning]
-    def source: () -> Source
+  BACKEND: :CEXT | :FFI
+  VERSION: String
+
+  def self.parse: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[ProgramNode]
+  def self.lex: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[Array[[Token, Integer]]]
+  def self.parse_lex: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[[ProgramNode, Array[[Token, Integer]]]]
+  def self.dump: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> String
+  def self.parse_comments: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> Array[Comment]
+  def self.parse_success?: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> bool
+  def self.parse_failure?: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> bool
+
+  def self.parse_file: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[ProgramNode]
+  def self.lex_file: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[Array[[Token, Integer]]]
+  def self.parse_lex_file: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[[ProgramNode, Array[[Token, Integer]]]]
+  def self.dump_file: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> String
+  def self.parse_file_comments: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> Array[Comment]
+  def self.parse_file_failure?: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> bool
+  def self.parse_file_success?: (String filepath, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> bool
+
+  def self.load: (String source, String serialized) -> ParseResult[ProgramNode]
+
+  type ripper_token = [[Integer, Integer], Symbol, String, untyped]
+  def self.lex_compat: (String source, ?filepath: String, ?line: Integer, ?encoding: Encoding, ?frozen_string_literal: bool, ?verbose: bool, ?scopes: Array[Array[Symbol]]) -> ParseResult[Array[ripper_token]]
+  def self.lex_ripper: (String source) -> Array[ripper_token]
+
+  class ParseResult[T]
+    attr_reader value: T
+    attr_reader comments: Array[Comment]
+    attr_reader magic_comments: Array[MagicComment]
+    attr_reader data_loc: Location?
+    attr_reader errors: Array[ParseError]
+    attr_reader warnings: Array[ParseWarning]
+    attr_reader source: Source
+
+    def initialize: (T value, Array[Comment] comments, Array[MagicComment] magic_comments, Location? data_loc, Array[ParseError] errors, Array[ParseWarning] warnings, Source source) -> void
+    def deconstruct_keys: (Array[Symbol] keys) -> { value: T, comments: Array[Comment], magic_comments: Array[MagicComment], data_loc: Location?, errors: Array[ParseError], warnings: Array[ParseWarning] }
+    def success?: () -> bool
+    def failure?: () -> bool
   end
 
   class ParseError
-    def message: () -> String
-    def location: () -> Location
+    attr_reader message: String
+    attr_reader location: Location
+
+    def initialize: (String message, Location location) -> void
+    def deconstruct_keys: (Array[Symbol] keys) -> { message: String, location: Location }
   end
 
   class ParseWarning
-    def message: () -> String
-    def location: () -> Location
+    attr_reader message: String
+    attr_reader location: Location
+
+    def initialize: (String message, Location location) -> void
+    def deconstruct_keys: (Array[Symbol] keys) -> { message: String, location: Location }
   end
 
   class Node
+    @newline: bool
+
+    attr_reader location: Location
+
     def child_nodes: () -> Array[Node?]
-    def location: () -> Location
+    def newline?: () -> bool
+    def set_newline_flag: (Array[bool] newline_marked) -> void
     def slice: () -> String
+    def pretty_print: (untyped q) -> untyped
+    def inspect: (?NodeInspector inspector) -> String  # TODO: not right, only is defined on subclasses
     def to_dot: () -> String
   end
 
   class Comment
-    def location: () -> Location
-    def trailing?: () -> bool
+    attr_reader location: Location
+
+    def initialize: (Location location) -> void
+    def deconstruct_keys: (Array[Symbol] keys) -> { location: Location }
   end
 
   class InlineComment < Comment
@@ -34,22 +81,45 @@ module Prism
   end
 
   class EmbDocComment < Comment
+    def trailing?: () -> false
   end
 
-  class DATAComment < Comment
+  class MagicComment
+    attr_reader key_loc: Location
+    attr_reader value_loc: Location
+
+    def initialize: (Location key_loc, Location value_loc) -> void
+
+    def key: () -> String
+    def value: () -> String
+
+    def deconstruct_keys: (Array[Symbol] keys) -> { key_loc: Location, value_loc: Location }
   end
 
   class Location
-    def initialize: (source: Source, start_offset: Integer, length: Integer) -> void
+    attr_reader source: Source | nil
+    attr_reader start_offset: Integer
+    attr_reader length: Integer
+    attr_reader comments: Array[Comment]
+
+    def initialize: (Source? source, Integer start_offset, Integer length) -> void
+    def copy: (?source: Source, ?start_offset: Integer, ?length: Integer) -> Location
     def slice: () -> String
-    def comments: () -> Array[Comment]
-    def copy: (**untyped) -> Location
-    def start_offset: () -> Integer
+    def start_character_offset: () -> Integer
     def end_offset: () -> Integer
+    def end_character_offset: () -> Integer
     def start_line: () -> Integer
+    def start_line_slice: () -> String
     def end_line: () -> Integer
     def start_column: () -> Integer
+    def start_character_column: () -> Integer
     def end_column: () -> Integer
+    def end_character_column: () -> Integer
+    def deconstruct_keys: (Array[Symbol] keys) -> { start_offset: Integer, end_offset: Integer }
+    def pretty_print: (untyped q) -> untyped
+    def join: (Location other) -> Location
+
+    def self.null: () -> Location
   end
 
   class Source
@@ -57,30 +127,24 @@ module Prism
     attr_reader start_line: Integer
     attr_reader offsets: Array[Integer]
 
-    @source: String
-    @start_line: Integer
-    @offsets: Array[Integer]
-
-    def initialize: (source: String, start_line: Integer, offsets: Array[Integer]) -> void
-    def slice: (offset: Integer, length: Integer) -> String
-    def line: (value: Integer) -> Integer
-    def line_offset: (value: Integer) -> Integer
-    def column: (value: Integer) -> Integer
+    def initialize: (String source, ?Integer start_line, ?Array[Integer] offsets) -> void
+    def slice: (Integer byte_offset, Integer length) -> String
+    def line: (Integer byte_offset) -> Integer
+    def line_offset: (Integer byte_offset) -> Integer
+    def column: (Integer byte_offset) -> Integer
+    def character_offset: (Integer byte_offset) -> Integer
+    def character_column: (Integer byte_offset) -> Integer
   end
 
   class Token
-    attr_reader type: untyped
+    attr_reader type: Symbol
     attr_reader value: String
     attr_reader location: Location
 
-    @type: untyped
-    @value: String
-    @location: Location
-
-    def initialize: (type: untyped, value: String, location: Location) -> void
-    def deconstruct_keys: (keys: untyped) -> untyped
-    def pretty_print: (q: untyped) -> untyped
-    def ==: (other: untyped) -> bool
+    def initialize: (Symbol type, String value, Location location) -> void
+    def deconstruct_keys: (Array[Symbol] keys) -> { type: Symbol, value: String, location: Location }
+    def pretty_print: (untyped q) -> untyped
+    def ==: (untyped other) -> bool
   end
 
   class NodeInspector
@@ -90,35 +154,48 @@ module Prism
     @prefix: String
     @output: String
 
-    def initialize: (prefix: String) -> void
+    def initialize: (?String prefix) -> void
 
     # Appends a line to the output with the current prefix.
-    def <<: (line: String) -> void
+    def <<: (String line) -> void
 
     # This generates a string that is used as the header of the inspect output
     # for any given node.
-    def header: (node: Node) -> String
+    def header: (Node node) -> String
 
     # Generates a string that represents a list of nodes. It handles properly
     # using the box drawing characters to make the output look nice.
-    def list: (prefix: String, nodes: Array[Node]) -> String
+    def list: (String prefix, Array[Node] nodes) -> String
 
     # Generates a string that represents a location field on a node.
-    def location: (value: Location) -> String
+    def location: (Location? value) -> String
 
     # Generates a string that represents a child node.
-    def child_node: (node: Node, append: String) -> String
+    def child_node: (Node node, String append) -> String
 
     # Returns a new inspector that can be used to inspect a child node.
-    def child_inspector: (append: String) -> NodeInspector
+    def child_inspector: (String append) -> NodeInspector
 
     # Returns the output as a string.
     def to_str: () -> String
   end
 
   class BasicVisitor
-    def visit: (node: Node?) -> void
-    def visit_all: (nodes: Array[Node?]) -> void
-    def visit_child_nodes: (node: Node) -> void
+    def visit: (Node? node) -> void
+    def visit_all: (Array[Node?] nodes) -> void
+    def visit_child_nodes: (Node node) -> void
+  end
+
+  class Pattern
+    class CompilationError < StandardError
+    end
+
+    attr_reader query: String
+
+    @compiled: Proc
+
+    def initialize: (String query) -> void
+    def compile: () -> Proc
+    def scan: (Node root) -> void
   end
 end
diff --git a/templates/lib/prism/node.rb.erb b/templates/lib/prism/node.rb.erb
index 87a94a03..65a4f0fb 100644
--- a/templates/lib/prism/node.rb.erb
+++ b/templates/lib/prism/node.rb.erb
@@ -44,11 +44,11 @@ module Prism
   <%- end -%>
   class <%= node.name -%> < Node
     <%- node.fields.each do |field| -%>
-    # attr_reader <%= field.name %>: <%= field.rbs_class %>
+    # <%= "private " if field.is_a?(Prism::FlagsField) %>attr_reader <%= field.name %>: <%= field.rbs_class %>
     <%= "private " if field.is_a?(Prism::FlagsField) %>attr_reader :<%= field.name %>
 
     <%- end -%>
-    # def initialize: (<%= (node.fields.map { |field| "#{field.name}: #{field.rbs_class}" } + ["location: Location"]).join(", ") %>) -> void
+    # def initialize: (<%= (node.fields.map { |field| "#{field.rbs_class} #{field.name}" } + ["Location location"]).join(", ") %>) -> void
     def initialize(<%= (node.fields.map(&:name) + ["location"]).join(", ") %>)
       <%- node.fields.each do |field| -%>
       @<%= field.name %> = <%= field.name %>
@@ -56,7 +56,7 @@ module Prism
       @location = location
     end
 
-    # def accept: (visitor: Visitor) -> void
+    # def accept: (Visitor visitor) -> void
     def accept(visitor)
       visitor.visit_<%= node.human %>(self)
     end
@@ -137,7 +137,7 @@ module Prism
     # def deconstruct: () -> Array[nil | Node]
     alias deconstruct child_nodes
 
-    # def deconstruct_keys: (keys: Array[Symbol]) -> Hash[Symbol, nil | Node | Array[Node] | String | Token | Array[Token] | Location]
+    # def deconstruct_keys: (Array[Symbol] keys) -> { <%= (node.fields.map { |field| "#{field.name}: #{field.rbs_class}" } + ["location: Location"]).join(", ") %> }
     def deconstruct_keys(keys)
       { <%= (node.fields.map { |field| "#{field.name}: #{field.name}" } + ["location: location"]).join(", ") %> }
     end
@@ -170,7 +170,7 @@ module Prism
     <%- end -%>
     <%- end -%>
 
-    # def inspect(inspector: NodeInspector) -> String
+    # def inspect(NodeInspector inspector) -> String
     def inspect(inspector = NodeInspector.new)
       inspector << inspector.header(self)
       <%- node.fields.each_with_index do |field, index| -%>
diff --git a/templates/sig/prism.rbs.erb b/templates/sig/prism.rbs.erb
index ee6f294f..e29b047d 100644
--- a/templates/sig/prism.rbs.erb
+++ b/templates/sig/prism.rbs.erb
@@ -5,18 +5,18 @@ module Prism
   <%- end -%>
   class <%= node.name -%> < Node
     <%- node.fields.each do |field| -%>
-    attr_reader <%= field.name %>: <%= field.rbs_class %>
+    <%= "private " if field.is_a?(Prism::FlagsField) %>attr_reader <%= field.name %>: <%= field.rbs_class %>
     <%- end -%>
 
-    def initialize: (<%= (node.fields.map { |field| "#{field.name}: #{field.rbs_class}" } + ["location: Location"]).join(", ") %>) -> void
-    def accept: (visitor: Visitor) -> void
-    def set_newline_flag: (newline_marked: Array[bool]) -> void
+    def initialize: (<%= (node.fields.map { |field| "#{field.rbs_class} #{field.name}" } + ["Location location"]).join(", ") %>) -> void
+    def accept: (Visitor visitor) -> void
+    def set_newline_flag: (Array[bool] newline_marked) -> void
     def child_nodes: () -> Array[Node?]
     def deconstruct: () -> Array[Node?]
 
     def copy: (**untyped) -> <%= node.name %>
 
-    def deconstruct_keys: (keys: Array[Symbol]) -> Hash[Symbol, (Node | Array[Node] | String | Token | Array[Token] | Location)?]
+    def deconstruct_keys: (Array[Symbol] keys) -> { <%= (node.fields.map { |field| "#{field.name}: #{field.rbs_class}" } + ["location: Location"]).join(", ") %> }
     <%- node.fields.each do |field| -%>
     <%- case field -%>
     <%- when Prism::LocationField -%>
@@ -37,7 +37,7 @@ module Prism
     <%- end -%>
     <%- end -%>
 
-    def inspect: (inspector: NodeInspector) -> String
+    def inspect: (?NodeInspector inspector) -> String
   end
   <%- end -%>
 
@@ -55,7 +55,7 @@ module Prism
   class Visitor < BasicVisitor
     <%- nodes.each do |node| -%>
     # Visit a <%= node.name %> node
-    def visit_<%= node.human %>: (node: <%= node.name %>) -> void
+    def visit_<%= node.human %>: (<%= node.name %> node) -> void
     <%= "\n" if node != nodes.last -%>
     <%- end -%>
   end
@@ -64,7 +64,7 @@ module Prism
     private
 
     # Create a new Location object
-    def Location: (source: Source?, start_offset: Integer, length: Integer) -> Location
+    def Location: (?Source? source, ?Integer start_offset, ?Integer length) -> Location
 
     <%- nodes.each do |node| -%>
     # Create a new <%= node.name %> node


Test patch:
diff --git a/rakelib/test.rake b/rakelib/test.rake
index 361f3961..f9837a97 100644
--- a/rakelib/test.rake
+++ b/rakelib/test.rake
@@ -61,7 +61,7 @@ namespace :test do
 
   desc "Run the tests for the rust bindings"
   task :rust do
-    ["rust/ruby-prism", "rust/ruby-prism-sys"].each do |dir|
+    ["rust/prism", "rust/prism-sys"].each do |dir|
       Dir.chdir(dir) do
         sh("cargo test")
       end
diff --git a/rust/ruby-prism-sys/tests/node_tests.rs b/rust/prism-sys/tests/node_tests.rs
similarity index 82%
rename from rust/ruby-prism-sys/tests/node_tests.rs
rename to rust/prism-sys/tests/node_tests.rs
index 87b6c2a3..ce36e037 100644
--- a/rust/ruby-prism-sys/tests/node_tests.rs
+++ b/rust/prism-sys/tests/node_tests.rs
@@ -1,7 +1,7 @@
 use std::{ffi::CString, mem::MaybeUninit};
 
-use ruby_prism_sys::{pm_node_destroy, pm_node_type};
-use ruby_prism_sys::{pm_parse, pm_parser_free, pm_parser_init, pm_parser_t};
+use prism_sys::{pm_node_destroy, pm_node_type};
+use prism_sys::{pm_parse, pm_parser_free, pm_parser_init, pm_parser_t};
 
 #[test]
 fn node_test() {
diff --git a/rust/ruby-prism-sys/tests/pack_tests.rs b/rust/prism-sys/tests/pack_tests.rs
similarity index 99%
rename from rust/ruby-prism-sys/tests/pack_tests.rs
rename to rust/prism-sys/tests/pack_tests.rs
index c729aa6c..6f10a2de 100644
--- a/rust/ruby-prism-sys/tests/pack_tests.rs
+++ b/rust/prism-sys/tests/pack_tests.rs
@@ -1,6 +1,6 @@
 use std::{ffi::CString, mem::MaybeUninit};
 
-use ruby_prism_sys::{
+use prism_sys::{
     pm_pack_encoding, pm_pack_endian, pm_pack_length_type, pm_pack_parse, pm_pack_result, pm_pack_signed, pm_pack_size,
     pm_pack_type, pm_pack_variant, pm_size_to_native,
 };
diff --git a/rust/ruby-prism-sys/tests/parser_tests.rs b/rust/prism-sys/tests/parser_tests.rs
similarity index 99%
rename from rust/ruby-prism-sys/tests/parser_tests.rs
rename to rust/prism-sys/tests/parser_tests.rs
index 6b5ce34c..0088677c 100644
--- a/rust/ruby-prism-sys/tests/parser_tests.rs
+++ b/rust/prism-sys/tests/parser_tests.rs
@@ -4,7 +4,7 @@ use std::{
     path::Path,
 };
 
-use ruby_prism_sys::{
+use prism_sys::{
     pm_comment_t, pm_comment_type_t, pm_diagnostic_t, pm_node_destroy, pm_parse, pm_parser_free, pm_parser_init,
     pm_parser_t,
 };
diff --git a/rust/ruby-prism-sys/tests/utils_tests.rs b/rust/prism-sys/tests/utils_tests.rs
similarity index 95%
rename from rust/ruby-prism-sys/tests/utils_tests.rs
rename to rust/prism-sys/tests/utils_tests.rs
index 8bd548ff..8e9e54b2 100644
--- a/rust/ruby-prism-sys/tests/utils_tests.rs
+++ b/rust/prism-sys/tests/utils_tests.rs
@@ -5,7 +5,7 @@ use std::{
 
 #[test]
 fn version_test() {
-    use ruby_prism_sys::pm_version;
+    use prism_sys::pm_version;
 
     let cstring = unsafe {
         let version = pm_version();
@@ -17,7 +17,7 @@ fn version_test() {
 
 #[test]
 fn list_test() {
-    use ruby_prism_sys::{pm_list_empty_p, pm_list_free, pm_list_t};
+    use prism_sys::{pm_list_empty_p, pm_list_free, pm_list_t};
 
     let mut list = MaybeUninit::<pm_list_t>::zeroed();
 
@@ -31,7 +31,7 @@ fn list_test() {
 }
 
 mod string {
-    use ruby_prism_sys::{
+    use prism_sys::{
         pm_string_free, pm_string_length, pm_string_source, pm_string_t, pm_string_t__bindgen_ty_1, PM_STRING_CONSTANT,
         PM_STRING_MAPPED, PM_STRING_OWNED, PM_STRING_SHARED,
     };
diff --git a/test/prism/snapshots/arrays.txt b/test/prism/snapshots/arrays.txt
index 93f5c8fb..d31cd7af 100644
--- a/test/prism/snapshots/arrays.txt
+++ b/test/prism/snapshots/arrays.txt
@@ -79,7 +79,7 @@
         │   ├── flags: ∅
         │   ├── elements: (length: 1)
         │   │   └── @ KeywordHashNode (location: (5,1)-(5,12))
-        │   │       ├── flags: symbol_keys
+        │   │       ├── flags: static_keys
         │   │       └── elements: (length: 1)
         │   │           └── @ AssocNode (location: (5,1)-(5,12))
         │   │               ├── key:
diff --git a/test/prism/snapshots/if.txt b/test/prism/snapshots/if.txt
index a5ffeac2..6733e57b 100644
--- a/test/prism/snapshots/if.txt
+++ b/test/prism/snapshots/if.txt
@@ -250,7 +250,7 @@
         │   │           │   ├── flags: ∅
         │   │           │   └── arguments: (length: 1)
         │   │           │       └── @ KeywordHashNode (location: (25,4)-(25,6))
-        │   │           │           ├── flags: symbol_keys
+        │   │           │           ├── flags: static_keys
         │   │           │           └── elements: (length: 1)
         │   │           │               └── @ AssocNode (location: (25,4)-(25,6))
         │   │           │                   ├── key:
diff --git a/test/prism/snapshots/method_calls.txt b/test/prism/snapshots/method_calls.txt
index f8de181d..65f0d1df 100644
--- a/test/prism/snapshots/method_calls.txt
+++ b/test/prism/snapshots/method_calls.txt
@@ -782,7 +782,7 @@
         │   │       │   ├── closing_loc: ∅
         │   │       │   └── unescaped: "a"
         │   │       └── @ KeywordHashNode (location: (60,8)-(60,32))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 2)
         │   │               ├── @ AssocNode (location: (60,8)-(60,22))
         │   │               │   ├── key:
@@ -914,7 +914,7 @@
         │   │       │   ├── closing_loc: ∅
         │   │       │   └── unescaped: "a"
         │   │       └── @ KeywordHashNode (location: (64,8)-(64,15))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (64,8)-(64,15))
         │   │                   ├── key:
@@ -983,7 +983,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (66,3)-(66,17))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (66,3)-(66,17))
         │   │                   ├── key:
@@ -1173,7 +1173,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (74,3)-(74,20))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (74,3)-(74,20))
         │   │                   ├── key:
@@ -1236,7 +1236,7 @@
         │   │       │   ├── closing_loc: ∅
         │   │       │   └── unescaped: "a"
         │   │       └── @ KeywordHashNode (location: (82,0)-(82,5))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (82,0)-(82,5))
         │   │                   ├── key:
@@ -1287,7 +1287,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (87,4)-(87,21))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 2)
         │   │               ├── @ AssocNode (location: (87,4)-(87,11))
         │   │               │   ├── key:
@@ -1336,7 +1336,7 @@
         │   │       ├── @ IntegerNode (location: (89,10)-(89,11))
         │   │       │   └── flags: decimal
         │   │       └── @ KeywordHashNode (location: (89,13)-(89,21))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (89,13)-(89,21))
         │   │                   ├── key:
@@ -1527,7 +1527,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (103,4)-(103,11))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (103,4)-(103,11))
         │   │                   ├── key:
@@ -1555,7 +1555,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (105,4)-(105,28))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (105,4)-(105,28))
         │   │                   ├── key:
@@ -1612,7 +1612,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (107,4)-(107,24))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (107,4)-(107,24))
         │   │                   ├── key:
diff --git a/test/prism/snapshots/rescue.txt b/test/prism/snapshots/rescue.txt
index 12607e8b..3f9dc426 100644
--- a/test/prism/snapshots/rescue.txt
+++ b/test/prism/snapshots/rescue.txt
@@ -343,7 +343,7 @@
             │   │           │   ├── flags: ∅
             │   │           │   └── arguments: (length: 1)
             │   │           │       └── @ KeywordHashNode (location: (29,4)-(29,6))
-            │   │           │           ├── flags: symbol_keys
+            │   │           │           ├── flags: static_keys
             │   │           │           └── elements: (length: 1)
             │   │           │               └── @ AssocNode (location: (29,4)-(29,6))
             │   │           │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/assoc_label.txt b/test/prism/snapshots/seattlerb/assoc_label.txt
index c8526358..1d65eef3 100644
--- a/test/prism/snapshots/seattlerb/assoc_label.txt
+++ b/test/prism/snapshots/seattlerb/assoc_label.txt
@@ -15,7 +15,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,2)-(1,5))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,2)-(1,5))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/bug_249.txt b/test/prism/snapshots/seattlerb/bug_249.txt
index c2934914..4c684f32 100644
--- a/test/prism/snapshots/seattlerb/bug_249.txt
+++ b/test/prism/snapshots/seattlerb/bug_249.txt
@@ -66,7 +66,7 @@
             │       │   ├── closing_loc: ∅
             │       │   └── block: ∅
             │       └── @ KeywordHashNode (location: (4,11)-(4,28))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (4,11)-(4,28))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/bug_hash_args.txt b/test/prism/snapshots/seattlerb/bug_hash_args.txt
index 7900bbe0..cea1fc8d 100644
--- a/test/prism/snapshots/seattlerb/bug_hash_args.txt
+++ b/test/prism/snapshots/seattlerb/bug_hash_args.txt
@@ -21,7 +21,7 @@
             │       │   ├── closing_loc: ∅
             │       │   └── unescaped: "bar"
             │       └── @ KeywordHashNode (location: (1,10)-(1,18))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,10)-(1,18))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt b/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt
index 2b2b2462..e4c2a10f 100644
--- a/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt
+++ b/test/prism/snapshots/seattlerb/bug_hash_args_trailing_comma.txt
@@ -21,7 +21,7 @@
             │       │   ├── closing_loc: ∅
             │       │   └── unescaped: "bar"
             │       └── @ KeywordHashNode (location: (1,10)-(1,18))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,10)-(1,18))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt b/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt
index 9426531d..958231a2 100644
--- a/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt
+++ b/test/prism/snapshots/seattlerb/call_args_assoc_quoted.txt
@@ -57,7 +57,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (3,2)-(3,8))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (3,2)-(3,8))
         │   │                   ├── key:
@@ -85,7 +85,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (5,2)-(5,8))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (5,2)-(5,8))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt b/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt
index f572729b..f8cde2f6 100644
--- a/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt
+++ b/test/prism/snapshots/seattlerb/call_array_lit_inline_hash.txt
@@ -24,7 +24,7 @@
             │           │   │   ├── closing_loc: ∅
             │           │   │   └── unescaped: "b"
             │           │   └── @ KeywordHashNode (location: (1,7)-(1,14))
-            │           │       ├── flags: symbol_keys
+            │           │       ├── flags: static_keys
             │           │       └── elements: (length: 1)
             │           │           └── @ AssocNode (location: (1,7)-(1,14))
             │           │               ├── key:
diff --git a/test/prism/snapshots/seattlerb/call_assoc_new.txt b/test/prism/snapshots/seattlerb/call_assoc_new.txt
index decf68ae..6d121252 100644
--- a/test/prism/snapshots/seattlerb/call_assoc_new.txt
+++ b/test/prism/snapshots/seattlerb/call_assoc_new.txt
@@ -15,7 +15,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,2)-(1,5))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,2)-(1,5))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt b/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt
index c9e0ff96..1c079f9d 100644
--- a/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt
+++ b/test/prism/snapshots/seattlerb/call_assoc_new_if_multiline.txt
@@ -15,7 +15,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,2)-(5,3))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,2)-(5,3))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/difficult2_.txt b/test/prism/snapshots/seattlerb/difficult2_.txt
index 72cac371..a81b0ce4 100644
--- a/test/prism/snapshots/seattlerb/difficult2_.txt
+++ b/test/prism/snapshots/seattlerb/difficult2_.txt
@@ -53,7 +53,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (2,2)-(2,6))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (2,2)-(2,6))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/multiline_hash_declaration.txt b/test/prism/snapshots/seattlerb/multiline_hash_declaration.txt
index f377bda1..efa6fa24 100644
--- a/test/prism/snapshots/seattlerb/multiline_hash_declaration.txt
+++ b/test/prism/snapshots/seattlerb/multiline_hash_declaration.txt
@@ -15,7 +15,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (1,2)-(3,1))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,2)-(3,1))
         │   │                   ├── key:
@@ -45,7 +45,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (5,2)-(6,1))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (5,2)-(6,1))
         │   │                   ├── key:
@@ -75,7 +75,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (8,2)-(8,11))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (8,2)-(8,11))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/quoted_symbol_hash_arg.txt b/test/prism/snapshots/seattlerb/quoted_symbol_hash_arg.txt
index 8730eb19..59bd8f02 100644
--- a/test/prism/snapshots/seattlerb/quoted_symbol_hash_arg.txt
+++ b/test/prism/snapshots/seattlerb/quoted_symbol_hash_arg.txt
@@ -15,7 +15,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,5)-(1,12))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,5)-(1,12))
             │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/return_call_assocs.txt b/test/prism/snapshots/seattlerb/return_call_assocs.txt
index 98b7943b..8baf6c4c 100644
--- a/test/prism/snapshots/seattlerb/return_call_assocs.txt
+++ b/test/prism/snapshots/seattlerb/return_call_assocs.txt
@@ -12,7 +12,7 @@
         │           ├── @ IntegerNode (location: (1,7)-(1,8))
         │           │   └── flags: decimal
         │           └── @ KeywordHashNode (location: (1,10)-(1,17))
-        │               ├── flags: symbol_keys
+        │               ├── flags: static_keys
         │               └── elements: (length: 1)
         │                   └── @ AssocNode (location: (1,10)-(1,17))
         │                       ├── key:
@@ -35,7 +35,7 @@
         │           ├── @ IntegerNode (location: (3,7)-(3,8))
         │           │   └── flags: decimal
         │           └── @ KeywordHashNode (location: (3,10)-(3,26))
-        │               ├── flags: symbol_keys
+        │               ├── flags: static_keys
         │               └── elements: (length: 2)
         │                   ├── @ AssocNode (location: (3,10)-(3,17))
         │                   │   ├── key:
@@ -79,7 +79,7 @@
         │               │   ├── flags: ∅
         │               │   └── arguments: (length: 1)
         │               │       └── @ KeywordHashNode (location: (5,9)-(5,14))
-        │               │           ├── flags: symbol_keys
+        │               │           ├── flags: static_keys
         │               │           └── elements: (length: 1)
         │               │               └── @ AssocNode (location: (5,9)-(5,14))
         │               │                   ├── key:
@@ -113,7 +113,7 @@
         │               │   ├── flags: ∅
         │               │   └── arguments: (length: 1)
         │               │       └── @ KeywordHashNode (location: (7,9)-(7,12))
-        │               │           ├── flags: symbol_keys
+        │               │           ├── flags: static_keys
         │               │           └── elements: (length: 1)
         │               │               └── @ AssocNode (location: (7,9)-(7,12))
         │               │                   ├── key:
@@ -147,7 +147,7 @@
         │               │   ├── flags: ∅
         │               │   └── arguments: (length: 1)
         │               │       └── @ KeywordHashNode (location: (9,9)-(9,12))
-        │               │           ├── flags: symbol_keys
+        │               │           ├── flags: static_keys
         │               │           └── elements: (length: 1)
         │               │               └── @ AssocNode (location: (9,9)-(9,12))
         │               │                   ├── key:
diff --git a/test/prism/snapshots/seattlerb/yield_call_assocs.txt b/test/prism/snapshots/seattlerb/yield_call_assocs.txt
index 95d64eaa..82d1765f 100644
--- a/test/prism/snapshots/seattlerb/yield_call_assocs.txt
+++ b/test/prism/snapshots/seattlerb/yield_call_assocs.txt
@@ -13,7 +13,7 @@
         │   │       ├── @ IntegerNode (location: (1,6)-(1,7))
         │   │       │   └── flags: decimal
         │   │       └── @ KeywordHashNode (location: (1,9)-(1,16))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,9)-(1,16))
         │   │                   ├── key:
@@ -38,7 +38,7 @@
         │   │       ├── @ IntegerNode (location: (3,6)-(3,7))
         │   │       │   └── flags: decimal
         │   │       └── @ KeywordHashNode (location: (3,9)-(3,25))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 2)
         │   │               ├── @ AssocNode (location: (3,9)-(3,16))
         │   │               │   ├── key:
@@ -84,7 +84,7 @@
         │   │           │   ├── flags: ∅
         │   │           │   └── arguments: (length: 1)
         │   │           │       └── @ KeywordHashNode (location: (5,8)-(5,13))
-        │   │           │           ├── flags: symbol_keys
+        │   │           │           ├── flags: static_keys
         │   │           │           └── elements: (length: 1)
         │   │           │               └── @ AssocNode (location: (5,8)-(5,13))
         │   │           │                   ├── key:
@@ -120,7 +120,7 @@
         │   │           │   ├── flags: ∅
         │   │           │   └── arguments: (length: 1)
         │   │           │       └── @ KeywordHashNode (location: (7,8)-(7,11))
-        │   │           │           ├── flags: symbol_keys
+        │   │           │           ├── flags: static_keys
         │   │           │           └── elements: (length: 1)
         │   │           │               └── @ AssocNode (location: (7,8)-(7,11))
         │   │           │                   ├── key:
@@ -156,7 +156,7 @@
         │   │           │   ├── flags: ∅
         │   │           │   └── arguments: (length: 1)
         │   │           │       └── @ KeywordHashNode (location: (9,8)-(9,11))
-        │   │           │           ├── flags: symbol_keys
+        │   │           │           ├── flags: static_keys
         │   │           │           └── elements: (length: 1)
         │   │           │               └── @ AssocNode (location: (9,8)-(9,11))
         │   │           │                   ├── key:
diff --git a/test/prism/snapshots/unparser/corpus/literal/send.txt b/test/prism/snapshots/unparser/corpus/literal/send.txt
index 673787f1..a96937e8 100644
--- a/test/prism/snapshots/unparser/corpus/literal/send.txt
+++ b/test/prism/snapshots/unparser/corpus/literal/send.txt
@@ -1249,7 +1249,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (63,8)-(63,16))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (63,8)-(63,16))
         │   │                   ├── key:
@@ -1569,7 +1569,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (70,4)-(70,8))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (70,4)-(70,8))
         │   │                   ├── key:
@@ -1615,7 +1615,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (71,6)-(71,10))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (71,6)-(71,10))
         │   │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/args_args_assocs.txt b/test/prism/snapshots/whitequark/args_args_assocs.txt
index 3d467e39..d5c0d7d1 100644
--- a/test/prism/snapshots/whitequark/args_args_assocs.txt
+++ b/test/prism/snapshots/whitequark/args_args_assocs.txt
@@ -25,7 +25,7 @@
         │   │       │   ├── closing_loc: ∅
         │   │       │   └── block: ∅
         │   │       └── @ KeywordHashNode (location: (1,9)-(1,18))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,9)-(1,18))
         │   │                   ├── key:
@@ -63,7 +63,7 @@
             │       │   ├── closing_loc: ∅
             │       │   └── block: ∅
             │       └── @ KeywordHashNode (location: (3,9)-(3,18))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (3,9)-(3,18))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/args_args_assocs_comma.txt b/test/prism/snapshots/whitequark/args_args_assocs_comma.txt
index 7b74a188..2aa16446 100644
--- a/test/prism/snapshots/whitequark/args_args_assocs_comma.txt
+++ b/test/prism/snapshots/whitequark/args_args_assocs_comma.txt
@@ -35,7 +35,7 @@
             │       │   ├── closing_loc: ∅
             │       │   └── block: ∅
             │       └── @ KeywordHashNode (location: (1,9)-(1,18))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,9)-(1,18))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/args_assocs.txt b/test/prism/snapshots/whitequark/args_assocs.txt
index e4acaca4..bf51dda1 100644
--- a/test/prism/snapshots/whitequark/args_assocs.txt
+++ b/test/prism/snapshots/whitequark/args_assocs.txt
@@ -15,7 +15,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (1,4)-(1,13))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,4)-(1,13))
         │   │                   ├── key:
@@ -43,7 +43,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (3,4)-(3,13))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (3,4)-(3,13))
         │   │                   ├── key:
@@ -95,7 +95,7 @@
         │   │       │   ├── closing_loc: ∅
         │   │       │   └── block: ∅
         │   │       └── @ KeywordHashNode (location: (5,14)-(5,21))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (5,14)-(5,21))
         │   │                   ├── key:
@@ -124,7 +124,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (7,5)-(7,14))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (7,5)-(7,14))
         │   │                   ├── key:
@@ -148,7 +148,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (9,6)-(9,16))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (9,6)-(9,16))
         │   │                   ├── key:
@@ -172,7 +172,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (11,6)-(11,16))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (11,6)-(11,16))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/args_assocs_comma.txt b/test/prism/snapshots/whitequark/args_assocs_comma.txt
index 0ced5c7b..b98aa39c 100644
--- a/test/prism/snapshots/whitequark/args_assocs_comma.txt
+++ b/test/prism/snapshots/whitequark/args_assocs_comma.txt
@@ -25,7 +25,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,4)-(1,13))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,4)-(1,13))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/args_assocs_legacy.txt b/test/prism/snapshots/whitequark/args_assocs_legacy.txt
index e4acaca4..bf51dda1 100644
--- a/test/prism/snapshots/whitequark/args_assocs_legacy.txt
+++ b/test/prism/snapshots/whitequark/args_assocs_legacy.txt
@@ -15,7 +15,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (1,4)-(1,13))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,4)-(1,13))
         │   │                   ├── key:
@@ -43,7 +43,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (3,4)-(3,13))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (3,4)-(3,13))
         │   │                   ├── key:
@@ -95,7 +95,7 @@
         │   │       │   ├── closing_loc: ∅
         │   │       │   └── block: ∅
         │   │       └── @ KeywordHashNode (location: (5,14)-(5,21))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (5,14)-(5,21))
         │   │                   ├── key:
@@ -124,7 +124,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (7,5)-(7,14))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (7,5)-(7,14))
         │   │                   ├── key:
@@ -148,7 +148,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (9,6)-(9,16))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (9,6)-(9,16))
         │   │                   ├── key:
@@ -172,7 +172,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (11,6)-(11,16))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (11,6)-(11,16))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/bug_cmdarg.txt b/test/prism/snapshots/whitequark/bug_cmdarg.txt
index 428d061e..6779d117 100644
--- a/test/prism/snapshots/whitequark/bug_cmdarg.txt
+++ b/test/prism/snapshots/whitequark/bug_cmdarg.txt
@@ -15,7 +15,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (1,7)-(1,15))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,7)-(1,15))
         │   │                   ├── key:
@@ -65,7 +65,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (5,2)-(5,26))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (5,2)-(5,26))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/keyword_argument_omission.txt b/test/prism/snapshots/whitequark/keyword_argument_omission.txt
index afcfd87c..3ff3f9a1 100644
--- a/test/prism/snapshots/whitequark/keyword_argument_omission.txt
+++ b/test/prism/snapshots/whitequark/keyword_argument_omission.txt
@@ -15,7 +15,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,4)-(1,10))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 2)
             │               ├── @ AssocNode (location: (1,4)-(1,6))
             │               │   ├── key:
diff --git a/test/prism/snapshots/whitequark/newline_in_hash_argument.txt b/test/prism/snapshots/whitequark/newline_in_hash_argument.txt
index 5f5c1e40..0e036fbd 100644
--- a/test/prism/snapshots/whitequark/newline_in_hash_argument.txt
+++ b/test/prism/snapshots/whitequark/newline_in_hash_argument.txt
@@ -93,7 +93,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (10,8)-(11,1))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (10,8)-(11,1))
         │   │                   ├── key:
@@ -131,7 +131,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (13,8)-(14,1))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (13,8)-(14,1))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/parser_bug_525.txt b/test/prism/snapshots/whitequark/parser_bug_525.txt
index 7289bdf8..087cc76e 100644
--- a/test/prism/snapshots/whitequark/parser_bug_525.txt
+++ b/test/prism/snapshots/whitequark/parser_bug_525.txt
@@ -15,7 +15,7 @@
             │   ├── flags: ∅
             │   └── arguments: (length: 1)
             │       └── @ KeywordHashNode (location: (1,3)-(1,11))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,3)-(1,11))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/ruby_bug_11380.txt b/test/prism/snapshots/whitequark/ruby_bug_11380.txt
index 7ab13b89..cd2939f8 100644
--- a/test/prism/snapshots/whitequark/ruby_bug_11380.txt
+++ b/test/prism/snapshots/whitequark/ruby_bug_11380.txt
@@ -31,7 +31,7 @@
             │       │               ├── closing_loc: ∅
             │       │               └── unescaped: "hello"
             │       └── @ KeywordHashNode (location: (1,17)-(1,21))
-            │           ├── flags: symbol_keys
+            │           ├── flags: static_keys
             │           └── elements: (length: 1)
             │               └── @ AssocNode (location: (1,17)-(1,21))
             │                   ├── key:
diff --git a/test/prism/snapshots/whitequark/ruby_bug_12073.txt b/test/prism/snapshots/whitequark/ruby_bug_12073.txt
index 27f2838b..521df7a0 100644
--- a/test/prism/snapshots/whitequark/ruby_bug_12073.txt
+++ b/test/prism/snapshots/whitequark/ruby_bug_12073.txt
@@ -23,7 +23,7 @@
         │   │   ├── flags: ∅
         │   │   └── arguments: (length: 1)
         │   │       └── @ KeywordHashNode (location: (1,9)-(1,13))
-        │   │           ├── flags: symbol_keys
+        │   │           ├── flags: static_keys
         │   │           └── elements: (length: 1)
         │   │               └── @ AssocNode (location: (1,9)-(1,13))
         │   │                   ├── key: