1
Fork 0
mirror of https://github.com/RGBCube/cstree synced 2025-08-02 20:17:45 +00:00

Compare commits

..

3 commits

Author SHA1 Message Date
a102fdf1d4
merge feature branches 2025-07-29 19:30:11 +03:00
35c2799059
treewide: specify lifetimes correctly
don't overrestrict lifetimes, prefer `use<...>` to prevent `impl Trait` from capturing too much
2025-07-29 19:28:44 +03:00
c35e88c3da
text: add SyntaxText::rfind_char 2025-07-29 19:08:02 +03:00
30 changed files with 60 additions and 78 deletions

View file

@ -5,9 +5,6 @@
* `&I` and `&mut I` will now implement `Resolver` if `I` implements `Resolver`. * `&I` and `&mut I` will now implement `Resolver` if `I` implements `Resolver`.
* `&mut I` will now implement `Interner` if `I` implements `Interner`. * `&mut I` will now implement `Interner` if `I` implements `Interner`.
* Added an implementation for `Arc<MultiThreadedTokenInterner>` to implement `Resolver` and `Interner` so an `Arc` may be used alternatively to a reference to share access to the interner. * Added an implementation for `Arc<MultiThreadedTokenInterner>` to implement `Resolver` and `Interner` so an `Arc` may be used alternatively to a reference to share access to the interner.
* `SyntaxText` and the `SyntaxNodeChildren` iterator now correctly implement `Clone` independently of the generic syntax node data type `D`.
* The iterators returned by the `ancestors` methods on `SyntaxElementRef` / `ResolvedElementRef` no longer incorrectly capture the lifetime of the original syntax node (`self`).
* `cstree` was migrated to Rust edition 2024. This increases MSRV to Rust 1.85.
## `v0.12.2` ## `v0.12.2`

View file

@ -7,8 +7,8 @@ members = [
resolver = "2" resolver = "2"
[workspace.package] [workspace.package]
edition = "2024" edition = "2021"
version = "0.13.0" # when updating, also update `#![doc(html_root_url)]` and any inter-crate dependencies (such as `cstree`'s dependency on `cstree-derive`) version = "0.12.2" # when updating, also update `#![doc(html_root_url)]` and any inter-crate dependencies (such as `cstree`'s dependency on `cstree-derive`)
authors = [ authors = [
"Domenic Quirl <DomenicQuirl@pm.me>", "Domenic Quirl <DomenicQuirl@pm.me>",
"Aleksey Kladov <aleksey.kladov@gmail.com>", "Aleksey Kladov <aleksey.kladov@gmail.com>",
@ -16,7 +16,7 @@ authors = [
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
repository = "https://github.com/domenicquirl/cstree" repository = "https://github.com/domenicquirl/cstree"
readme = "README.md" readme = "README.md"
rust-version = "1.85" rust-version = "1.84"
[profile.release] [profile.release]
debug = true debug = true

View file

@ -15,9 +15,9 @@ name = "cstree_derive"
proc-macro = true proc-macro = true
[dependencies] [dependencies]
proc-macro2 = "1.0.95" proc-macro2 = "1.0.56"
quote = "1.0.40" quote = "1.0.26"
syn = { version = "2.0.104" } syn = { version = "2.0.14" }
[dev-dependencies] [dev-dependencies]
cstree = { path = "../cstree" } cstree = { path = "../cstree" }

View file

@ -17,7 +17,7 @@ use errors::ErrorContext;
use parsing::SyntaxKindEnum; use parsing::SyntaxKindEnum;
use proc_macro2::TokenStream; use proc_macro2::TokenStream;
use quote::{quote, quote_spanned}; use quote::{quote, quote_spanned};
use syn::{DeriveInput, parse_macro_input, spanned::Spanned}; use syn::{parse_macro_input, spanned::Spanned, DeriveInput};
mod errors; mod errors;
mod parsing; mod parsing;

View file

@ -1,6 +1,6 @@
mod attributes; mod attributes;
use syn::{Token, punctuated::Punctuated}; use syn::{punctuated::Punctuated, Token};
use crate::{errors::ErrorContext, symbols::*}; use crate::{errors::ErrorContext, symbols::*};

View file

@ -12,23 +12,23 @@ readme.workspace = true
rust-version.workspace = true rust-version.workspace = true
[dependencies] [dependencies]
text-size = "1.1.1" text-size = "1.1.0"
rustc-hash = "2.1.1" rustc-hash = "2.1.1"
parking_lot = "0.12.4" parking_lot = "0.12.1"
# Arc # Arc
triomphe = { version = "0.1.14", default-features = false, features = ["stable_deref_trait", "std"] } triomphe = { version = "0.1.8", default-features = false, features = ["stable_deref_trait", "std"] }
# Default Interner # Default Interner
indexmap = "2.10.0" indexmap = "2.4.0"
[dependencies.cstree_derive] [dependencies.cstree_derive]
path = "../cstree-derive" path = "../cstree-derive"
version = "0.13.0" # must match the `cstree` version in the virtual workspace manifest version = "0.12.2" # must match the `cstree` version in the virtual workspace manifest
optional = true optional = true
[dependencies.lasso] [dependencies.lasso]
version = "0.7.3" version = "0.7"
features = ["inline-more"] features = ["inline-more"]
optional = true optional = true
@ -48,8 +48,8 @@ features = ["derive", "std"]
m_lexer = "0.0.4" m_lexer = "0.0.4"
serde_json = "1.0" serde_json = "1.0"
serde_test = "1.0" serde_test = "1.0"
crossbeam-utils = "0.8.21" crossbeam-utils = "0.8"
criterion = { version = "0.7.0", features = ["html_reports"] } criterion = { version = "0.5.1", features = ["html_reports"] }
[[bench]] [[bench]]
name = "main" name = "main"

View file

@ -1,12 +1,9 @@
use core::hint::black_box; use criterion::{black_box, criterion_group, criterion_main, Criterion, Throughput};
use criterion::{Criterion, Throughput, criterion_group, criterion_main};
use cstree::{ use cstree::{
RawSyntaxKind,
Syntax,
build::*, build::*,
green::GreenNode, green::GreenNode,
interning::{Interner, new_interner}, interning::{new_interner, Interner},
RawSyntaxKind, Syntax,
}; };
#[derive(Debug)] #[derive(Debug)]

View file

@ -13,7 +13,7 @@
//! - "+" Token(Add) //! - "+" Token(Add)
//! - "4" Token(Number) //! - "4" Token(Number)
use cstree::{Syntax, build::GreenNodeBuilder, interning::Resolver, util::NodeOrToken}; use cstree::{build::GreenNodeBuilder, interning::Resolver, util::NodeOrToken, Syntax};
use std::iter::Peekable; use std::iter::Peekable;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Syntax)] #[derive(Debug, Clone, Copy, PartialEq, Eq, Syntax)]
@ -99,7 +99,7 @@ impl<'input, I: Iterator<Item = (SyntaxKind, &'input str)>> Parser<'input, I> {
self.handle_operation(&[Add, Sub], Self::parse_mul) self.handle_operation(&[Add, Sub], Self::parse_mul)
} }
fn parse(mut self) -> (SyntaxNode, impl Resolver + use<I>) { fn parse(mut self) -> (SyntaxNode, impl Resolver) {
self.builder.start_node(Root); self.builder.start_node(Root);
self.parse_add(); self.parse_add();
self.builder.finish_node(); self.builder.finish_node();

View file

@ -208,7 +208,7 @@ impl<'input> Parser<'input> {
Ok(()) Ok(())
} }
pub fn finish(mut self) -> (GreenNode, impl Interner + use<>) { pub fn finish(mut self) -> (GreenNode, impl Interner) {
assert!(self.lexer.next().map(|t| t == Token::EoF).unwrap_or(true)); assert!(self.lexer.next().map(|t| t == Token::EoF).unwrap_or(true));
let (tree, cache) = self.builder.finish(); let (tree, cache) = self.builder.finish();
(tree, cache.unwrap().into_interner().unwrap()) (tree, cache.unwrap().into_interner().unwrap())

View file

@ -62,7 +62,7 @@ struct Parse<I> {
/// Now, let's write a parser. /// Now, let's write a parser.
/// Note that `parse` does not return a `Result`: /// Note that `parse` does not return a `Result`:
/// By design, syntax trees can be built even for completely invalid source code. /// By design, syntax trees can be built even for completely invalid source code.
fn parse(text: &str) -> Parse<impl Resolver + use<>> { fn parse(text: &str) -> Parse<impl Resolver> {
struct Parser<'input> { struct Parser<'input> {
/// input tokens, including whitespace. /// input tokens, including whitespace.
tokens: VecDeque<(SyntaxKind, &'input str)>, tokens: VecDeque<(SyntaxKind, &'input str)>,
@ -83,7 +83,7 @@ fn parse(text: &str) -> Parse<impl Resolver + use<>> {
} }
impl Parser<'_> { impl Parser<'_> {
fn parse(mut self) -> Parse<impl Resolver + use<>> { fn parse(mut self) -> Parse<impl Resolver> {
// Make sure that the root node covers all source // Make sure that the root node covers all source
self.builder.start_node(Root); self.builder.start_node(Root);
// Parse zero or more S-expressions // Parse zero or more S-expressions

View file

@ -4,12 +4,11 @@ use rustc_hash::{FxHashMap, FxHasher};
use text_size::TextSize; use text_size::TextSize;
use crate::{ use crate::{
RawSyntaxKind,
Syntax,
green::{GreenElement, GreenNode, GreenToken}, green::{GreenElement, GreenNode, GreenToken},
interning::{Interner, TokenInterner, TokenKey, new_interner}, interning::{new_interner, Interner, TokenInterner, TokenKey},
util::NodeOrToken, util::NodeOrToken,
utility_types::MaybeOwned, utility_types::MaybeOwned,
RawSyntaxKind, Syntax,
}; };
use super::{node::GreenNodeHead, token::GreenTokenData}; use super::{node::GreenNodeHead, token::GreenTokenData};

View file

@ -5,10 +5,10 @@ use std::{fmt, hash, mem};
type ErasedPtr = *const u8; type ErasedPtr = *const u8;
use crate::{ use crate::{
RawSyntaxKind,
green::{GreenNode, GreenToken}, green::{GreenNode, GreenToken},
text::TextSize, text::TextSize,
util::NodeOrToken, util::NodeOrToken,
RawSyntaxKind,
}; };
pub(super) type GreenElement = NodeOrToken<GreenNode, GreenToken>; pub(super) type GreenElement = NodeOrToken<GreenNode, GreenToken>;

View file

@ -2,7 +2,7 @@
use std::{iter::FusedIterator, slice}; use std::{iter::FusedIterator, slice};
use super::{GreenElementRef, element::PackedGreenElement}; use super::{element::PackedGreenElement, GreenElementRef};
/// An iterator over a [`GreenNode`](crate::green::GreenNode)'s children. /// An iterator over a [`GreenNode`](crate::green::GreenNode)'s children.
#[derive(Debug, Clone)] #[derive(Debug, Clone)]

View file

@ -6,9 +6,9 @@ use std::{
use rustc_hash::FxHasher; use rustc_hash::FxHasher;
use crate::{ use crate::{
RawSyntaxKind, green::{iter::GreenNodeChildren, GreenElement, PackedGreenElement},
green::{GreenElement, PackedGreenElement, iter::GreenNodeChildren},
text::TextSize, text::TextSize,
RawSyntaxKind,
}; };
use triomphe::{Arc, HeaderWithLength, ThinArc}; use triomphe::{Arc, HeaderWithLength, ThinArc};

View file

@ -1,9 +1,9 @@
use std::{fmt, hash, mem::ManuallyDrop, ptr::NonNull}; use std::{fmt, hash, mem::ManuallyDrop, ptr::NonNull};
use crate::{ use crate::{
RawSyntaxKind,
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
text::TextSize, text::TextSize,
RawSyntaxKind,
}; };
use triomphe::Arc; use triomphe::Arc;

View file

@ -4,8 +4,8 @@ use core::fmt;
use std::hash::{BuildHasher, Hash}; use std::hash::{BuildHasher, Hash};
use crate::interning::{ use crate::interning::{
TokenKey,
traits::{InternKey, Interner, Resolver}, traits::{InternKey, Interner, Resolver},
TokenKey,
}; };
// Safety: `InternKey` has the same invariant as `lasso::Key` // Safety: `InternKey` has the same invariant as `lasso::Key`

View file

@ -93,7 +93,7 @@
)] )]
#![warn(missing_docs)] #![warn(missing_docs)]
// Docs.rs // Docs.rs
#![doc(html_root_url = "https://docs.rs/cstree/0.13.0")] #![doc(html_root_url = "https://docs.rs/cstree/0.12.2")]
#![cfg_attr(doc_cfg, feature(doc_cfg))] #![cfg_attr(doc_cfg, feature(doc_cfg))]
pub mod getting_started; pub mod getting_started;
@ -135,11 +135,10 @@ pub mod build {
/// A convenient collection of the most used parts of `cstree`. /// A convenient collection of the most used parts of `cstree`.
pub mod prelude { pub mod prelude {
pub use crate::{ pub use crate::{
RawSyntaxKind,
Syntax,
build::GreenNodeBuilder, build::GreenNodeBuilder,
green::{GreenNode, GreenToken}, green::{GreenNode, GreenToken},
syntax::{SyntaxElement, SyntaxNode, SyntaxToken}, syntax::{SyntaxElement, SyntaxNode, SyntaxToken},
RawSyntaxKind, Syntax,
}; };
} }

View file

@ -1,19 +1,17 @@
//! Serialization and Deserialization for syntax trees. //! Serialization and Deserialization for syntax trees.
use crate::{ use crate::{
RawSyntaxKind,
Syntax,
build::GreenNodeBuilder, build::GreenNodeBuilder,
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
syntax::{ResolvedNode, SyntaxNode}, syntax::{ResolvedNode, SyntaxNode},
traversal::WalkEvent, traversal::WalkEvent,
util::NodeOrToken, util::NodeOrToken,
RawSyntaxKind, Syntax,
}; };
use serde::{ use serde::{
Deserialize,
Serialize,
de::{Error, SeqAccess, Visitor}, de::{Error, SeqAccess, Visitor},
ser::SerializeTuple, ser::SerializeTuple,
Deserialize, Serialize,
}; };
use std::{collections::VecDeque, fmt, marker::PhantomData}; use std::{collections::VecDeque, fmt, marker::PhantomData};

View file

@ -4,11 +4,10 @@ use text_size::{TextRange, TextSize};
use super::*; use super::*;
use crate::{ use crate::{
RawSyntaxKind,
Syntax,
green::GreenElementRef, green::GreenElementRef,
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
util::{NodeOrToken, TokenAtOffset}, util::{NodeOrToken, TokenAtOffset},
RawSyntaxKind, Syntax,
}; };
/// An element of the tree, can be either a node or a token. /// An element of the tree, can be either a node or a token.

View file

@ -5,9 +5,9 @@ use std::iter::FusedIterator;
use text_size::TextSize; use text_size::TextSize;
use crate::{ use crate::{
Syntax,
green::{GreenElementRef, GreenNodeChildren}, green::{GreenElementRef, GreenNodeChildren},
syntax::{SyntaxElementRef, SyntaxNode}, syntax::{SyntaxElementRef, SyntaxNode},
Syntax,
}; };
#[derive(Clone, Debug)] #[derive(Clone, Debug)]

View file

@ -2,13 +2,12 @@ use super::*;
#[cfg(feature = "serialize")] #[cfg(feature = "serialize")]
use crate::serde_impls::{SerializeWithData, SerializeWithResolver}; use crate::serde_impls::{SerializeWithData, SerializeWithResolver};
use crate::{ use crate::{
RawSyntaxKind,
Syntax,
green::{GreenElementRef, GreenNode}, green::{GreenElementRef, GreenNode},
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
text::*, text::*,
traversal::*, traversal::*,
util::*, util::*,
RawSyntaxKind, Syntax,
}; };
use parking_lot::RwLock; use parking_lot::RwLock;
use std::{ use std::{
@ -18,8 +17,8 @@ use std::{
iter, iter,
ptr::{self, NonNull}, ptr::{self, NonNull},
sync::{ sync::{
Arc as StdArc,
atomic::{AtomicU32, Ordering}, atomic::{AtomicU32, Ordering},
Arc as StdArc,
}, },
}; };
use triomphe::Arc; use triomphe::Arc;

View file

@ -13,13 +13,12 @@ use std::{
use text_size::{TextRange, TextSize}; use text_size::{TextRange, TextSize};
use crate::{ use crate::{
RawSyntaxKind,
Syntax,
green::GreenNode, green::GreenNode,
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
syntax::*, syntax::*,
traversal::*, traversal::*,
util::*, util::*,
RawSyntaxKind, Syntax,
}; };
/// Syntax tree node that is guaranteed to belong to a tree that contains an associated /// Syntax tree node that is guaranteed to belong to a tree that contains an associated
@ -36,7 +35,7 @@ impl<S: Syntax, D> ResolvedNode<S, D> {
/// # Safety: /// # Safety:
/// `syntax` must belong to a tree that contains an associated inline resolver. /// `syntax` must belong to a tree that contains an associated inline resolver.
pub(super) unsafe fn coerce_ref(syntax: &SyntaxNode<S, D>) -> &Self { pub(super) unsafe fn coerce_ref(syntax: &SyntaxNode<S, D>) -> &Self {
unsafe { &*(syntax as *const _ as *const Self) } &*(syntax as *const _ as *const Self)
} }
/// Returns this node as a [`SyntaxNode`]. /// Returns this node as a [`SyntaxNode`].
@ -92,7 +91,7 @@ impl<S: Syntax, D> ResolvedToken<S, D> {
/// # Safety: /// # Safety:
/// `syntax` must belong to a tree that contains an associated inline resolver. /// `syntax` must belong to a tree that contains an associated inline resolver.
pub(super) unsafe fn coerce_ref(syntax: &SyntaxToken<S, D>) -> &Self { pub(super) unsafe fn coerce_ref(syntax: &SyntaxToken<S, D>) -> &Self {
unsafe { &*(syntax as *const _ as *const Self) } &*(syntax as *const _ as *const Self)
} }
/// Returns this token as a [`SyntaxToken`]. /// Returns this token as a [`SyntaxToken`].
@ -173,11 +172,9 @@ impl<'a, S: Syntax, D> ResolvedElementRef<'a, S, D> {
/// # Safety: /// # Safety:
/// `syntax` must belong to a tree that contains an associated inline resolver. /// `syntax` must belong to a tree that contains an associated inline resolver.
pub(super) unsafe fn coerce_ref(syntax: SyntaxElementRef<'a, S, D>) -> Self { pub(super) unsafe fn coerce_ref(syntax: SyntaxElementRef<'a, S, D>) -> Self {
unsafe { match syntax {
match syntax { NodeOrToken::Node(node) => Self::Node(ResolvedNode::coerce_ref(node)),
NodeOrToken::Node(node) => Self::Node(ResolvedNode::coerce_ref(node)), NodeOrToken::Token(token) => Self::Token(ResolvedToken::coerce_ref(token)),
NodeOrToken::Token(token) => Self::Token(ResolvedToken::coerce_ref(token)),
}
} }
} }
} }

View file

@ -3,10 +3,10 @@
use std::fmt; use std::fmt;
use crate::{ use crate::{
Syntax,
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
syntax::{SyntaxNode, SyntaxToken}, syntax::{SyntaxNode, SyntaxToken},
text::{TextRange, TextSize}, text::{TextRange, TextSize},
Syntax,
}; };
/// An efficient representation of the text that is covered by a [`SyntaxNode`], i.e. the combined /// An efficient representation of the text that is covered by a [`SyntaxNode`], i.e. the combined
@ -395,7 +395,7 @@ mod private {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use crate::{RawSyntaxKind, build::GreenNodeBuilder, interning::TokenInterner}; use crate::{build::GreenNodeBuilder, interning::TokenInterner, RawSyntaxKind};
use super::*; use super::*;
@ -421,7 +421,7 @@ mod tests {
} }
} }
fn build_tree(chunks: &[&str]) -> (SyntaxNode<SyntaxKind, ()>, impl Resolver<TokenKey> + use<>) { fn build_tree(chunks: &[&str]) -> (SyntaxNode<SyntaxKind, ()>, impl Resolver<TokenKey>) {
let mut builder: GreenNodeBuilder<SyntaxKind> = GreenNodeBuilder::new(); let mut builder: GreenNodeBuilder<SyntaxKind> = GreenNodeBuilder::new();
builder.start_node(SyntaxKind(62)); builder.start_node(SyntaxKind(62));
for &chunk in chunks.iter() { for &chunk in chunks.iter() {

View file

@ -9,11 +9,10 @@ use text_size::{TextRange, TextSize};
use super::*; use super::*;
use crate::{ use crate::{
RawSyntaxKind,
Syntax,
green::{GreenNode, GreenToken}, green::{GreenNode, GreenToken},
interning::{Resolver, TokenKey}, interning::{Resolver, TokenKey},
traversal::Direction, traversal::Direction,
RawSyntaxKind, Syntax,
}; };
/// Syntax tree token. /// Syntax tree token.
@ -285,7 +284,7 @@ impl<S: Syntax, D> SyntaxToken<S, D> {
/// implementation by re-using the interner in both. /// implementation by re-using the interner in both.
/// ``` /// ```
/// # use cstree::testing::*; /// # use cstree::testing::*;
/// use cstree::interning::{TokenInterner, TokenKey, new_interner}; /// use cstree::interning::{new_interner, TokenInterner, TokenKey};
/// struct TypeTable { /// struct TypeTable {
/// // ... /// // ...
/// } /// }

View file

@ -1,12 +1,12 @@
use super::*; use super::*;
use cstree::{ use cstree::{
RawSyntaxKind,
build::{GreenNodeBuilder, NodeCache}, build::{GreenNodeBuilder, NodeCache},
interning::{Resolver, new_interner}, interning::{new_interner, Resolver},
text::TextRange, text::TextRange,
RawSyntaxKind,
}; };
fn build_tree<D>(root: &Element<'_>) -> (SyntaxNode<D>, impl Resolver + use<D>) { fn build_tree<D>(root: &Element<'_>) -> (SyntaxNode<D>, impl Resolver) {
let mut builder: GreenNodeBuilder<SyntaxKind> = GreenNodeBuilder::new(); let mut builder: GreenNodeBuilder<SyntaxKind> = GreenNodeBuilder::new();
build_recursive(root, &mut builder, 0); build_recursive(root, &mut builder, 0);
let (node, cache) = builder.finish(); let (node, cache) = builder.finish();

View file

@ -6,12 +6,11 @@ mod sendsync;
mod serde; mod serde;
use cstree::{ use cstree::{
RawSyntaxKind,
Syntax,
build::{GreenNodeBuilder, NodeCache}, build::{GreenNodeBuilder, NodeCache},
green::GreenNode, green::GreenNode,
interning::{Interner, Resolver}, interning::{Interner, Resolver},
util::NodeOrToken, util::NodeOrToken,
RawSyntaxKind, Syntax,
}; };
pub type SyntaxNode<D = ()> = cstree::syntax::SyntaxNode<SyntaxKind, D>; pub type SyntaxNode<D = ()> = cstree::syntax::SyntaxNode<SyntaxKind, D>;

View file

@ -3,13 +3,13 @@
use crossbeam_utils::thread::scope; use crossbeam_utils::thread::scope;
use std::{thread, time::Duration}; use std::{thread, time::Duration};
use super::{Element, ResolvedNode, SyntaxKind, SyntaxNode, build_recursive}; use super::{build_recursive, Element, ResolvedNode, SyntaxKind, SyntaxNode};
use cstree::build::GreenNodeBuilder; use cstree::build::GreenNodeBuilder;
// Excercise the multi-threaded interner when the corresponding feature is enabled. // Excercise the multi-threaded interner when the corresponding feature is enabled.
#[cfg(feature = "multi_threaded_interning")] #[cfg(feature = "multi_threaded_interning")]
use cstree::interning::{MultiThreadedTokenInterner, new_threaded_interner}; use cstree::interning::{new_threaded_interner, MultiThreadedTokenInterner};
#[cfg(not(feature = "multi_threaded_interning"))] #[cfg(not(feature = "multi_threaded_interning"))]
fn get_builder() -> GreenNodeBuilder<'static, 'static, SyntaxKind> { fn get_builder() -> GreenNodeBuilder<'static, 'static, SyntaxKind> {

View file

@ -1,4 +1,4 @@
use crate::{ResolvedNode, build_recursive, build_tree_with_cache}; use crate::{build_recursive, build_tree_with_cache, ResolvedNode};
use super::{Element, SyntaxKind, SyntaxNode}; use super::{Element, SyntaxKind, SyntaxNode};
use cstree::{ use cstree::{

View file

@ -1,6 +1,6 @@
unstable_features = true unstable_features = true
edition = "2024" edition = "2021"
max_width = 120 max_width = 120
comment_width = 120 comment_width = 120
@ -10,7 +10,6 @@ format_code_in_doc_comments = true
format_macro_matchers = true format_macro_matchers = true
imports_granularity = "Crate" imports_granularity = "Crate"
imports_layout = "HorizontalVertical"
reorder_impl_items = true reorder_impl_items = true

View file

@ -13,4 +13,4 @@ rust-version.workspace = true
cstree = { path = "../cstree", features = ["derive"] } cstree = { path = "../cstree", features = ["derive"] }
[dev-dependencies] [dev-dependencies]
trybuild = { version = "1.0.106", features = ["diff"] } trybuild = { version = "1.0.80", features = ["diff"] }