tree-sitter / tree-sitter

An incremental parsing system for programming tools

Home Page:https://tree-sitter.github.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Compile error while following `Rust Tree-sitter` instruction

cushionbadak opened this issue · comments

Problem

I got an error while following instruction in Rust Tree-sitter readme.
README File: https://github.com/tree-sitter/tree-sitter/blob/01bf431261d5238fcf74b1e5e5612f1d259d013f/lib/binding_rust/README.md

Cargo.toml:

[package]
name = "rust_struct_crusher_240418"
version = "0.1.0"
edition = "2021"

[build-dependencies]
cc="*"

[dependencies]
tree-sitter = "0.21.0"
tree-sitter-rust = "0.20.4"

src/main.rs:

use tree_sitter::{Language, Parser};

fn main() {
    let mut parser = Parser::new();

    parser
        .set_language(tree_sitter_rust::language())
        .expect("Error loading Rust grammar");
}

Error message when cargo build:

   Compiling rust_struct_crusher_240418 v0.1.0 (/Volumes/T7/workspace/rust_struct_crusher_240418)
warning: unused import: `Language`
 --> src/main.rs:1:19
  |
1 | use tree_sitter::{Language, Parser};
  |                   ^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

error[E0308]: mismatched types
   --> src/main.rs:7:23
    |
7   |         .set_language(tree_sitter_rust::language())
    |          ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `&Language`, found `Language`
    |          |
    |          arguments to this method are incorrect
    |
note: method defined here
   --> /Users/jb/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tree-sitter-0.21.0/binding_rust/lib.rs:450:12
    |
450 |     pub fn set_language(&mut self, language: &Language) -> Result<(), LanguageError> {
    |            ^^^^^^^^^^^^

For more information about this error, try `rustc --explain E0308`.
warning: `rust_struct_crusher_240418` (bin "rust_struct_crusher_240418") generated 1 warning
error: could not compile `rust_struct_crusher_240418` (bin "rust_struct_crusher_240418") due to 1 previous error; 1 warning emitted
Rust Version (rustc -Vv)

rustc 1.79.0-nightly (0d8b3346a 2024-04-14)
binary: rustc
commit-hash: 0d8b3346a3992ab11ea35ff0fb95a6864b91f797
commit-date: 2024-04-14
host: x86_64-apple-darwin
release: 1.79.0-nightly
LLVM version: 18.1.3

Cargo Version (cargo -Vv)

cargo 1.79.0-nightly (48eca1b16 2024-04-12)
release: 1.79.0-nightly
commit-hash: 48eca1b164695022295ce466b64b44e4e0228b08
commit-date: 2024-04-12
host: x86_64-apple-darwin
libgit2: 1.7.2 (sys:0.18.3 vendored)
libcurl: 8.4.0 (sys:0.4.72+curl-8.6.0 system ssl:(SecureTransport) LibreSSL/3.3.6)
ssl: OpenSSL 1.1.1w  11 Sep 2023
os: Mac OS 14.4.1 [64-bit]

Steps to reproduce

.

Expected behavior

Compile Success

Tree-sitter version (tree-sitter --version)

tree-sitter 0.21.0

Operating system/version

macOS 14.4.1

I guess #3275 has similar problem

If I modify the method call from .set_language(tree_sitter_rust::language()) to .set_language(&tree_sitter_rust::langauge()), I got following error message:

   Compiling rust_struct_crusher_240418 v0.1.0 (/Volumes/T7/workspace/rust_struct_crusher_240418)
warning: unused import: `Language`
 --> src/main.rs:1:19
  |
1 | use tree_sitter::{Language, Parser};
  |                   ^^^^^^^^
  |
  = note: `#[warn(unused_imports)]` on by default

error[E0308]: mismatched types
   --> src/main.rs:7:23
    |
7   |         .set_language(&tree_sitter_rust::language())
    |          ------------ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `tree_sitter::Language`, found a different `tree_sitter::Language`
    |          |
    |          arguments to this method are incorrect
    |
    = note: `tree_sitter::Language` and `tree_sitter::Language` have similar names, but are actually distinct types
note: `tree_sitter::Language` is defined in crate `tree_sitter`
   --> /Users/jb/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tree-sitter-0.20.10/binding_rust/lib.rs:43:1
    |
43  | pub struct Language(*const ffi::TSLanguage);
    | ^^^^^^^^^^^^^^^^^^^
note: `tree_sitter::Language` is defined in crate `tree_sitter`
   --> /Users/jb/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tree-sitter-0.21.0/binding_rust/lib.rs:54:1
    |
54  | pub struct Language(*const ffi::TSLanguage);
    | ^^^^^^^^^^^^^^^^^^^
    = note: perhaps two different versions of crate `tree_sitter` are being used?
note: method defined here
   --> /Users/jb/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tree-sitter-0.21.0/binding_rust/lib.rs:450:12
    |
450 |     pub fn set_language(&mut self, language: &Language) -> Result<(), LanguageError> {
    |            ^^^^^^^^^^^^

For more information about this error, try `rustc --explain E0308`.
warning: `rust_struct_crusher_240418` (bin "rust_struct_crusher_240418") generated 1 warning
error: could not compile `rust_struct_crusher_240418` (bin "rust_struct_crusher_240418") due to 1 previous error; 1 warning emitted

I found that the version mismatch from tree-sitter-rust repo's Cargo.toml causes the problem.

https://github.com/tree-sitter/tree-sitter-rust/blob/afb6000a71fb9dff3f47f90d412ec080ae12bbb4/Cargo.toml#L20-L21

[dependencies]
tree-sitter = "~0.20.10"

That version problem is resolved at tree-sitter-rust 0.21.0
https://github.com/tree-sitter/tree-sitter-rust/blob/473634230435c18033384bebaa6d6a17c2523281/Cargo.toml#L22-L23

[dependencies]
tree-sitter = ">=0.21.0"

I changed my application's Cargo.toml dependency version from tree-sitter-rust = "0.20.4" to tree-sitter-rust = "0.21", and the compile error vanished.
(though it requires .set_language(&tree_sitter_rust::langauge()) modification)

[package]
name = "rust_struct_crusher_240418"
version = "0.1.0"
edition = "2021"

[build-dependencies]
cc="*"

[dependencies]
tree-sitter = "0.21.0"
tree-sitter-rust = "0.21"