mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-26 13:03:31 +00:00
introduce syntax-ptr
This commit is contained in:
parent
bc4de7128f
commit
950e8b8182
4 changed files with 75 additions and 5 deletions
11
Cargo.lock
generated
11
Cargo.lock
generated
|
@ -661,7 +661,7 @@ dependencies = [
|
||||||
"serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_json 1.0.32 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"smol_str 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"smol_str 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"tempdir 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"text_unit 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"url_serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"url_serde 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"walkdir 2.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"walkdir 2.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
@ -675,6 +675,7 @@ dependencies = [
|
||||||
"parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rowan 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rowan 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"test_utils 0.1.0",
|
"test_utils 0.1.0",
|
||||||
|
"text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"walkdir 2.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"walkdir 2.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
@ -798,7 +799,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"smol_str 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"smol_str 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"text_unit 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -1038,12 +1039,12 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"text_unit 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "text_unit"
|
name = "text_unit"
|
||||||
version = "0.1.4"
|
version = "0.1.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde 1.0.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
@ -1372,7 +1373,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
"checksum tera 0.11.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6c87cae42cc4fc480278c7583792cc5da2d51a25be916b7921cbb45c43063b8d"
|
"checksum tera 0.11.18 (registry+https://github.com/rust-lang/crates.io-index)" = "6c87cae42cc4fc480278c7583792cc5da2d51a25be916b7921cbb45c43063b8d"
|
||||||
"checksum teraron 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d89ad4617d1dec55331067fadaa041e813479e1779616f3d3ce9308bf46184e"
|
"checksum teraron 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d89ad4617d1dec55331067fadaa041e813479e1779616f3d3ce9308bf46184e"
|
||||||
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
||||||
"checksum text_unit 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "93fc86da66d0b9aa8d359b0ec31b4342c6bc52637eadef05b91b098551a9f8e9"
|
"checksum text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8009d7bdbd896a7e09b595f8f9325a19047fc708653e60d0895202b82135048f"
|
||||||
"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
|
"checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6"
|
||||||
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
|
"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b"
|
||||||
"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b"
|
"checksum time 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "d825be0eb33fda1a7e68012d51e9c7f451dc1a69391e7fdc197060bb8c56667b"
|
||||||
|
|
|
@ -12,6 +12,7 @@ mod descriptors;
|
||||||
mod imp;
|
mod imp;
|
||||||
mod symbol_index;
|
mod symbol_index;
|
||||||
mod completion;
|
mod completion;
|
||||||
|
mod syntax_ptr;
|
||||||
|
|
||||||
use std::{
|
use std::{
|
||||||
fmt,
|
fmt,
|
||||||
|
|
67
crates/ra_analysis/src/syntax_ptr.rs
Normal file
67
crates/ra_analysis/src/syntax_ptr.rs
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
use ra_syntax::{
|
||||||
|
File, TextRange, SyntaxKind, SyntaxNode, SyntaxNodeRef,
|
||||||
|
ast::{self, AstNode},
|
||||||
|
};
|
||||||
|
|
||||||
|
use crate::FileId;
|
||||||
|
use crate::db::SyntaxDatabase;
|
||||||
|
|
||||||
|
/// SyntaxPtr is a cheap `Copy` id which identifies a particular syntax node,
|
||||||
|
/// without retainig syntax tree in memory. You need to explicitelly `resovle`
|
||||||
|
/// `SyntaxPtr` to get a `SyntaxNode`
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
pub(crate) struct SyntaxPtr {
|
||||||
|
file_id: FileId,
|
||||||
|
local: LocalSyntaxPtr,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SyntaxPtr {
|
||||||
|
pub(crate) fn new(file_id: FileId, node: SyntaxNodeRef) -> SyntaxPtr {
|
||||||
|
let local = LocalSyntaxPtr::new(node);
|
||||||
|
SyntaxPtr { file_id, local }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub(crate) fn resolve(self, db: &impl SyntaxDatabase) -> SyntaxNode {
|
||||||
|
let syntax = db.file_syntax(self.file_id);
|
||||||
|
self.local.resolve(&syntax)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// A pionter to a syntax node inside a file.
|
||||||
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
struct LocalSyntaxPtr {
|
||||||
|
range: TextRange,
|
||||||
|
kind: SyntaxKind,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl LocalSyntaxPtr {
|
||||||
|
fn new(node: SyntaxNodeRef) -> LocalSyntaxPtr {
|
||||||
|
LocalSyntaxPtr {
|
||||||
|
range: node.range(),
|
||||||
|
kind: node.kind(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn resolve(self, file: &File) -> SyntaxNode {
|
||||||
|
let mut curr = file.syntax();
|
||||||
|
loop {
|
||||||
|
if curr.range() == self.range && curr.kind() == self.kind {
|
||||||
|
return curr.owned();
|
||||||
|
}
|
||||||
|
curr = curr.children()
|
||||||
|
.find(|it| self.range.is_subrange(&it.range()))
|
||||||
|
.unwrap_or_else(|| panic!("can't resovle local ptr to SyntaxNode: {:?}", self))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_local_syntax_ptr() {
|
||||||
|
let file = File::parse("struct Foo { f: u32, }");
|
||||||
|
let field = file.syntax().descendants().find_map(ast::NamedFieldDef::cast).unwrap();
|
||||||
|
let ptr = LocalSyntaxPtr::new(field.syntax());
|
||||||
|
let field_syntax = ptr.resolve(&file);
|
||||||
|
assert_eq!(field.syntax(), field_syntax);
|
||||||
|
}
|
|
@ -11,6 +11,7 @@ itertools = "0.7.8"
|
||||||
drop_bomb = "0.1.4"
|
drop_bomb = "0.1.4"
|
||||||
parking_lot = "0.6.0"
|
parking_lot = "0.6.0"
|
||||||
rowan = "0.1.1"
|
rowan = "0.1.1"
|
||||||
|
text_unit = "0.1.5"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
test_utils = { path = "../test_utils" }
|
test_utils = { path = "../test_utils" }
|
||||||
|
|
Loading…
Reference in a new issue