Skip to content

Commit 6cb3d2e

Browse files
bors[bot]matklad
andauthored
Merge #50
50: 9 r=matklad a=matklad bors r+ Co-authored-by: Aleksey Kladov <[email protected]>
2 parents ac48758 + 6b12335 commit 6cb3d2e

File tree

12 files changed

+83
-74
lines changed

12 files changed

+83
-74
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
[package]
22
name = "rowan"
3-
version = "0.8.2"
3+
version = "0.9.0"
44
authors = ["Aleksey Kladov <[email protected]>"]
55
repository = "https://github.com/matklad/rowan"
66
license = "MIT OR Apache-2.0"
7-
description = "Library for generic lossless syntax trees."
7+
description = "Library for generic lossless syntax trees"
88
edition = "2018"
99

1010
[dependencies]

examples/math.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ enum SyntaxKind {
3434
}
3535
use SyntaxKind::*;
3636

37-
impl From<SyntaxKind> for rowan::cursor::SyntaxKind {
37+
impl From<SyntaxKind> for rowan::SyntaxKind {
3838
fn from(kind: SyntaxKind) -> Self {
3939
Self(kind as u16)
4040
}
@@ -44,11 +44,11 @@ impl From<SyntaxKind> for rowan::cursor::SyntaxKind {
4444
enum Lang {}
4545
impl rowan::Language for Lang {
4646
type Kind = SyntaxKind;
47-
fn kind_from_raw(raw: rowan::cursor::SyntaxKind) -> Self::Kind {
47+
fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
4848
assert!(raw.0 <= ROOT as u16);
4949
unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
5050
}
51-
fn kind_to_raw(kind: Self::Kind) -> rowan::cursor::SyntaxKind {
51+
fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
5252
kind.into()
5353
}
5454
}

examples/s_expressions.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ enum SyntaxKind {
3131
}
3232
use SyntaxKind::*;
3333

34-
impl From<SyntaxKind> for rowan::cursor::SyntaxKind {
34+
impl From<SyntaxKind> for rowan::SyntaxKind {
3535
fn from(kind: SyntaxKind) -> Self {
3636
Self(kind as u16)
3737
}
@@ -41,11 +41,11 @@ impl From<SyntaxKind> for rowan::cursor::SyntaxKind {
4141
enum Lang {}
4242
impl rowan::Language for Lang {
4343
type Kind = SyntaxKind;
44-
fn kind_from_raw(raw: rowan::cursor::SyntaxKind) -> Self::Kind {
44+
fn kind_from_raw(raw: rowan::SyntaxKind) -> Self::Kind {
4545
assert!(raw.0 <= ROOT as u16);
4646
unsafe { std::mem::transmute::<u16, SyntaxKind>(raw.0) }
4747
}
48-
fn kind_to_raw(kind: Self::Kind) -> rowan::cursor::SyntaxKind {
48+
fn kind_to_raw(kind: Self::Kind) -> rowan::SyntaxKind {
4949
kind.into()
5050
}
5151
}
@@ -368,7 +368,7 @@ nan
368368

369369
fn lex(text: &str) -> Vec<(SyntaxKind, SmolStr)> {
370370
fn tok(t: SyntaxKind) -> m_lexer::TokenKind {
371-
m_lexer::TokenKind(rowan::cursor::SyntaxKind::from(t).0)
371+
m_lexer::TokenKind(rowan::SyntaxKind::from(t).0)
372372
}
373373
fn kind(t: m_lexer::TokenKind) -> SyntaxKind {
374374
match t.0 {

src/api.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
use std::{fmt, marker::PhantomData};
22

33
use crate::{
4-
cursor, Direction, GreenNode, GreenToken, NodeOrToken, SmolStr, SyntaxText, TextRange,
5-
TextUnit, TokenAtOffset, WalkEvent,
4+
cursor, Direction, GreenNode, GreenToken, NodeOrToken, SmolStr, SyntaxKind, SyntaxText,
5+
TextRange, TextUnit, TokenAtOffset, WalkEvent,
66
};
77

88
pub trait Language: Sized + Clone + Copy + fmt::Debug + Eq + Ord + std::hash::Hash {
99
type Kind: fmt::Debug;
1010

11-
fn kind_from_raw(raw: cursor::SyntaxKind) -> Self::Kind;
12-
fn kind_to_raw(kind: Self::Kind) -> cursor::SyntaxKind;
11+
fn kind_from_raw(raw: SyntaxKind) -> Self::Kind;
12+
fn kind_to_raw(kind: Self::Kind) -> SyntaxKind;
1313
}
1414

1515
#[derive(Clone, PartialEq, Eq, Hash)]
@@ -104,7 +104,7 @@ impl<L: Language> fmt::Display for SyntaxToken<L> {
104104
}
105105
}
106106

107-
pub(crate) type SyntaxElement<L> = NodeOrToken<SyntaxNode<L>, SyntaxToken<L>>;
107+
pub type SyntaxElement<L> = NodeOrToken<SyntaxNode<L>, SyntaxToken<L>>;
108108

109109
impl<L: Language> From<cursor::SyntaxElement> for SyntaxElement<L> {
110110
fn from(raw: cursor::SyntaxElement) -> SyntaxElement<L> {

src/cursor.rs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,11 @@ use std::{
77
};
88

99
use crate::{
10-
Children, Direction, GreenElementRef, GreenNode, GreenToken, NodeOrToken, SmolStr, SyntaxText,
11-
TextRange, TextUnit, TokenAtOffset, WalkEvent,
10+
green::{GreenElementRef, SyntaxKind},
11+
Children, Direction, GreenNode, GreenToken, NodeOrToken, SmolStr, SyntaxText, TextRange,
12+
TextUnit, TokenAtOffset, WalkEvent,
1213
};
1314

14-
/// SyntaxKind is a type tag for each token or node.
15-
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
16-
pub struct SyntaxKind(pub u16);
17-
1815
#[derive(Debug, Clone)]
1916
pub struct SyntaxNode(Rc<NodeData>);
2017

@@ -24,6 +21,7 @@ impl Drop for SyntaxNode {
2421
}
2522
}
2623

24+
// Identity semantics for hash & eq
2725
impl PartialEq for SyntaxNode {
2826
fn eq(&self, other: &SyntaxNode) -> bool {
2927
ptr::eq(self.green(), other.green())
@@ -64,7 +62,7 @@ impl fmt::Display for SyntaxToken {
6462
}
6563
}
6664

67-
pub(crate) type SyntaxElement = NodeOrToken<SyntaxNode, SyntaxToken>;
65+
pub type SyntaxElement = NodeOrToken<SyntaxNode, SyntaxToken>;
6866

6967
impl From<SyntaxNode> for SyntaxElement {
7068
fn from(node: SyntaxNode) -> SyntaxElement {

src/green.rs

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,39 @@ mod token;
33
mod element;
44
mod builder;
55

6-
pub(crate) use self::element::*;
6+
pub(crate) use self::element::GreenElementRef;
7+
use self::element::{GreenElement, PackedGreenElement};
78

8-
pub use self::{builder::*, node::*, token::*};
9+
pub use self::{
10+
builder::{Checkpoint, GreenNodeBuilder, NodeCache},
11+
node::{Children, GreenNode},
12+
token::GreenToken,
13+
};
14+
15+
/// SyntaxKind is a type tag for each token or node.
16+
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
17+
pub struct SyntaxKind(pub u16);
18+
19+
#[cfg(test)]
20+
mod tests {
21+
use super::*;
22+
23+
#[test]
24+
fn assert_send_sync() {
25+
fn f<T: Send + Sync>() {}
26+
f::<GreenNode>();
27+
f::<GreenToken>();
28+
f::<GreenElement>();
29+
f::<PackedGreenElement>();
30+
}
31+
32+
#[test]
33+
fn test_size_of() {
34+
use std::mem::size_of;
35+
36+
eprintln!("GreenNode {}", size_of::<GreenNode>());
37+
eprintln!("GreenToken {}", size_of::<GreenToken>());
38+
eprintln!("GreenElement {}", size_of::<GreenElement>());
39+
eprintln!("PackedGreenElement {}", size_of::<PackedGreenElement>());
40+
}
41+
}

src/green/builder.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
use crate::{cursor::SyntaxKind, NodeOrToken, SmolStr};
1+
use rustc_hash::FxHashSet;
22

3-
use super::*;
3+
use crate::{
4+
green::{GreenElement, GreenNode, GreenToken, SyntaxKind},
5+
NodeOrToken, SmolStr,
6+
};
47

58
#[derive(Default, Debug)]
69
pub struct NodeCache {
7-
nodes: rustc_hash::FxHashSet<GreenNode>,
8-
tokens: rustc_hash::FxHashSet<GreenToken>,
10+
nodes: FxHashSet<GreenNode>,
11+
tokens: FxHashSet<GreenToken>,
912
}
1013

1114
impl NodeCache {
@@ -131,7 +134,7 @@ impl GreenNodeBuilder<'_> {
131134
/// `start_node_at`.
132135
/// Example:
133136
/// ```rust
134-
/// # use rowan::{GreenNodeBuilder, cursor::SyntaxKind};
137+
/// # use rowan::{GreenNodeBuilder, SyntaxKind};
135138
/// # const PLUS: SyntaxKind = SyntaxKind(0);
136139
/// # const OPERATION: SyntaxKind = SyntaxKind(1);
137140
/// # struct Parser;

src/green/element.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ use std::{fmt, hash, mem};
22

33
use thin_dst::ErasedPtr;
44

5-
use crate::{cursor::SyntaxKind, NodeOrToken, TextUnit};
5+
use crate::{
6+
green::{GreenNode, GreenToken, SyntaxKind},
7+
NodeOrToken, TextUnit,
8+
};
69

7-
use super::*;
8-
9-
pub(crate) type GreenElement = NodeOrToken<GreenNode, GreenToken>;
10+
pub(super) type GreenElement = NodeOrToken<GreenNode, GreenToken>;
1011
pub(crate) type GreenElementRef<'a> = NodeOrToken<&'a GreenNode, &'a GreenToken>;
12+
1113
#[repr(transparent)]
12-
pub(crate) struct PackedGreenElement {
14+
pub(super) struct PackedGreenElement {
1315
ptr: ErasedPtr,
1416
}
1517

src/green/node.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ use std::{iter::FusedIterator, slice, sync::Arc};
22

33
use thin_dst::{ThinArc, ThinData};
44

5-
use crate::{cursor::SyntaxKind, TextUnit};
6-
7-
use super::*;
5+
use crate::{
6+
green::{GreenElement, GreenElementRef, PackedGreenElement, SyntaxKind},
7+
TextUnit,
8+
};
89

910
#[repr(align(2))] // NB: this is an at-least annotation
1011
#[derive(Debug, Clone, PartialEq, Eq, Hash)]

src/green/token.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
use std::{fmt, hash, mem::ManuallyDrop, ptr, sync::Arc};
22

3-
use crate::{cursor::SyntaxKind, SmolStr, TextUnit};
3+
use crate::{green::SyntaxKind, SmolStr, TextUnit};
44

55
#[repr(align(2))] // NB: this is an at-least annotation
66
#[derive(Debug, PartialEq, Eq, Hash)]
7-
pub(crate) struct GreenTokenData {
7+
struct GreenTokenData {
88
kind: SyntaxKind,
99
text: SmolStr,
1010
}
1111

1212
/// Leaf node in the immutable tree.
1313
pub struct GreenToken {
14-
pub(super) ptr: ptr::NonNull<GreenTokenData>,
14+
ptr: ptr::NonNull<GreenTokenData>,
1515
}
1616

1717
unsafe impl Send for GreenToken {} // where GreenTokenData: Send + Sync

0 commit comments

Comments
 (0)