mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-01 12:24:29 +00:00
Use stable AST IDs
Instead of simple numbering, we hash important bits, like the name of the item. This will allow for much better incrementality, e.g. when you add an item. Currently, this invalidates the IDs of all following items, which invalidates pretty much everything.
This commit is contained in:
parent
5b2c8bc9ae
commit
4bcf03e28b
22 changed files with 1220 additions and 546 deletions
|
|
@ -2141,26 +2141,10 @@ impl ExprCollector<'_> {
|
||||||
block: ast::BlockExpr,
|
block: ast::BlockExpr,
|
||||||
mk_block: impl FnOnce(Option<BlockId>, Box<[Statement]>, Option<ExprId>) -> Expr,
|
mk_block: impl FnOnce(Option<BlockId>, Box<[Statement]>, Option<ExprId>) -> Expr,
|
||||||
) -> ExprId {
|
) -> ExprId {
|
||||||
let block_has_items = {
|
let block_id = self.expander.ast_id_map().ast_id_for_block(&block).map(|file_local_id| {
|
||||||
let statement_has_item = block.statements().any(|stmt| match stmt {
|
|
||||||
ast::Stmt::Item(_) => true,
|
|
||||||
// Macro calls can be both items and expressions. The syntax library always treats
|
|
||||||
// them as expressions here, so we undo that.
|
|
||||||
ast::Stmt::ExprStmt(es) => matches!(es.expr(), Some(ast::Expr::MacroExpr(_))),
|
|
||||||
_ => false,
|
|
||||||
});
|
|
||||||
statement_has_item
|
|
||||||
|| matches!(block.tail_expr(), Some(ast::Expr::MacroExpr(_)))
|
|
||||||
|| (block.may_carry_attributes() && block.attrs().next().is_some())
|
|
||||||
};
|
|
||||||
|
|
||||||
let block_id = if block_has_items {
|
|
||||||
let file_local_id = self.expander.ast_id_map().ast_id(&block);
|
|
||||||
let ast_id = self.expander.in_file(file_local_id);
|
let ast_id = self.expander.in_file(file_local_id);
|
||||||
Some(self.db.intern_block(BlockLoc { ast_id, module: self.module }))
|
self.db.intern_block(BlockLoc { ast_id, module: self.module })
|
||||||
} else {
|
});
|
||||||
None
|
|
||||||
};
|
|
||||||
|
|
||||||
let (module, def_map) =
|
let (module, def_map) =
|
||||||
match block_id.map(|block_id| (block_def_map(self.db, block_id), block_id)) {
|
match block_id.map(|block_id| (block_def_map(self.db, block_id), block_id)) {
|
||||||
|
|
|
||||||
|
|
@ -353,8 +353,8 @@ impl Printer<'_> {
|
||||||
let MacroCall { path, ast_id, expand_to, ctxt } = &self.tree[it];
|
let MacroCall { path, ast_id, expand_to, ctxt } = &self.tree[it];
|
||||||
let _ = writeln!(
|
let _ = writeln!(
|
||||||
self,
|
self,
|
||||||
"// AstId: {:?}, SyntaxContextId: {}, ExpandTo: {:?}",
|
"// AstId: {:#?}, SyntaxContextId: {}, ExpandTo: {:?}",
|
||||||
ast_id.erase().into_raw(),
|
ast_id.erase(),
|
||||||
ctxt,
|
ctxt,
|
||||||
expand_to
|
expand_to
|
||||||
);
|
);
|
||||||
|
|
@ -377,7 +377,7 @@ impl Printer<'_> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_ast_id(&mut self, ast_id: ErasedFileAstId) {
|
fn print_ast_id(&mut self, ast_id: ErasedFileAstId) {
|
||||||
wln!(self, "// AstId: {:?}", ast_id.into_raw());
|
wln!(self, "// AstId: {ast_id:#?}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -35,23 +35,23 @@ use a::{c, d::{e}};
|
||||||
#![no_std]
|
#![no_std]
|
||||||
#![doc = " another file comment"]
|
#![doc = " another file comment"]
|
||||||
|
|
||||||
// AstId: 1
|
// AstId: ExternCrate[5A82, 0]
|
||||||
pub(self) extern crate self as renamed;
|
pub(self) extern crate self as renamed;
|
||||||
|
|
||||||
// AstId: 2
|
// AstId: ExternCrate[7E1C, 0]
|
||||||
pub(super) extern crate bli;
|
pub(super) extern crate bli;
|
||||||
|
|
||||||
// AstId: 3
|
// AstId: Use[0000, 0]
|
||||||
pub use crate::path::{nested, items as renamed, Trait as _};
|
pub use crate::path::{nested, items as renamed, Trait as _};
|
||||||
|
|
||||||
// AstId: 4
|
// AstId: Use[0000, 1]
|
||||||
pub(self) use globs::*;
|
pub(self) use globs::*;
|
||||||
|
|
||||||
#[doc = " docs on import"]
|
#[doc = " docs on import"]
|
||||||
// AstId: 5
|
// AstId: Use[0000, 2]
|
||||||
pub(self) use crate::{A, B};
|
pub(self) use crate::{A, B};
|
||||||
|
|
||||||
// AstId: 6
|
// AstId: Use[0000, 3]
|
||||||
pub(self) use a::{c, d::{e}};
|
pub(self) use a::{c, d::{e}};
|
||||||
"##]],
|
"##]],
|
||||||
);
|
);
|
||||||
|
|
@ -75,18 +75,18 @@ extern "C" {
|
||||||
"#,
|
"#,
|
||||||
expect![[r##"
|
expect![[r##"
|
||||||
#[on_extern_block]
|
#[on_extern_block]
|
||||||
// AstId: 1
|
// AstId: ExternBlock[0000, 0]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#[on_extern_type]
|
#[on_extern_type]
|
||||||
// AstId: 2
|
// AstId: TypeAlias[9FDF, 0]
|
||||||
pub(self) type ExType;
|
pub(self) type ExType;
|
||||||
|
|
||||||
#[on_extern_static]
|
#[on_extern_static]
|
||||||
// AstId: 3
|
// AstId: Static[43C1, 0]
|
||||||
pub(self) static EX_STATIC = _;
|
pub(self) static EX_STATIC = _;
|
||||||
|
|
||||||
#[on_extern_fn]
|
#[on_extern_fn]
|
||||||
// AstId: 4
|
// AstId: Fn[452D, 0]
|
||||||
pub(self) fn ex_fn;
|
pub(self) fn ex_fn;
|
||||||
}
|
}
|
||||||
"##]],
|
"##]],
|
||||||
|
|
@ -124,39 +124,39 @@ enum E {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
// AstId: 1
|
// AstId: Struct[DFF3, 0]
|
||||||
pub(self) struct Unit;
|
pub(self) struct Unit;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
// AstId: 2
|
// AstId: Struct[C7A1, 0]
|
||||||
pub(self) struct Struct {
|
pub(self) struct Struct {
|
||||||
#[doc = " fld docs"]
|
#[doc = " fld docs"]
|
||||||
pub(self) fld,
|
pub(self) fld,
|
||||||
}
|
}
|
||||||
|
|
||||||
// AstId: 3
|
// AstId: Struct[DAC2, 0]
|
||||||
pub(self) struct Tuple(
|
pub(self) struct Tuple(
|
||||||
#[attr]
|
#[attr]
|
||||||
pub(self) 0,
|
pub(self) 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
// AstId: 4
|
// AstId: Union[2DBB, 0]
|
||||||
pub(self) union Ize {
|
pub(self) union Ize {
|
||||||
pub(self) a,
|
pub(self) a,
|
||||||
pub(self) b,
|
pub(self) b,
|
||||||
}
|
}
|
||||||
|
|
||||||
// AstId: 5
|
// AstId: Enum[7FF8, 0]
|
||||||
pub(self) enum E
|
pub(self) enum E
|
||||||
// AstId: 6
|
// AstId: Variant[C717, 0]
|
||||||
#[doc = " comment on Unit"]
|
#[doc = " comment on Unit"]
|
||||||
Unit,
|
Unit,
|
||||||
// AstId: 7
|
// AstId: Variant[AEAB, 0]
|
||||||
#[doc = " comment on Tuple"]
|
#[doc = " comment on Tuple"]
|
||||||
Tuple(
|
Tuple(
|
||||||
pub(self) 0,
|
pub(self) 0,
|
||||||
),
|
),
|
||||||
// AstId: 8
|
// AstId: Variant[4B1B, 0]
|
||||||
Struct {
|
Struct {
|
||||||
#[doc = " comment on a: u8"]
|
#[doc = " comment on a: u8"]
|
||||||
pub(self) a,
|
pub(self) a,
|
||||||
|
|
@ -185,23 +185,23 @@ trait Tr: SuperTrait + 'lifetime {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
// AstId: 1
|
// AstId: Static[B393, 0]
|
||||||
pub static ST = _;
|
pub static ST = _;
|
||||||
|
|
||||||
// AstId: 2
|
// AstId: Const[B309, 0]
|
||||||
pub(self) const _ = _;
|
pub(self) const _ = _;
|
||||||
|
|
||||||
#[attr]
|
#[attr]
|
||||||
#[inner_attr_in_fn]
|
#[inner_attr_in_fn]
|
||||||
// AstId: 3
|
// AstId: Fn[75E3, 0]
|
||||||
pub(self) fn f;
|
pub(self) fn f;
|
||||||
|
|
||||||
// AstId: 4
|
// AstId: Trait[2998, 0]
|
||||||
pub(self) trait Tr {
|
pub(self) trait Tr {
|
||||||
// AstId: 6
|
// AstId: TypeAlias[9F08, 0]
|
||||||
pub(self) type Assoc;
|
pub(self) type Assoc;
|
||||||
|
|
||||||
// AstId: 7
|
// AstId: Fn[6C0C, 0]
|
||||||
pub(self) fn method;
|
pub(self) fn method;
|
||||||
}
|
}
|
||||||
"#]],
|
"#]],
|
||||||
|
|
@ -226,16 +226,16 @@ mod outline;
|
||||||
expect![[r##"
|
expect![[r##"
|
||||||
#[doc = " outer"]
|
#[doc = " outer"]
|
||||||
#[doc = " inner"]
|
#[doc = " inner"]
|
||||||
// AstId: 1
|
// AstId: Module[CF93, 0]
|
||||||
pub(self) mod inline {
|
pub(self) mod inline {
|
||||||
// AstId: 3
|
// AstId: Use[0000, 0]
|
||||||
pub(self) use super::*;
|
pub(self) use super::*;
|
||||||
|
|
||||||
// AstId: 4
|
// AstId: Fn[1B26, 0]
|
||||||
pub(self) fn fn_in_module;
|
pub(self) fn fn_in_module;
|
||||||
}
|
}
|
||||||
|
|
||||||
// AstId: 2
|
// AstId: Module[8994, 0]
|
||||||
pub(self) mod outline;
|
pub(self) mod outline;
|
||||||
"##]],
|
"##]],
|
||||||
);
|
);
|
||||||
|
|
@ -254,13 +254,13 @@ pub macro m2() {}
|
||||||
m!();
|
m!();
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
// AstId: 1
|
// AstId: MacroRules[88CE, 0]
|
||||||
macro_rules! m { ... }
|
macro_rules! m { ... }
|
||||||
|
|
||||||
// AstId: 2
|
// AstId: MacroDef[DC34, 0]
|
||||||
pub macro m2 { ... }
|
pub macro m2 { ... }
|
||||||
|
|
||||||
// AstId: 3, SyntaxContextId: ROOT2024, ExpandTo: Items
|
// AstId: MacroCall[612F, 0], SyntaxContextId: ROOT2024, ExpandTo: Items
|
||||||
m!(...);
|
m!(...);
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
|
|
@ -273,7 +273,7 @@ fn pub_self() {
|
||||||
pub(self) struct S;
|
pub(self) struct S;
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
// AstId: 1
|
// AstId: Struct[42E2, 0]
|
||||||
pub(self) struct S;
|
pub(self) struct S;
|
||||||
"#]],
|
"#]],
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -35,9 +35,9 @@ macro_rules! f {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
struct#0:1@58..64#14336# MyTraitMap2#0:2@31..42#ROOT2024# {#0:1@72..73#14336#
|
struct#0:MacroRules[8C8E, 0]@58..64#14336# MyTraitMap2#0:MacroCall[D499, 0]@31..42#ROOT2024# {#0:MacroRules[8C8E, 0]@72..73#14336#
|
||||||
map#0:1@86..89#14336#:#0:1@89..90#14336# #0:1@89..90#14336#::#0:1@91..93#14336#std#0:1@93..96#14336#::#0:1@96..98#14336#collections#0:1@98..109#14336#::#0:1@109..111#14336#HashSet#0:1@111..118#14336#<#0:1@118..119#14336#(#0:1@119..120#14336#)#0:1@120..121#14336#>#0:1@121..122#14336#,#0:1@122..123#14336#
|
map#0:MacroRules[8C8E, 0]@86..89#14336#:#0:MacroRules[8C8E, 0]@89..90#14336# #0:MacroRules[8C8E, 0]@89..90#14336#::#0:MacroRules[8C8E, 0]@91..93#14336#std#0:MacroRules[8C8E, 0]@93..96#14336#::#0:MacroRules[8C8E, 0]@96..98#14336#collections#0:MacroRules[8C8E, 0]@98..109#14336#::#0:MacroRules[8C8E, 0]@109..111#14336#HashSet#0:MacroRules[8C8E, 0]@111..118#14336#<#0:MacroRules[8C8E, 0]@118..119#14336#(#0:MacroRules[8C8E, 0]@119..120#14336#)#0:MacroRules[8C8E, 0]@120..121#14336#>#0:MacroRules[8C8E, 0]@121..122#14336#,#0:MacroRules[8C8E, 0]@122..123#14336#
|
||||||
}#0:1@132..133#14336#
|
}#0:MacroRules[8C8E, 0]@132..133#14336#
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -75,12 +75,12 @@ macro_rules! f {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn#0:2@30..32#ROOT2024# main#0:2@33..37#ROOT2024#(#0:2@37..38#ROOT2024#)#0:2@38..39#ROOT2024# {#0:2@40..41#ROOT2024#
|
fn#0:MacroCall[D499, 0]@30..32#ROOT2024# main#0:MacroCall[D499, 0]@33..37#ROOT2024#(#0:MacroCall[D499, 0]@37..38#ROOT2024#)#0:MacroCall[D499, 0]@38..39#ROOT2024# {#0:MacroCall[D499, 0]@40..41#ROOT2024#
|
||||||
1#0:2@50..51#ROOT2024#;#0:2@51..52#ROOT2024#
|
1#0:MacroCall[D499, 0]@50..51#ROOT2024#;#0:MacroCall[D499, 0]@51..52#ROOT2024#
|
||||||
1.0#0:2@61..64#ROOT2024#;#0:2@64..65#ROOT2024#
|
1.0#0:MacroCall[D499, 0]@61..64#ROOT2024#;#0:MacroCall[D499, 0]@64..65#ROOT2024#
|
||||||
(#0:2@74..75#ROOT2024#(#0:2@75..76#ROOT2024#1#0:2@76..77#ROOT2024#,#0:2@77..78#ROOT2024# )#0:2@78..79#ROOT2024#,#0:2@79..80#ROOT2024# )#0:2@80..81#ROOT2024#.#0:2@81..82#ROOT2024#0#0:2@82..85#ROOT2024#.#0:2@82..85#ROOT2024#0#0:2@82..85#ROOT2024#;#0:2@85..86#ROOT2024#
|
(#0:MacroCall[D499, 0]@74..75#ROOT2024#(#0:MacroCall[D499, 0]@75..76#ROOT2024#1#0:MacroCall[D499, 0]@76..77#ROOT2024#,#0:MacroCall[D499, 0]@77..78#ROOT2024# )#0:MacroCall[D499, 0]@78..79#ROOT2024#,#0:MacroCall[D499, 0]@79..80#ROOT2024# )#0:MacroCall[D499, 0]@80..81#ROOT2024#.#0:MacroCall[D499, 0]@81..82#ROOT2024#0#0:MacroCall[D499, 0]@82..85#ROOT2024#.#0:MacroCall[D499, 0]@82..85#ROOT2024#0#0:MacroCall[D499, 0]@82..85#ROOT2024#;#0:MacroCall[D499, 0]@85..86#ROOT2024#
|
||||||
let#0:2@95..98#ROOT2024# x#0:2@99..100#ROOT2024# =#0:2@101..102#ROOT2024# 1#0:2@103..104#ROOT2024#;#0:2@104..105#ROOT2024#
|
let#0:MacroCall[D499, 0]@95..98#ROOT2024# x#0:MacroCall[D499, 0]@99..100#ROOT2024# =#0:MacroCall[D499, 0]@101..102#ROOT2024# 1#0:MacroCall[D499, 0]@103..104#ROOT2024#;#0:MacroCall[D499, 0]@104..105#ROOT2024#
|
||||||
}#0:2@110..111#ROOT2024#
|
}#0:MacroCall[D499, 0]@110..111#ROOT2024#
|
||||||
|
|
||||||
|
|
||||||
"#]],
|
"#]],
|
||||||
|
|
@ -171,7 +171,7 @@ fn main(foo: ()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main(foo: ()) {
|
fn main(foo: ()) {
|
||||||
/* error: unresolved macro unresolved */"helloworld!"#0:3@236..321#ROOT2024#;
|
/* error: unresolved macro unresolved */"helloworld!"#0:Fn[B9C7, 0]@236..321#ROOT2024#;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -197,7 +197,7 @@ macro_rules! mk_struct {
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod foo;
|
mod foo;
|
||||||
|
|
||||||
struct#1:1@59..65#14336# Foo#0:2@32..35#ROOT2024#(#1:1@70..71#14336#u32#0:2@41..44#ROOT2024#)#1:1@74..75#14336#;#1:1@75..76#14336#
|
struct#1:MacroRules[E572, 0]@59..65#14336# Foo#0:MacroCall[BDD3, 0]@32..35#ROOT2024#(#1:MacroRules[E572, 0]@70..71#14336#u32#0:MacroCall[BDD3, 0]@41..44#ROOT2024#)#1:MacroRules[E572, 0]@74..75#14336#;#1:MacroRules[E572, 0]@75..76#14336#
|
||||||
"#]],
|
"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -181,9 +181,9 @@ fn foo(&self) {
|
||||||
self.0. 1;
|
self.0. 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
fn#0:1@45..47#ROOT2024# foo#0:1@48..51#ROOT2024#(#0:1@51..52#ROOT2024#�:1@52..53#ROOT2024#self#0:1@53..57#ROOT2024# )#0:1@57..58#ROOT2024# {#0:1@59..60#ROOT2024#
|
fn#0:Fn[4D85, 0]@45..47#ROOT2024# foo#0:Fn[4D85, 0]@48..51#ROOT2024#(#0:Fn[4D85, 0]@51..52#ROOT2024#�:Fn[4D85, 0]@52..53#ROOT2024#self#0:Fn[4D85, 0]@53..57#ROOT2024# )#0:Fn[4D85, 0]@57..58#ROOT2024# {#0:Fn[4D85, 0]@59..60#ROOT2024#
|
||||||
self#0:1@65..69#ROOT2024# .#0:1@69..70#ROOT2024#0#0:1@70..71#ROOT2024#.#0:1@71..72#ROOT2024#1#0:1@73..74#ROOT2024#;#0:1@74..75#ROOT2024#
|
self#0:Fn[4D85, 0]@65..69#ROOT2024# .#0:Fn[4D85, 0]@69..70#ROOT2024#0#0:Fn[4D85, 0]@70..71#ROOT2024#.#0:Fn[4D85, 0]@71..72#ROOT2024#1#0:Fn[4D85, 0]@73..74#ROOT2024#;#0:Fn[4D85, 0]@74..75#ROOT2024#
|
||||||
}#0:1@76..77#ROOT2024#"#]],
|
}#0:Fn[4D85, 0]@76..77#ROOT2024#"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -277,8 +277,8 @@ mod tests {
|
||||||
assert_eq!(quoted.to_string(), "hello");
|
assert_eq!(quoted.to_string(), "hello");
|
||||||
let t = format!("{quoted:#?}");
|
let t = format!("{quoted:#?}");
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 937550:0@0..0#ROOT2024 937550:0@0..0#ROOT2024
|
SUBTREE $$ 937550:Root[0000, 0]@0..0#ROOT2024 937550:Root[0000, 0]@0..0#ROOT2024
|
||||||
IDENT hello 937550:0@0..0#ROOT2024"#]]
|
IDENT hello 937550:Root[0000, 0]@0..0#ROOT2024"#]]
|
||||||
.assert_eq(&t);
|
.assert_eq(&t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
use std::borrow::Borrow;
|
use std::borrow::Borrow;
|
||||||
|
|
||||||
use either::Either;
|
use either::Either;
|
||||||
use span::{AstIdNode, ErasedFileAstId, FileAstId, FileId, SyntaxContext};
|
use span::{ErasedFileAstId, FileAstId, FileId, SyntaxContext};
|
||||||
use syntax::{AstNode, AstPtr, SyntaxNode, SyntaxNodePtr, SyntaxToken, TextRange, TextSize};
|
use syntax::{AstNode, AstPtr, SyntaxNode, SyntaxNodePtr, SyntaxToken, TextRange, TextSize};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|
@ -106,7 +106,7 @@ impl FileRange {
|
||||||
/// It is stable across reparses, and can be used as salsa key/value.
|
/// It is stable across reparses, and can be used as salsa key/value.
|
||||||
pub type AstId<N> = crate::InFile<FileAstId<N>>;
|
pub type AstId<N> = crate::InFile<FileAstId<N>>;
|
||||||
|
|
||||||
impl<N: AstIdNode> AstId<N> {
|
impl<N: AstNode> AstId<N> {
|
||||||
pub fn to_node(&self, db: &dyn ExpandDatabase) -> N {
|
pub fn to_node(&self, db: &dyn ExpandDatabase) -> N {
|
||||||
self.to_ptr(db).to_node(&db.parse_or_expand(self.file_id))
|
self.to_ptr(db).to_node(&db.parse_or_expand(self.file_id))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,9 @@
|
||||||
// FIXME: Move more of the nameres independent tests from
|
// FIXME: Move more of the nameres independent tests from
|
||||||
// crates\hir-def\src\macro_expansion_tests\mod.rs to this
|
// crates\hir-def\src\macro_expansion_tests\mod.rs to this
|
||||||
use expect_test::expect;
|
use expect_test::expect;
|
||||||
use span::{Edition, EditionedFileId, ErasedFileAstId, FileId, Span, SpanAnchor, SyntaxContext};
|
use span::{
|
||||||
|
Edition, EditionedFileId, FileId, ROOT_ERASED_FILE_AST_ID, Span, SpanAnchor, SyntaxContext,
|
||||||
|
};
|
||||||
use stdx::format_to;
|
use stdx::format_to;
|
||||||
use tt::{TextRange, TextSize};
|
use tt::{TextRange, TextSize};
|
||||||
|
|
||||||
|
|
@ -24,7 +26,7 @@ fn check_(
|
||||||
def_edition,
|
def_edition,
|
||||||
SpanAnchor {
|
SpanAnchor {
|
||||||
file_id: EditionedFileId::new(FileId::from_raw(0), def_edition),
|
file_id: EditionedFileId::new(FileId::from_raw(0), def_edition),
|
||||||
ast_id: ErasedFileAstId::from_raw(0),
|
ast_id: ROOT_ERASED_FILE_AST_ID,
|
||||||
},
|
},
|
||||||
SyntaxContext::root(Edition::CURRENT),
|
SyntaxContext::root(Edition::CURRENT),
|
||||||
decl,
|
decl,
|
||||||
|
|
@ -37,7 +39,7 @@ fn check_(
|
||||||
};
|
};
|
||||||
let call_anchor = SpanAnchor {
|
let call_anchor = SpanAnchor {
|
||||||
file_id: EditionedFileId::new(FileId::from_raw(1), call_edition),
|
file_id: EditionedFileId::new(FileId::from_raw(1), call_edition),
|
||||||
ast_id: ErasedFileAstId::from_raw(0),
|
ast_id: ROOT_ERASED_FILE_AST_ID,
|
||||||
};
|
};
|
||||||
let arg_tt = syntax_bridge::parse_to_token_tree(
|
let arg_tt = syntax_bridge::parse_to_token_tree(
|
||||||
call_edition,
|
call_edition,
|
||||||
|
|
@ -110,8 +112,8 @@ fn unbalanced_brace() {
|
||||||
"#,
|
"#,
|
||||||
r#""#,
|
r#""#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..0#ROOT2024 1:0@0..0#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..0#ROOT2024 1:Root[0000, 0]@0..0#ROOT2024
|
||||||
SUBTREE {} 0:0@9..10#ROOT2024 0:0@11..12#ROOT2024
|
SUBTREE {} 0:Root[0000, 0]@9..10#ROOT2024 0:Root[0000, 0]@11..12#ROOT2024
|
||||||
|
|
||||||
{}"#]],
|
{}"#]],
|
||||||
);
|
);
|
||||||
|
|
@ -133,25 +135,25 @@ fn token_mapping_smoke_test() {
|
||||||
struct MyTraitMap2
|
struct MyTraitMap2
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..20#ROOT2024 1:0@0..20#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..20#ROOT2024 1:Root[0000, 0]@0..20#ROOT2024
|
||||||
IDENT struct 0:0@34..40#ROOT2024
|
IDENT struct 0:Root[0000, 0]@34..40#ROOT2024
|
||||||
IDENT MyTraitMap2 1:0@8..19#ROOT2024
|
IDENT MyTraitMap2 1:Root[0000, 0]@8..19#ROOT2024
|
||||||
SUBTREE {} 0:0@48..49#ROOT2024 0:0@100..101#ROOT2024
|
SUBTREE {} 0:Root[0000, 0]@48..49#ROOT2024 0:Root[0000, 0]@100..101#ROOT2024
|
||||||
IDENT map 0:0@58..61#ROOT2024
|
IDENT map 0:Root[0000, 0]@58..61#ROOT2024
|
||||||
PUNCH : [alone] 0:0@61..62#ROOT2024
|
PUNCH : [alone] 0:Root[0000, 0]@61..62#ROOT2024
|
||||||
PUNCH : [joint] 0:0@63..64#ROOT2024
|
PUNCH : [joint] 0:Root[0000, 0]@63..64#ROOT2024
|
||||||
PUNCH : [alone] 0:0@64..65#ROOT2024
|
PUNCH : [alone] 0:Root[0000, 0]@64..65#ROOT2024
|
||||||
IDENT std 0:0@65..68#ROOT2024
|
IDENT std 0:Root[0000, 0]@65..68#ROOT2024
|
||||||
PUNCH : [joint] 0:0@68..69#ROOT2024
|
PUNCH : [joint] 0:Root[0000, 0]@68..69#ROOT2024
|
||||||
PUNCH : [alone] 0:0@69..70#ROOT2024
|
PUNCH : [alone] 0:Root[0000, 0]@69..70#ROOT2024
|
||||||
IDENT collections 0:0@70..81#ROOT2024
|
IDENT collections 0:Root[0000, 0]@70..81#ROOT2024
|
||||||
PUNCH : [joint] 0:0@81..82#ROOT2024
|
PUNCH : [joint] 0:Root[0000, 0]@81..82#ROOT2024
|
||||||
PUNCH : [alone] 0:0@82..83#ROOT2024
|
PUNCH : [alone] 0:Root[0000, 0]@82..83#ROOT2024
|
||||||
IDENT HashSet 0:0@83..90#ROOT2024
|
IDENT HashSet 0:Root[0000, 0]@83..90#ROOT2024
|
||||||
PUNCH < [alone] 0:0@90..91#ROOT2024
|
PUNCH < [alone] 0:Root[0000, 0]@90..91#ROOT2024
|
||||||
SUBTREE () 0:0@91..92#ROOT2024 0:0@92..93#ROOT2024
|
SUBTREE () 0:Root[0000, 0]@91..92#ROOT2024 0:Root[0000, 0]@92..93#ROOT2024
|
||||||
PUNCH > [joint] 0:0@93..94#ROOT2024
|
PUNCH > [joint] 0:Root[0000, 0]@93..94#ROOT2024
|
||||||
PUNCH , [alone] 0:0@94..95#ROOT2024
|
PUNCH , [alone] 0:Root[0000, 0]@94..95#ROOT2024
|
||||||
|
|
||||||
struct MyTraitMap2 {
|
struct MyTraitMap2 {
|
||||||
map: ::std::collections::HashSet<()>,
|
map: ::std::collections::HashSet<()>,
|
||||||
|
|
@ -180,28 +182,28 @@ fn main() {
|
||||||
}
|
}
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..63#ROOT2024 1:0@0..63#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..63#ROOT2024 1:Root[0000, 0]@0..63#ROOT2024
|
||||||
IDENT fn 1:0@1..3#ROOT2024
|
IDENT fn 1:Root[0000, 0]@1..3#ROOT2024
|
||||||
IDENT main 1:0@4..8#ROOT2024
|
IDENT main 1:Root[0000, 0]@4..8#ROOT2024
|
||||||
SUBTREE () 1:0@8..9#ROOT2024 1:0@9..10#ROOT2024
|
SUBTREE () 1:Root[0000, 0]@8..9#ROOT2024 1:Root[0000, 0]@9..10#ROOT2024
|
||||||
SUBTREE {} 1:0@11..12#ROOT2024 1:0@61..62#ROOT2024
|
SUBTREE {} 1:Root[0000, 0]@11..12#ROOT2024 1:Root[0000, 0]@61..62#ROOT2024
|
||||||
LITERAL Integer 1 1:0@17..18#ROOT2024
|
LITERAL Integer 1 1:Root[0000, 0]@17..18#ROOT2024
|
||||||
PUNCH ; [alone] 1:0@18..19#ROOT2024
|
PUNCH ; [alone] 1:Root[0000, 0]@18..19#ROOT2024
|
||||||
LITERAL Float 1.0 1:0@24..27#ROOT2024
|
LITERAL Float 1.0 1:Root[0000, 0]@24..27#ROOT2024
|
||||||
PUNCH ; [alone] 1:0@27..28#ROOT2024
|
PUNCH ; [alone] 1:Root[0000, 0]@27..28#ROOT2024
|
||||||
SUBTREE () 1:0@33..34#ROOT2024 1:0@39..40#ROOT2024
|
SUBTREE () 1:Root[0000, 0]@33..34#ROOT2024 1:Root[0000, 0]@39..40#ROOT2024
|
||||||
SUBTREE () 1:0@34..35#ROOT2024 1:0@37..38#ROOT2024
|
SUBTREE () 1:Root[0000, 0]@34..35#ROOT2024 1:Root[0000, 0]@37..38#ROOT2024
|
||||||
LITERAL Integer 1 1:0@35..36#ROOT2024
|
LITERAL Integer 1 1:Root[0000, 0]@35..36#ROOT2024
|
||||||
PUNCH , [alone] 1:0@36..37#ROOT2024
|
PUNCH , [alone] 1:Root[0000, 0]@36..37#ROOT2024
|
||||||
PUNCH , [alone] 1:0@38..39#ROOT2024
|
PUNCH , [alone] 1:Root[0000, 0]@38..39#ROOT2024
|
||||||
PUNCH . [alone] 1:0@40..41#ROOT2024
|
PUNCH . [alone] 1:Root[0000, 0]@40..41#ROOT2024
|
||||||
LITERAL Float 0.0 1:0@41..44#ROOT2024
|
LITERAL Float 0.0 1:Root[0000, 0]@41..44#ROOT2024
|
||||||
PUNCH ; [alone] 1:0@44..45#ROOT2024
|
PUNCH ; [alone] 1:Root[0000, 0]@44..45#ROOT2024
|
||||||
IDENT let 1:0@50..53#ROOT2024
|
IDENT let 1:Root[0000, 0]@50..53#ROOT2024
|
||||||
IDENT x 1:0@54..55#ROOT2024
|
IDENT x 1:Root[0000, 0]@54..55#ROOT2024
|
||||||
PUNCH = [alone] 1:0@56..57#ROOT2024
|
PUNCH = [alone] 1:Root[0000, 0]@56..57#ROOT2024
|
||||||
LITERAL Integer 1 1:0@58..59#ROOT2024
|
LITERAL Integer 1 1:Root[0000, 0]@58..59#ROOT2024
|
||||||
PUNCH ; [alone] 1:0@59..60#ROOT2024
|
PUNCH ; [alone] 1:Root[0000, 0]@59..60#ROOT2024
|
||||||
|
|
||||||
fn main(){
|
fn main(){
|
||||||
1;
|
1;
|
||||||
|
|
@ -227,14 +229,14 @@ fn expr_2021() {
|
||||||
const { 1 },
|
const { 1 },
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..25#ROOT2024 1:0@0..25#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..25#ROOT2024 1:Root[0000, 0]@0..25#ROOT2024
|
||||||
IDENT _ 1:0@5..6#ROOT2024
|
IDENT _ 1:Root[0000, 0]@5..6#ROOT2024
|
||||||
PUNCH ; [joint] 0:0@36..37#ROOT2024
|
PUNCH ; [joint] 0:Root[0000, 0]@36..37#ROOT2024
|
||||||
SUBTREE () 0:0@34..35#ROOT2024 0:0@34..35#ROOT2024
|
SUBTREE () 0:Root[0000, 0]@34..35#ROOT2024 0:Root[0000, 0]@34..35#ROOT2024
|
||||||
IDENT const 1:0@12..17#ROOT2024
|
IDENT const 1:Root[0000, 0]@12..17#ROOT2024
|
||||||
SUBTREE {} 1:0@18..19#ROOT2024 1:0@22..23#ROOT2024
|
SUBTREE {} 1:Root[0000, 0]@18..19#ROOT2024 1:Root[0000, 0]@22..23#ROOT2024
|
||||||
LITERAL Integer 1 1:0@20..21#ROOT2024
|
LITERAL Integer 1 1:Root[0000, 0]@20..21#ROOT2024
|
||||||
PUNCH ; [alone] 0:0@39..40#ROOT2024
|
PUNCH ; [alone] 0:Root[0000, 0]@39..40#ROOT2024
|
||||||
|
|
||||||
_;
|
_;
|
||||||
(const {
|
(const {
|
||||||
|
|
@ -255,13 +257,13 @@ fn expr_2021() {
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
ExpandError {
|
ExpandError {
|
||||||
inner: (
|
inner: (
|
||||||
1:0@5..6#ROOT2024,
|
1:Root[0000, 0]@5..6#ROOT2024,
|
||||||
NoMatchingRule,
|
NoMatchingRule,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBTREE $$ 1:0@0..8#ROOT2024 1:0@0..8#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..8#ROOT2024 1:Root[0000, 0]@0..8#ROOT2024
|
||||||
PUNCH ; [alone] 0:0@39..40#ROOT2024
|
PUNCH ; [alone] 0:Root[0000, 0]@39..40#ROOT2024
|
||||||
|
|
||||||
;"#]],
|
;"#]],
|
||||||
);
|
);
|
||||||
|
|
@ -279,13 +281,13 @@ fn expr_2021() {
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
ExpandError {
|
ExpandError {
|
||||||
inner: (
|
inner: (
|
||||||
1:0@5..10#ROOT2024,
|
1:Root[0000, 0]@5..10#ROOT2024,
|
||||||
NoMatchingRule,
|
NoMatchingRule,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBTREE $$ 1:0@0..18#ROOT2024 1:0@0..18#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..18#ROOT2024 1:Root[0000, 0]@0..18#ROOT2024
|
||||||
PUNCH ; [alone] 0:0@39..40#ROOT2024
|
PUNCH ; [alone] 0:Root[0000, 0]@39..40#ROOT2024
|
||||||
|
|
||||||
;"#]],
|
;"#]],
|
||||||
);
|
);
|
||||||
|
|
@ -305,26 +307,26 @@ fn expr_2021() {
|
||||||
break 'foo bar,
|
break 'foo bar,
|
||||||
"#,
|
"#,
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..76#ROOT2024 1:0@0..76#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..76#ROOT2024 1:Root[0000, 0]@0..76#ROOT2024
|
||||||
LITERAL Integer 4 1:0@5..6#ROOT2024
|
LITERAL Integer 4 1:Root[0000, 0]@5..6#ROOT2024
|
||||||
PUNCH ; [joint] 0:0@41..42#ROOT2024
|
PUNCH ; [joint] 0:Root[0000, 0]@41..42#ROOT2024
|
||||||
LITERAL Str literal 1:0@12..21#ROOT2024
|
LITERAL Str literal 1:Root[0000, 0]@12..21#ROOT2024
|
||||||
PUNCH ; [joint] 0:0@41..42#ROOT2024
|
PUNCH ; [joint] 0:Root[0000, 0]@41..42#ROOT2024
|
||||||
SUBTREE () 0:0@39..40#ROOT2024 0:0@39..40#ROOT2024
|
SUBTREE () 0:Root[0000, 0]@39..40#ROOT2024 0:Root[0000, 0]@39..40#ROOT2024
|
||||||
IDENT funcall 1:0@27..34#ROOT2024
|
IDENT funcall 1:Root[0000, 0]@27..34#ROOT2024
|
||||||
SUBTREE () 1:0@34..35#ROOT2024 1:0@35..36#ROOT2024
|
SUBTREE () 1:Root[0000, 0]@34..35#ROOT2024 1:Root[0000, 0]@35..36#ROOT2024
|
||||||
PUNCH ; [joint] 0:0@41..42#ROOT2024
|
PUNCH ; [joint] 0:Root[0000, 0]@41..42#ROOT2024
|
||||||
SUBTREE () 0:0@39..40#ROOT2024 0:0@39..40#ROOT2024
|
SUBTREE () 0:Root[0000, 0]@39..40#ROOT2024 0:Root[0000, 0]@39..40#ROOT2024
|
||||||
IDENT future 1:0@42..48#ROOT2024
|
IDENT future 1:Root[0000, 0]@42..48#ROOT2024
|
||||||
PUNCH . [alone] 1:0@48..49#ROOT2024
|
PUNCH . [alone] 1:Root[0000, 0]@48..49#ROOT2024
|
||||||
IDENT await 1:0@49..54#ROOT2024
|
IDENT await 1:Root[0000, 0]@49..54#ROOT2024
|
||||||
PUNCH ; [joint] 0:0@41..42#ROOT2024
|
PUNCH ; [joint] 0:Root[0000, 0]@41..42#ROOT2024
|
||||||
SUBTREE () 0:0@39..40#ROOT2024 0:0@39..40#ROOT2024
|
SUBTREE () 0:Root[0000, 0]@39..40#ROOT2024 0:Root[0000, 0]@39..40#ROOT2024
|
||||||
IDENT break 1:0@60..65#ROOT2024
|
IDENT break 1:Root[0000, 0]@60..65#ROOT2024
|
||||||
PUNCH ' [joint] 1:0@66..67#ROOT2024
|
PUNCH ' [joint] 1:Root[0000, 0]@66..67#ROOT2024
|
||||||
IDENT foo 1:0@67..70#ROOT2024
|
IDENT foo 1:Root[0000, 0]@67..70#ROOT2024
|
||||||
IDENT bar 1:0@71..74#ROOT2024
|
IDENT bar 1:Root[0000, 0]@71..74#ROOT2024
|
||||||
PUNCH ; [alone] 0:0@44..45#ROOT2024
|
PUNCH ; [alone] 0:Root[0000, 0]@44..45#ROOT2024
|
||||||
|
|
||||||
4;
|
4;
|
||||||
"literal";
|
"literal";
|
||||||
|
|
@ -346,13 +348,13 @@ fn expr_2021() {
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
ExpandError {
|
ExpandError {
|
||||||
inner: (
|
inner: (
|
||||||
1:0@5..6#ROOT2024,
|
1:Root[0000, 0]@5..6#ROOT2024,
|
||||||
NoMatchingRule,
|
NoMatchingRule,
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBTREE $$ 1:0@0..8#ROOT2024 1:0@0..8#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..8#ROOT2024 1:Root[0000, 0]@0..8#ROOT2024
|
||||||
PUNCH ; [alone] 0:0@44..45#ROOT2024
|
PUNCH ; [alone] 0:Root[0000, 0]@44..45#ROOT2024
|
||||||
|
|
||||||
;"#]],
|
;"#]],
|
||||||
);
|
);
|
||||||
|
|
@ -370,88 +372,88 @@ fn minus_belongs_to_literal() {
|
||||||
check(
|
check(
|
||||||
"-1",
|
"-1",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..2#ROOT2024 1:0@0..2#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..2#ROOT2024 1:Root[0000, 0]@0..2#ROOT2024
|
||||||
PUNCH - [alone] 0:0@10..11#ROOT2024
|
PUNCH - [alone] 0:Root[0000, 0]@10..11#ROOT2024
|
||||||
LITERAL Integer 1 0:0@11..12#ROOT2024
|
LITERAL Integer 1 0:Root[0000, 0]@11..12#ROOT2024
|
||||||
|
|
||||||
-1"#]],
|
-1"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"- 1",
|
"- 1",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..3#ROOT2024 1:0@0..3#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..3#ROOT2024 1:Root[0000, 0]@0..3#ROOT2024
|
||||||
PUNCH - [alone] 0:0@10..11#ROOT2024
|
PUNCH - [alone] 0:Root[0000, 0]@10..11#ROOT2024
|
||||||
LITERAL Integer 1 0:0@11..12#ROOT2024
|
LITERAL Integer 1 0:Root[0000, 0]@11..12#ROOT2024
|
||||||
|
|
||||||
-1"#]],
|
-1"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"-2",
|
"-2",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..2#ROOT2024 1:0@0..2#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..2#ROOT2024 1:Root[0000, 0]@0..2#ROOT2024
|
||||||
PUNCH - [alone] 0:0@25..26#ROOT2024
|
PUNCH - [alone] 0:Root[0000, 0]@25..26#ROOT2024
|
||||||
LITERAL Integer 2 0:0@27..28#ROOT2024
|
LITERAL Integer 2 0:Root[0000, 0]@27..28#ROOT2024
|
||||||
|
|
||||||
-2"#]],
|
-2"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"- 2",
|
"- 2",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..3#ROOT2024 1:0@0..3#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..3#ROOT2024 1:Root[0000, 0]@0..3#ROOT2024
|
||||||
PUNCH - [alone] 0:0@25..26#ROOT2024
|
PUNCH - [alone] 0:Root[0000, 0]@25..26#ROOT2024
|
||||||
LITERAL Integer 2 0:0@27..28#ROOT2024
|
LITERAL Integer 2 0:Root[0000, 0]@27..28#ROOT2024
|
||||||
|
|
||||||
-2"#]],
|
-2"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"-3.0",
|
"-3.0",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..4#ROOT2024 1:0@0..4#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..4#ROOT2024 1:Root[0000, 0]@0..4#ROOT2024
|
||||||
PUNCH - [alone] 0:0@43..44#ROOT2024
|
PUNCH - [alone] 0:Root[0000, 0]@43..44#ROOT2024
|
||||||
LITERAL Float 3.0 0:0@45..48#ROOT2024
|
LITERAL Float 3.0 0:Root[0000, 0]@45..48#ROOT2024
|
||||||
|
|
||||||
-3.0"#]],
|
-3.0"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"- 3.0",
|
"- 3.0",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..5#ROOT2024 1:0@0..5#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..5#ROOT2024 1:Root[0000, 0]@0..5#ROOT2024
|
||||||
PUNCH - [alone] 0:0@43..44#ROOT2024
|
PUNCH - [alone] 0:Root[0000, 0]@43..44#ROOT2024
|
||||||
LITERAL Float 3.0 0:0@45..48#ROOT2024
|
LITERAL Float 3.0 0:Root[0000, 0]@45..48#ROOT2024
|
||||||
|
|
||||||
-3.0"#]],
|
-3.0"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"@1",
|
"@1",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..2#ROOT2024 1:0@0..2#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..2#ROOT2024 1:Root[0000, 0]@0..2#ROOT2024
|
||||||
LITERAL Integer 1 1:0@1..2#ROOT2024
|
LITERAL Integer 1 1:Root[0000, 0]@1..2#ROOT2024
|
||||||
|
|
||||||
1"#]],
|
1"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"@-1",
|
"@-1",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..3#ROOT2024 1:0@0..3#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..3#ROOT2024 1:Root[0000, 0]@0..3#ROOT2024
|
||||||
PUNCH - [alone] 1:0@1..2#ROOT2024
|
PUNCH - [alone] 1:Root[0000, 0]@1..2#ROOT2024
|
||||||
LITERAL Integer 1 1:0@2..3#ROOT2024
|
LITERAL Integer 1 1:Root[0000, 0]@2..3#ROOT2024
|
||||||
|
|
||||||
-1"#]],
|
-1"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"@1.0",
|
"@1.0",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..4#ROOT2024 1:0@0..4#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..4#ROOT2024 1:Root[0000, 0]@0..4#ROOT2024
|
||||||
LITERAL Float 1.0 1:0@1..4#ROOT2024
|
LITERAL Float 1.0 1:Root[0000, 0]@1..4#ROOT2024
|
||||||
|
|
||||||
1.0"#]],
|
1.0"#]],
|
||||||
);
|
);
|
||||||
check(
|
check(
|
||||||
"@-1.0",
|
"@-1.0",
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 1:0@0..5#ROOT2024 1:0@0..5#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..5#ROOT2024 1:Root[0000, 0]@0..5#ROOT2024
|
||||||
PUNCH - [alone] 1:0@1..2#ROOT2024
|
PUNCH - [alone] 1:Root[0000, 0]@1..2#ROOT2024
|
||||||
LITERAL Float 1.0 1:0@2..5#ROOT2024
|
LITERAL Float 1.0 1:Root[0000, 0]@2..5#ROOT2024
|
||||||
|
|
||||||
-1.0"#]],
|
-1.0"#]],
|
||||||
);
|
);
|
||||||
|
|
@ -460,16 +462,16 @@ fn minus_belongs_to_literal() {
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
ExpandError {
|
ExpandError {
|
||||||
inner: (
|
inner: (
|
||||||
1:0@1..2#ROOT2024,
|
1:Root[0000, 0]@1..2#ROOT2024,
|
||||||
BindingError(
|
BindingError(
|
||||||
"expected literal",
|
"expected literal",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBTREE $$ 1:0@0..6#ROOT2024 1:0@0..6#ROOT2024
|
SUBTREE $$ 1:Root[0000, 0]@0..6#ROOT2024 1:Root[0000, 0]@0..6#ROOT2024
|
||||||
PUNCH - [joint] 1:0@1..2#ROOT2024
|
PUNCH - [joint] 1:Root[0000, 0]@1..2#ROOT2024
|
||||||
PUNCH - [alone] 1:0@2..3#ROOT2024
|
PUNCH - [alone] 1:Root[0000, 0]@2..3#ROOT2024
|
||||||
|
|
||||||
--"#]],
|
--"#]],
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,10 @@ pub const HAS_GLOBAL_SPANS: u32 = 3;
|
||||||
pub const RUST_ANALYZER_SPAN_SUPPORT: u32 = 4;
|
pub const RUST_ANALYZER_SPAN_SUPPORT: u32 = 4;
|
||||||
/// Whether literals encode their kind as an additional u32 field and idents their rawness as a u32 field.
|
/// Whether literals encode their kind as an additional u32 field and idents their rawness as a u32 field.
|
||||||
pub const EXTENDED_LEAF_DATA: u32 = 5;
|
pub const EXTENDED_LEAF_DATA: u32 = 5;
|
||||||
|
pub const HASHED_AST_ID: u32 = 6;
|
||||||
|
|
||||||
/// Current API version of the proc-macro protocol.
|
/// Current API version of the proc-macro protocol.
|
||||||
pub const CURRENT_API_VERSION: u32 = EXTENDED_LEAF_DATA;
|
pub const CURRENT_API_VERSION: u32 = HASHED_AST_ID;
|
||||||
|
|
||||||
/// Represents requests sent from the client to the proc-macro-srv.
|
/// Represents requests sent from the client to the proc-macro-srv.
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
|
|
@ -54,7 +55,7 @@ pub enum SpanMode {
|
||||||
Id,
|
Id,
|
||||||
|
|
||||||
/// Rust Analyzer-specific span handling mode.
|
/// Rust Analyzer-specific span handling mode.
|
||||||
RustAnalyzer,
|
RustAnalyzer { fixup_ast_id: u32 },
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represents responses sent from the proc-macro-srv to the client.
|
/// Represents responses sent from the proc-macro-srv to the client.
|
||||||
|
|
@ -201,7 +202,9 @@ type ProtocolWrite<W: Write> = for<'o, 'msg> fn(out: &'o mut W, msg: &'msg str)
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use intern::{Symbol, sym};
|
use intern::{Symbol, sym};
|
||||||
use span::{Edition, ErasedFileAstId, Span, SpanAnchor, SyntaxContext, TextRange, TextSize};
|
use span::{
|
||||||
|
Edition, ROOT_ERASED_FILE_AST_ID, Span, SpanAnchor, SyntaxContext, TextRange, TextSize,
|
||||||
|
};
|
||||||
use tt::{
|
use tt::{
|
||||||
Delimiter, DelimiterKind, Ident, Leaf, Literal, Punct, Spacing, TopSubtree,
|
Delimiter, DelimiterKind, Ident, Leaf, Literal, Punct, Spacing, TopSubtree,
|
||||||
TopSubtreeBuilder,
|
TopSubtreeBuilder,
|
||||||
|
|
@ -215,7 +218,7 @@ mod tests {
|
||||||
span::FileId::from_raw(0xe4e4e),
|
span::FileId::from_raw(0xe4e4e),
|
||||||
span::Edition::CURRENT,
|
span::Edition::CURRENT,
|
||||||
),
|
),
|
||||||
ast_id: ErasedFileAstId::from_raw(0),
|
ast_id: ROOT_ERASED_FILE_AST_ID,
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut builder = TopSubtreeBuilder::new(Delimiter {
|
let mut builder = TopSubtreeBuilder::new(Delimiter {
|
||||||
|
|
@ -305,7 +308,7 @@ mod tests {
|
||||||
#[test]
|
#[test]
|
||||||
fn test_proc_macro_rpc_works() {
|
fn test_proc_macro_rpc_works() {
|
||||||
let tt = fixture_token_tree();
|
let tt = fixture_token_tree();
|
||||||
for v in RUST_ANALYZER_SPAN_SUPPORT..=CURRENT_API_VERSION {
|
for v in HASHED_AST_ID..=CURRENT_API_VERSION {
|
||||||
let mut span_data_table = Default::default();
|
let mut span_data_table = Default::default();
|
||||||
let task = ExpandMacro {
|
let task = ExpandMacro {
|
||||||
data: ExpandMacroData {
|
data: ExpandMacroData {
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use paths::AbsPath;
|
use paths::AbsPath;
|
||||||
|
use span::FIXUP_ERASED_FILE_AST_ID_MARKER;
|
||||||
use stdx::JodChild;
|
use stdx::JodChild;
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
|
@ -15,8 +16,7 @@ use crate::{
|
||||||
legacy_protocol::{
|
legacy_protocol::{
|
||||||
json::{read_json, write_json},
|
json::{read_json, write_json},
|
||||||
msg::{
|
msg::{
|
||||||
CURRENT_API_VERSION, Message, RUST_ANALYZER_SPAN_SUPPORT, Request, Response,
|
CURRENT_API_VERSION, HASHED_AST_ID, Message, Request, Response, ServerConfig, SpanMode,
|
||||||
ServerConfig, SpanMode,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
@ -71,7 +71,9 @@ impl ProcMacroServerProcess {
|
||||||
Ok(v) => {
|
Ok(v) => {
|
||||||
tracing::info!("Proc-macro server version: {v}");
|
tracing::info!("Proc-macro server version: {v}");
|
||||||
srv.version = v;
|
srv.version = v;
|
||||||
if srv.version >= RUST_ANALYZER_SPAN_SUPPORT {
|
if srv.version >= HASHED_AST_ID {
|
||||||
|
// We don't enable spans on versions prior to `HASHED_AST_ID`, because their ast id layout
|
||||||
|
// is different.
|
||||||
if let Ok(mode) = srv.enable_rust_analyzer_spans() {
|
if let Ok(mode) = srv.enable_rust_analyzer_spans() {
|
||||||
srv.mode = mode;
|
srv.mode = mode;
|
||||||
}
|
}
|
||||||
|
|
@ -111,7 +113,11 @@ impl ProcMacroServerProcess {
|
||||||
|
|
||||||
/// Enable support for rust-analyzer span mode if the server supports it.
|
/// Enable support for rust-analyzer span mode if the server supports it.
|
||||||
fn enable_rust_analyzer_spans(&self) -> Result<SpanMode, ServerError> {
|
fn enable_rust_analyzer_spans(&self) -> Result<SpanMode, ServerError> {
|
||||||
let request = Request::SetConfig(ServerConfig { span_mode: SpanMode::RustAnalyzer });
|
let request = Request::SetConfig(ServerConfig {
|
||||||
|
span_mode: SpanMode::RustAnalyzer {
|
||||||
|
fixup_ast_id: FIXUP_ERASED_FILE_AST_ID_MARKER.into_raw(),
|
||||||
|
},
|
||||||
|
});
|
||||||
let response = self.send_task(request)?;
|
let response = self.send_task(request)?;
|
||||||
|
|
||||||
match response {
|
match response {
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@ pub(crate) fn run() -> io::Result<()> {
|
||||||
let write_response = |msg: msg::Response| msg.write(write_json, &mut io::stdout().lock());
|
let write_response = |msg: msg::Response| msg.write(write_json, &mut io::stdout().lock());
|
||||||
|
|
||||||
let env = EnvSnapshot::default();
|
let env = EnvSnapshot::default();
|
||||||
let srv = proc_macro_srv::ProcMacroSrv::new(&env);
|
let mut srv = proc_macro_srv::ProcMacroSrv::new(&env);
|
||||||
|
|
||||||
let mut span_mode = SpanMode::Id;
|
let mut span_mode = SpanMode::Id;
|
||||||
|
|
||||||
|
|
@ -78,7 +78,7 @@ pub(crate) fn run() -> io::Result<()> {
|
||||||
})
|
})
|
||||||
.map_err(msg::PanicMessage)
|
.map_err(msg::PanicMessage)
|
||||||
}),
|
}),
|
||||||
SpanMode::RustAnalyzer => msg::Response::ExpandMacroExtended({
|
SpanMode::RustAnalyzer { .. } => msg::Response::ExpandMacroExtended({
|
||||||
let mut span_data_table = deserialize_span_data_index_map(&span_data_table);
|
let mut span_data_table = deserialize_span_data_index_map(&span_data_table);
|
||||||
|
|
||||||
let def_site = span_data_table[def_site];
|
let def_site = span_data_table[def_site];
|
||||||
|
|
@ -122,6 +122,9 @@ pub(crate) fn run() -> io::Result<()> {
|
||||||
msg::Request::ApiVersionCheck {} => msg::Response::ApiVersionCheck(CURRENT_API_VERSION),
|
msg::Request::ApiVersionCheck {} => msg::Response::ApiVersionCheck(CURRENT_API_VERSION),
|
||||||
msg::Request::SetConfig(config) => {
|
msg::Request::SetConfig(config) => {
|
||||||
span_mode = config.span_mode;
|
span_mode = config.span_mode;
|
||||||
|
if let SpanMode::RustAnalyzer { fixup_ast_id } = span_mode {
|
||||||
|
srv.set_fixup_ast_id(fixup_ast_id);
|
||||||
|
}
|
||||||
msg::Response::SetConfig(config)
|
msg::Response::SetConfig(config)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@
|
||||||
mod version;
|
mod version;
|
||||||
|
|
||||||
use proc_macro::bridge;
|
use proc_macro::bridge;
|
||||||
|
use span::ErasedFileAstId;
|
||||||
use std::{fmt, fs, io, time::SystemTime};
|
use std::{fmt, fs, io, time::SystemTime};
|
||||||
|
|
||||||
use libloading::Library;
|
use libloading::Library;
|
||||||
|
|
@ -161,14 +162,20 @@ impl Expander {
|
||||||
def_site: S,
|
def_site: S,
|
||||||
call_site: S,
|
call_site: S,
|
||||||
mixed_site: S,
|
mixed_site: S,
|
||||||
|
fixup_ast_id: ErasedFileAstId,
|
||||||
) -> Result<TopSubtree<S>, String>
|
) -> Result<TopSubtree<S>, String>
|
||||||
where
|
where
|
||||||
<S::Server as bridge::server::Types>::TokenStream: Default,
|
<S::Server as bridge::server::Types>::TokenStream: Default,
|
||||||
{
|
{
|
||||||
let result = self
|
let result = self.inner.proc_macros.expand(
|
||||||
.inner
|
macro_name,
|
||||||
.proc_macros
|
macro_body,
|
||||||
.expand(macro_name, macro_body, attributes, def_site, call_site, mixed_site);
|
attributes,
|
||||||
|
def_site,
|
||||||
|
call_site,
|
||||||
|
mixed_site,
|
||||||
|
fixup_ast_id,
|
||||||
|
);
|
||||||
result.map_err(|e| e.into_string().unwrap_or_default())
|
result.map_err(|e| e.into_string().unwrap_or_default())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
use paths::{Utf8Path, Utf8PathBuf};
|
use paths::{Utf8Path, Utf8PathBuf};
|
||||||
use span::{Span, TokenId};
|
use span::{ErasedFileAstId, FIXUP_ERASED_FILE_AST_ID_MARKER, Span, TokenId};
|
||||||
|
|
||||||
use crate::server_impl::TokenStream;
|
use crate::server_impl::TokenStream;
|
||||||
|
|
||||||
|
|
@ -57,11 +57,16 @@ pub const RUSTC_VERSION_STRING: &str = env!("RUSTC_VERSION");
|
||||||
pub struct ProcMacroSrv<'env> {
|
pub struct ProcMacroSrv<'env> {
|
||||||
expanders: Mutex<HashMap<Utf8PathBuf, Arc<dylib::Expander>>>,
|
expanders: Mutex<HashMap<Utf8PathBuf, Arc<dylib::Expander>>>,
|
||||||
env: &'env EnvSnapshot,
|
env: &'env EnvSnapshot,
|
||||||
|
fixup_ast_id: ErasedFileAstId,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'env> ProcMacroSrv<'env> {
|
impl<'env> ProcMacroSrv<'env> {
|
||||||
pub fn new(env: &'env EnvSnapshot) -> Self {
|
pub fn new(env: &'env EnvSnapshot) -> Self {
|
||||||
Self { expanders: Default::default(), env }
|
Self { expanders: Default::default(), env, fixup_ast_id: FIXUP_ERASED_FILE_AST_ID_MARKER }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn set_fixup_ast_id(&mut self, fixup_ast_id: u32) {
|
||||||
|
self.fixup_ast_id = ErasedFileAstId::from_raw(fixup_ast_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -101,6 +106,7 @@ impl ProcMacroSrv<'_> {
|
||||||
def_site,
|
def_site,
|
||||||
call_site,
|
call_site,
|
||||||
mixed_site,
|
mixed_site,
|
||||||
|
self.fixup_ast_id,
|
||||||
)
|
)
|
||||||
.map(|tt| tt.0)
|
.map(|tt| tt.0)
|
||||||
});
|
});
|
||||||
|
|
@ -156,25 +162,41 @@ impl ProcMacroSrv<'_> {
|
||||||
|
|
||||||
pub trait ProcMacroSrvSpan: Copy + Send {
|
pub trait ProcMacroSrvSpan: Copy + Send {
|
||||||
type Server: proc_macro::bridge::server::Server<TokenStream = TokenStream<Self>>;
|
type Server: proc_macro::bridge::server::Server<TokenStream = TokenStream<Self>>;
|
||||||
fn make_server(call_site: Self, def_site: Self, mixed_site: Self) -> Self::Server;
|
fn make_server(
|
||||||
|
call_site: Self,
|
||||||
|
def_site: Self,
|
||||||
|
mixed_site: Self,
|
||||||
|
fixup_ast_id: ErasedFileAstId,
|
||||||
|
) -> Self::Server;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ProcMacroSrvSpan for TokenId {
|
impl ProcMacroSrvSpan for TokenId {
|
||||||
type Server = server_impl::token_id::TokenIdServer;
|
type Server = server_impl::token_id::TokenIdServer;
|
||||||
|
|
||||||
fn make_server(call_site: Self, def_site: Self, mixed_site: Self) -> Self::Server {
|
fn make_server(
|
||||||
|
call_site: Self,
|
||||||
|
def_site: Self,
|
||||||
|
mixed_site: Self,
|
||||||
|
_fixup_ast_id: ErasedFileAstId,
|
||||||
|
) -> Self::Server {
|
||||||
Self::Server { call_site, def_site, mixed_site }
|
Self::Server { call_site, def_site, mixed_site }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl ProcMacroSrvSpan for Span {
|
impl ProcMacroSrvSpan for Span {
|
||||||
type Server = server_impl::rust_analyzer_span::RaSpanServer;
|
type Server = server_impl::rust_analyzer_span::RaSpanServer;
|
||||||
fn make_server(call_site: Self, def_site: Self, mixed_site: Self) -> Self::Server {
|
fn make_server(
|
||||||
|
call_site: Self,
|
||||||
|
def_site: Self,
|
||||||
|
mixed_site: Self,
|
||||||
|
fixup_ast_id: ErasedFileAstId,
|
||||||
|
) -> Self::Server {
|
||||||
Self::Server {
|
Self::Server {
|
||||||
call_site,
|
call_site,
|
||||||
def_site,
|
def_site,
|
||||||
mixed_site,
|
mixed_site,
|
||||||
tracked_env_vars: Default::default(),
|
tracked_env_vars: Default::default(),
|
||||||
tracked_paths: Default::default(),
|
tracked_paths: Default::default(),
|
||||||
|
fixup_ast_id,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
//! Proc macro ABI
|
//! Proc macro ABI
|
||||||
|
|
||||||
use proc_macro::bridge;
|
use proc_macro::bridge;
|
||||||
|
use span::ErasedFileAstId;
|
||||||
|
|
||||||
use crate::{ProcMacroKind, ProcMacroSrvSpan, server_impl::TopSubtree};
|
use crate::{ProcMacroKind, ProcMacroSrvSpan, server_impl::TopSubtree};
|
||||||
|
|
||||||
|
|
@ -22,6 +23,7 @@ impl ProcMacros {
|
||||||
def_site: S,
|
def_site: S,
|
||||||
call_site: S,
|
call_site: S,
|
||||||
mixed_site: S,
|
mixed_site: S,
|
||||||
|
fixup_ast_id: ErasedFileAstId,
|
||||||
) -> Result<TopSubtree<S>, crate::PanicMessage> {
|
) -> Result<TopSubtree<S>, crate::PanicMessage> {
|
||||||
let parsed_body = crate::server_impl::TokenStream::with_subtree(macro_body);
|
let parsed_body = crate::server_impl::TokenStream::with_subtree(macro_body);
|
||||||
|
|
||||||
|
|
@ -37,7 +39,7 @@ impl ProcMacros {
|
||||||
{
|
{
|
||||||
let res = client.run(
|
let res = client.run(
|
||||||
&bridge::server::SameThread,
|
&bridge::server::SameThread,
|
||||||
S::make_server(call_site, def_site, mixed_site),
|
S::make_server(call_site, def_site, mixed_site, fixup_ast_id),
|
||||||
parsed_body,
|
parsed_body,
|
||||||
cfg!(debug_assertions),
|
cfg!(debug_assertions),
|
||||||
);
|
);
|
||||||
|
|
@ -48,7 +50,7 @@ impl ProcMacros {
|
||||||
bridge::client::ProcMacro::Bang { name, client } if *name == macro_name => {
|
bridge::client::ProcMacro::Bang { name, client } if *name == macro_name => {
|
||||||
let res = client.run(
|
let res = client.run(
|
||||||
&bridge::server::SameThread,
|
&bridge::server::SameThread,
|
||||||
S::make_server(call_site, def_site, mixed_site),
|
S::make_server(call_site, def_site, mixed_site, fixup_ast_id),
|
||||||
parsed_body,
|
parsed_body,
|
||||||
cfg!(debug_assertions),
|
cfg!(debug_assertions),
|
||||||
);
|
);
|
||||||
|
|
@ -59,7 +61,7 @@ impl ProcMacros {
|
||||||
bridge::client::ProcMacro::Attr { name, client } if *name == macro_name => {
|
bridge::client::ProcMacro::Attr { name, client } if *name == macro_name => {
|
||||||
let res = client.run(
|
let res = client.run(
|
||||||
&bridge::server::SameThread,
|
&bridge::server::SameThread,
|
||||||
S::make_server(call_site, def_site, mixed_site),
|
S::make_server(call_site, def_site, mixed_site, fixup_ast_id),
|
||||||
parsed_attributes,
|
parsed_attributes,
|
||||||
parsed_body,
|
parsed_body,
|
||||||
cfg!(debug_assertions),
|
cfg!(debug_assertions),
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@ use std::{
|
||||||
|
|
||||||
use intern::Symbol;
|
use intern::Symbol;
|
||||||
use proc_macro::bridge::{self, server};
|
use proc_macro::bridge::{self, server};
|
||||||
use span::{FIXUP_ERASED_FILE_AST_ID_MARKER, Span};
|
use span::{ErasedFileAstId, Span};
|
||||||
use tt::{TextRange, TextSize};
|
use tt::{TextRange, TextSize};
|
||||||
|
|
||||||
use crate::server_impl::{from_token_tree, literal_from_str, token_stream::TokenStreamBuilder};
|
use crate::server_impl::{from_token_tree, literal_from_str, token_stream::TokenStreamBuilder};
|
||||||
|
|
@ -28,6 +28,7 @@ pub struct RaSpanServer {
|
||||||
pub call_site: Span,
|
pub call_site: Span,
|
||||||
pub def_site: Span,
|
pub def_site: Span,
|
||||||
pub mixed_site: Span,
|
pub mixed_site: Span,
|
||||||
|
pub fixup_ast_id: ErasedFileAstId,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl server::Types for RaSpanServer {
|
impl server::Types for RaSpanServer {
|
||||||
|
|
@ -181,10 +182,10 @@ impl server::Span for RaSpanServer {
|
||||||
fn join(&mut self, first: Self::Span, second: Self::Span) -> Option<Self::Span> {
|
fn join(&mut self, first: Self::Span, second: Self::Span) -> Option<Self::Span> {
|
||||||
// We can't modify the span range for fixup spans, those are meaningful to fixup, so just
|
// We can't modify the span range for fixup spans, those are meaningful to fixup, so just
|
||||||
// prefer the non-fixup span.
|
// prefer the non-fixup span.
|
||||||
if first.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
|
if first.anchor.ast_id == self.fixup_ast_id {
|
||||||
return Some(second);
|
return Some(second);
|
||||||
}
|
}
|
||||||
if second.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
|
if second.anchor.ast_id == self.fixup_ast_id {
|
||||||
return Some(first);
|
return Some(first);
|
||||||
}
|
}
|
||||||
// FIXME: Once we can talk back to the client, implement a "long join" request for anchors
|
// FIXME: Once we can talk back to the client, implement a "long join" request for anchors
|
||||||
|
|
@ -213,7 +214,7 @@ impl server::Span for RaSpanServer {
|
||||||
end: Bound<usize>,
|
end: Bound<usize>,
|
||||||
) -> Option<Self::Span> {
|
) -> Option<Self::Span> {
|
||||||
// We can't modify the span range for fixup spans, those are meaningful to fixup.
|
// We can't modify the span range for fixup spans, those are meaningful to fixup.
|
||||||
if span.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
|
if span.anchor.ast_id == self.fixup_ast_id {
|
||||||
return Some(span);
|
return Some(span);
|
||||||
}
|
}
|
||||||
let length = span.range.len().into();
|
let length = span.range.len().into();
|
||||||
|
|
@ -256,7 +257,7 @@ impl server::Span for RaSpanServer {
|
||||||
|
|
||||||
fn end(&mut self, span: Self::Span) -> Self::Span {
|
fn end(&mut self, span: Self::Span) -> Self::Span {
|
||||||
// We can't modify the span range for fixup spans, those are meaningful to fixup.
|
// We can't modify the span range for fixup spans, those are meaningful to fixup.
|
||||||
if span.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
|
if span.anchor.ast_id == self.fixup_ast_id {
|
||||||
return span;
|
return span;
|
||||||
}
|
}
|
||||||
Span { range: TextRange::empty(span.range.end()), ..span }
|
Span { range: TextRange::empty(span.range.end()), ..span }
|
||||||
|
|
@ -264,7 +265,7 @@ impl server::Span for RaSpanServer {
|
||||||
|
|
||||||
fn start(&mut self, span: Self::Span) -> Self::Span {
|
fn start(&mut self, span: Self::Span) -> Self::Span {
|
||||||
// We can't modify the span range for fixup spans, those are meaningful to fixup.
|
// We can't modify the span range for fixup spans, those are meaningful to fixup.
|
||||||
if span.anchor.ast_id == FIXUP_ERASED_FILE_AST_ID_MARKER {
|
if span.anchor.ast_id == self.fixup_ast_id {
|
||||||
return span;
|
return span;
|
||||||
}
|
}
|
||||||
Span { range: TextRange::empty(span.range.start()), ..span }
|
Span { range: TextRange::empty(span.range.start()), ..span }
|
||||||
|
|
@ -318,7 +319,7 @@ mod tests {
|
||||||
range: TextRange::empty(TextSize::new(0)),
|
range: TextRange::empty(TextSize::new(0)),
|
||||||
anchor: span::SpanAnchor {
|
anchor: span::SpanAnchor {
|
||||||
file_id: EditionedFileId::current_edition(FileId::from_raw(0)),
|
file_id: EditionedFileId::current_edition(FileId::from_raw(0)),
|
||||||
ast_id: span::ErasedFileAstId::from_raw(0),
|
ast_id: span::ROOT_ERASED_FILE_AST_ID,
|
||||||
},
|
},
|
||||||
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
||||||
};
|
};
|
||||||
|
|
@ -360,7 +361,7 @@ mod tests {
|
||||||
range: TextRange::empty(TextSize::new(0)),
|
range: TextRange::empty(TextSize::new(0)),
|
||||||
anchor: span::SpanAnchor {
|
anchor: span::SpanAnchor {
|
||||||
file_id: EditionedFileId::current_edition(FileId::from_raw(0)),
|
file_id: EditionedFileId::current_edition(FileId::from_raw(0)),
|
||||||
ast_id: span::ErasedFileAstId::from_raw(0),
|
ast_id: span::ROOT_ERASED_FILE_AST_ID,
|
||||||
},
|
},
|
||||||
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -21,14 +21,14 @@ fn test_derive_empty() {
|
||||||
|
|
||||||
SUBTREE $$ 1 1"#]],
|
SUBTREE $$ 1 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT struct 42:2@0..6#ROOT2024
|
IDENT struct 42:Root[0000, 0]@0..6#ROOT2024
|
||||||
IDENT S 42:2@7..8#ROOT2024
|
IDENT S 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
PUNCH ; [alone] 42:2@8..9#ROOT2024
|
PUNCH ; [alone] 42:Root[0000, 0]@8..9#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024"#]],
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -52,19 +52,19 @@ fn test_derive_error() {
|
||||||
LITERAL Str #[derive(DeriveError)] struct S ; 1
|
LITERAL Str #[derive(DeriveError)] struct S ; 1
|
||||||
PUNCH ; [alone] 1"#]],
|
PUNCH ; [alone] 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT struct 42:2@0..6#ROOT2024
|
IDENT struct 42:Root[0000, 0]@0..6#ROOT2024
|
||||||
IDENT S 42:2@7..8#ROOT2024
|
IDENT S 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
PUNCH ; [alone] 42:2@8..9#ROOT2024
|
PUNCH ; [alone] 42:Root[0000, 0]@8..9#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT compile_error 42:2@0..100#ROOT2024
|
IDENT compile_error 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH ! [alone] 42:2@0..100#ROOT2024
|
PUNCH ! [alone] 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
SUBTREE () 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE () 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Str #[derive(DeriveError)] struct S ; 42:2@0..100#ROOT2024
|
LITERAL Str #[derive(DeriveError)] struct S ; 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH ; [alone] 42:2@0..100#ROOT2024"#]],
|
PUNCH ; [alone] 42:Root[0000, 0]@0..100#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -94,25 +94,25 @@ fn test_fn_like_macro_noop() {
|
||||||
PUNCH , [alone] 1
|
PUNCH , [alone] 1
|
||||||
SUBTREE [] 1 1"#]],
|
SUBTREE [] 1 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT ident 42:2@0..5#ROOT2024
|
IDENT ident 42:Root[0000, 0]@0..5#ROOT2024
|
||||||
PUNCH , [alone] 42:2@5..6#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@5..6#ROOT2024
|
||||||
LITERAL Integer 0 42:2@7..8#ROOT2024
|
LITERAL Integer 0 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
PUNCH , [alone] 42:2@8..9#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@8..9#ROOT2024
|
||||||
LITERAL Integer 1 42:2@10..11#ROOT2024
|
LITERAL Integer 1 42:Root[0000, 0]@10..11#ROOT2024
|
||||||
PUNCH , [alone] 42:2@11..12#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@11..12#ROOT2024
|
||||||
SUBTREE [] 42:2@13..14#ROOT2024 42:2@14..15#ROOT2024
|
SUBTREE [] 42:Root[0000, 0]@13..14#ROOT2024 42:Root[0000, 0]@14..15#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT ident 42:2@0..5#ROOT2024
|
IDENT ident 42:Root[0000, 0]@0..5#ROOT2024
|
||||||
PUNCH , [alone] 42:2@5..6#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@5..6#ROOT2024
|
||||||
LITERAL Integer 0 42:2@7..8#ROOT2024
|
LITERAL Integer 0 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
PUNCH , [alone] 42:2@8..9#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@8..9#ROOT2024
|
||||||
LITERAL Integer 1 42:2@10..11#ROOT2024
|
LITERAL Integer 1 42:Root[0000, 0]@10..11#ROOT2024
|
||||||
PUNCH , [alone] 42:2@11..12#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@11..12#ROOT2024
|
||||||
SUBTREE [] 42:2@13..14#ROOT2024 42:2@14..15#ROOT2024"#]],
|
SUBTREE [] 42:Root[0000, 0]@13..14#ROOT2024 42:Root[0000, 0]@14..15#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -134,17 +134,17 @@ fn test_fn_like_macro_clone_ident_subtree() {
|
||||||
PUNCH , [alone] 1
|
PUNCH , [alone] 1
|
||||||
SUBTREE [] 1 1"#]],
|
SUBTREE [] 1 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT ident 42:2@0..5#ROOT2024
|
IDENT ident 42:Root[0000, 0]@0..5#ROOT2024
|
||||||
PUNCH , [alone] 42:2@5..6#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@5..6#ROOT2024
|
||||||
SUBTREE [] 42:2@7..8#ROOT2024 42:2@8..9#ROOT2024
|
SUBTREE [] 42:Root[0000, 0]@7..8#ROOT2024 42:Root[0000, 0]@8..9#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT ident 42:2@0..5#ROOT2024
|
IDENT ident 42:Root[0000, 0]@0..5#ROOT2024
|
||||||
PUNCH , [alone] 42:2@5..6#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@5..6#ROOT2024
|
||||||
SUBTREE [] 42:2@7..9#ROOT2024 42:2@7..9#ROOT2024"#]],
|
SUBTREE [] 42:Root[0000, 0]@7..9#ROOT2024 42:Root[0000, 0]@7..9#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -162,13 +162,13 @@ fn test_fn_like_macro_clone_raw_ident() {
|
||||||
SUBTREE $$ 1 1
|
SUBTREE $$ 1 1
|
||||||
IDENT r#async 1"#]],
|
IDENT r#async 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT r#async 42:2@0..7#ROOT2024
|
IDENT r#async 42:Root[0000, 0]@0..7#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT r#async 42:2@0..7#ROOT2024"#]],
|
IDENT r#async 42:Root[0000, 0]@0..7#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -187,14 +187,14 @@ fn test_fn_like_fn_like_span_join() {
|
||||||
SUBTREE $$ 1 1
|
SUBTREE $$ 1 1
|
||||||
IDENT r#joined 1"#]],
|
IDENT r#joined 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT foo 42:2@0..3#ROOT2024
|
IDENT foo 42:Root[0000, 0]@0..3#ROOT2024
|
||||||
IDENT bar 42:2@8..11#ROOT2024
|
IDENT bar 42:Root[0000, 0]@8..11#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT r#joined 42:2@0..11#ROOT2024"#]],
|
IDENT r#joined 42:Root[0000, 0]@0..11#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -216,17 +216,17 @@ fn test_fn_like_fn_like_span_ops() {
|
||||||
IDENT resolved_at_def_site 1
|
IDENT resolved_at_def_site 1
|
||||||
IDENT start_span 1"#]],
|
IDENT start_span 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT set_def_site 42:2@0..12#ROOT2024
|
IDENT set_def_site 42:Root[0000, 0]@0..12#ROOT2024
|
||||||
IDENT resolved_at_def_site 42:2@13..33#ROOT2024
|
IDENT resolved_at_def_site 42:Root[0000, 0]@13..33#ROOT2024
|
||||||
IDENT start_span 42:2@34..44#ROOT2024
|
IDENT start_span 42:Root[0000, 0]@34..44#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT set_def_site 41:1@0..150#ROOT2024
|
IDENT set_def_site 41:Root[0000, 0]@0..150#ROOT2024
|
||||||
IDENT resolved_at_def_site 42:2@13..33#ROOT2024
|
IDENT resolved_at_def_site 42:Root[0000, 0]@13..33#ROOT2024
|
||||||
IDENT start_span 42:2@34..34#ROOT2024"#]],
|
IDENT start_span 42:Root[0000, 0]@34..34#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -259,28 +259,28 @@ fn test_fn_like_mk_literals() {
|
||||||
PUNCH - [alone] 1
|
PUNCH - [alone] 1
|
||||||
LITERAL Integer 123 1"#]],
|
LITERAL Integer 123 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL ByteStr byte_string 42:2@0..100#ROOT2024
|
LITERAL ByteStr byte_string 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Char c 42:2@0..100#ROOT2024
|
LITERAL Char c 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Str string 42:2@0..100#ROOT2024
|
LITERAL Str string 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Str -string 42:2@0..100#ROOT2024
|
LITERAL Str -string 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL CStr cstring 42:2@0..100#ROOT2024
|
LITERAL CStr cstring 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Float 3.14f64 42:2@0..100#ROOT2024
|
LITERAL Float 3.14f64 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Float 3.14f64 42:2@0..100#ROOT2024
|
LITERAL Float 3.14f64 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Float 3.14 42:2@0..100#ROOT2024
|
LITERAL Float 3.14 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Float 3.14 42:2@0..100#ROOT2024
|
LITERAL Float 3.14 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Integer 123i64 42:2@0..100#ROOT2024
|
LITERAL Integer 123i64 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Integer 123i64 42:2@0..100#ROOT2024
|
LITERAL Integer 123i64 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Integer 123 42:2@0..100#ROOT2024
|
LITERAL Integer 123 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH - [alone] 42:2@0..100#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Integer 123 42:2@0..100#ROOT2024"#]],
|
LITERAL Integer 123 42:Root[0000, 0]@0..100#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -298,13 +298,13 @@ fn test_fn_like_mk_idents() {
|
||||||
IDENT standard 1
|
IDENT standard 1
|
||||||
IDENT r#raw 1"#]],
|
IDENT r#raw 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT standard 42:2@0..100#ROOT2024
|
IDENT standard 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT r#raw 42:2@0..100#ROOT2024"#]],
|
IDENT r#raw 42:Root[0000, 0]@0..100#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -360,51 +360,51 @@ fn test_fn_like_macro_clone_literals() {
|
||||||
PUNCH , [alone] 1
|
PUNCH , [alone] 1
|
||||||
LITERAL CStr null 1"#]],
|
LITERAL CStr null 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Integer 1u16 42:2@0..4#ROOT2024
|
LITERAL Integer 1u16 42:Root[0000, 0]@0..4#ROOT2024
|
||||||
PUNCH , [alone] 42:2@4..5#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@4..5#ROOT2024
|
||||||
LITERAL Integer 2_u32 42:2@6..11#ROOT2024
|
LITERAL Integer 2_u32 42:Root[0000, 0]@6..11#ROOT2024
|
||||||
PUNCH , [alone] 42:2@11..12#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@11..12#ROOT2024
|
||||||
PUNCH - [alone] 42:2@13..14#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@13..14#ROOT2024
|
||||||
LITERAL Integer 4i64 42:2@14..18#ROOT2024
|
LITERAL Integer 4i64 42:Root[0000, 0]@14..18#ROOT2024
|
||||||
PUNCH , [alone] 42:2@18..19#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@18..19#ROOT2024
|
||||||
LITERAL Float 3.14f32 42:2@20..27#ROOT2024
|
LITERAL Float 3.14f32 42:Root[0000, 0]@20..27#ROOT2024
|
||||||
PUNCH , [alone] 42:2@27..28#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@27..28#ROOT2024
|
||||||
LITERAL Str hello bridge 42:2@29..43#ROOT2024
|
LITERAL Str hello bridge 42:Root[0000, 0]@29..43#ROOT2024
|
||||||
PUNCH , [alone] 42:2@43..44#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@43..44#ROOT2024
|
||||||
LITERAL Str suffixedsuffix 42:2@45..61#ROOT2024
|
LITERAL Str suffixedsuffix 42:Root[0000, 0]@45..61#ROOT2024
|
||||||
PUNCH , [alone] 42:2@61..62#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@61..62#ROOT2024
|
||||||
LITERAL StrRaw(2) raw 42:2@63..73#ROOT2024
|
LITERAL StrRaw(2) raw 42:Root[0000, 0]@63..73#ROOT2024
|
||||||
PUNCH , [alone] 42:2@73..74#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@73..74#ROOT2024
|
||||||
LITERAL Char a 42:2@75..78#ROOT2024
|
LITERAL Char a 42:Root[0000, 0]@75..78#ROOT2024
|
||||||
PUNCH , [alone] 42:2@78..79#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@78..79#ROOT2024
|
||||||
LITERAL Byte b 42:2@80..84#ROOT2024
|
LITERAL Byte b 42:Root[0000, 0]@80..84#ROOT2024
|
||||||
PUNCH , [alone] 42:2@84..85#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@84..85#ROOT2024
|
||||||
LITERAL CStr null 42:2@86..93#ROOT2024
|
LITERAL CStr null 42:Root[0000, 0]@86..93#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Integer 1u16 42:2@0..4#ROOT2024
|
LITERAL Integer 1u16 42:Root[0000, 0]@0..4#ROOT2024
|
||||||
PUNCH , [alone] 42:2@4..5#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@4..5#ROOT2024
|
||||||
LITERAL Integer 2_u32 42:2@6..11#ROOT2024
|
LITERAL Integer 2_u32 42:Root[0000, 0]@6..11#ROOT2024
|
||||||
PUNCH , [alone] 42:2@11..12#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@11..12#ROOT2024
|
||||||
PUNCH - [alone] 42:2@13..14#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@13..14#ROOT2024
|
||||||
LITERAL Integer 4i64 42:2@14..18#ROOT2024
|
LITERAL Integer 4i64 42:Root[0000, 0]@14..18#ROOT2024
|
||||||
PUNCH , [alone] 42:2@18..19#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@18..19#ROOT2024
|
||||||
LITERAL Float 3.14f32 42:2@20..27#ROOT2024
|
LITERAL Float 3.14f32 42:Root[0000, 0]@20..27#ROOT2024
|
||||||
PUNCH , [alone] 42:2@27..28#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@27..28#ROOT2024
|
||||||
LITERAL Str hello bridge 42:2@29..43#ROOT2024
|
LITERAL Str hello bridge 42:Root[0000, 0]@29..43#ROOT2024
|
||||||
PUNCH , [alone] 42:2@43..44#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@43..44#ROOT2024
|
||||||
LITERAL Str suffixedsuffix 42:2@45..61#ROOT2024
|
LITERAL Str suffixedsuffix 42:Root[0000, 0]@45..61#ROOT2024
|
||||||
PUNCH , [alone] 42:2@61..62#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@61..62#ROOT2024
|
||||||
LITERAL StrRaw(2) raw 42:2@63..73#ROOT2024
|
LITERAL StrRaw(2) raw 42:Root[0000, 0]@63..73#ROOT2024
|
||||||
PUNCH , [alone] 42:2@73..74#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@73..74#ROOT2024
|
||||||
LITERAL Char a 42:2@75..78#ROOT2024
|
LITERAL Char a 42:Root[0000, 0]@75..78#ROOT2024
|
||||||
PUNCH , [alone] 42:2@78..79#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@78..79#ROOT2024
|
||||||
LITERAL Byte b 42:2@80..84#ROOT2024
|
LITERAL Byte b 42:Root[0000, 0]@80..84#ROOT2024
|
||||||
PUNCH , [alone] 42:2@84..85#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@84..85#ROOT2024
|
||||||
LITERAL CStr null 42:2@86..93#ROOT2024"#]],
|
LITERAL CStr null 42:Root[0000, 0]@86..93#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -442,33 +442,33 @@ fn test_fn_like_macro_negative_literals() {
|
||||||
PUNCH - [alone] 1
|
PUNCH - [alone] 1
|
||||||
LITERAL Float 2.7 1"#]],
|
LITERAL Float 2.7 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH - [alone] 42:2@0..1#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@0..1#ROOT2024
|
||||||
LITERAL Integer 1u16 42:2@1..5#ROOT2024
|
LITERAL Integer 1u16 42:Root[0000, 0]@1..5#ROOT2024
|
||||||
PUNCH , [alone] 42:2@5..6#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@5..6#ROOT2024
|
||||||
PUNCH - [alone] 42:2@7..8#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
LITERAL Integer 2_u32 42:2@9..14#ROOT2024
|
LITERAL Integer 2_u32 42:Root[0000, 0]@9..14#ROOT2024
|
||||||
PUNCH , [alone] 42:2@14..15#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@14..15#ROOT2024
|
||||||
PUNCH - [alone] 42:2@16..17#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@16..17#ROOT2024
|
||||||
LITERAL Float 3.14f32 42:2@17..24#ROOT2024
|
LITERAL Float 3.14f32 42:Root[0000, 0]@17..24#ROOT2024
|
||||||
PUNCH , [alone] 42:2@24..25#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@24..25#ROOT2024
|
||||||
PUNCH - [alone] 42:2@26..27#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@26..27#ROOT2024
|
||||||
LITERAL Float 2.7 42:2@28..31#ROOT2024
|
LITERAL Float 2.7 42:Root[0000, 0]@28..31#ROOT2024
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH - [alone] 42:2@0..1#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@0..1#ROOT2024
|
||||||
LITERAL Integer 1u16 42:2@1..5#ROOT2024
|
LITERAL Integer 1u16 42:Root[0000, 0]@1..5#ROOT2024
|
||||||
PUNCH , [alone] 42:2@5..6#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@5..6#ROOT2024
|
||||||
PUNCH - [alone] 42:2@7..8#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
LITERAL Integer 2_u32 42:2@9..14#ROOT2024
|
LITERAL Integer 2_u32 42:Root[0000, 0]@9..14#ROOT2024
|
||||||
PUNCH , [alone] 42:2@14..15#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@14..15#ROOT2024
|
||||||
PUNCH - [alone] 42:2@16..17#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@16..17#ROOT2024
|
||||||
LITERAL Float 3.14f32 42:2@17..24#ROOT2024
|
LITERAL Float 3.14f32 42:Root[0000, 0]@17..24#ROOT2024
|
||||||
PUNCH , [alone] 42:2@24..25#ROOT2024
|
PUNCH , [alone] 42:Root[0000, 0]@24..25#ROOT2024
|
||||||
PUNCH - [alone] 42:2@26..27#ROOT2024
|
PUNCH - [alone] 42:Root[0000, 0]@26..27#ROOT2024
|
||||||
LITERAL Float 2.7 42:2@28..31#ROOT2024"#]],
|
LITERAL Float 2.7 42:Root[0000, 0]@28..31#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -498,21 +498,21 @@ fn test_attr_macro() {
|
||||||
LITERAL Str #[attr_error(some arguments)] mod m {} 1
|
LITERAL Str #[attr_error(some arguments)] mod m {} 1
|
||||||
PUNCH ; [alone] 1"#]],
|
PUNCH ; [alone] 1"#]],
|
||||||
expect![[r#"
|
expect![[r#"
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT mod 42:2@0..3#ROOT2024
|
IDENT mod 42:Root[0000, 0]@0..3#ROOT2024
|
||||||
IDENT m 42:2@4..5#ROOT2024
|
IDENT m 42:Root[0000, 0]@4..5#ROOT2024
|
||||||
SUBTREE {} 42:2@6..7#ROOT2024 42:2@7..8#ROOT2024
|
SUBTREE {} 42:Root[0000, 0]@6..7#ROOT2024 42:Root[0000, 0]@7..8#ROOT2024
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT some 42:2@0..4#ROOT2024
|
IDENT some 42:Root[0000, 0]@0..4#ROOT2024
|
||||||
IDENT arguments 42:2@5..14#ROOT2024
|
IDENT arguments 42:Root[0000, 0]@5..14#ROOT2024
|
||||||
|
|
||||||
SUBTREE $$ 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE $$ 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
IDENT compile_error 42:2@0..100#ROOT2024
|
IDENT compile_error 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH ! [alone] 42:2@0..100#ROOT2024
|
PUNCH ! [alone] 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
SUBTREE () 42:2@0..100#ROOT2024 42:2@0..100#ROOT2024
|
SUBTREE () 42:Root[0000, 0]@0..100#ROOT2024 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
LITERAL Str #[attr_error(some arguments)] mod m {} 42:2@0..100#ROOT2024
|
LITERAL Str #[attr_error(some arguments)] mod m {} 42:Root[0000, 0]@0..100#ROOT2024
|
||||||
PUNCH ; [alone] 42:2@0..100#ROOT2024"#]],
|
PUNCH ; [alone] 42:Root[0000, 0]@0..100#ROOT2024"#]],
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,10 @@
|
||||||
//! utils used in proc-macro tests
|
//! utils used in proc-macro tests
|
||||||
|
|
||||||
use expect_test::Expect;
|
use expect_test::Expect;
|
||||||
use span::{EditionedFileId, ErasedFileAstId, FileId, Span, SpanAnchor, SyntaxContext, TokenId};
|
use span::{
|
||||||
|
EditionedFileId, FIXUP_ERASED_FILE_AST_ID_MARKER, FileId, ROOT_ERASED_FILE_AST_ID, Span,
|
||||||
|
SpanAnchor, SyntaxContext, TokenId,
|
||||||
|
};
|
||||||
use tt::TextRange;
|
use tt::TextRange;
|
||||||
|
|
||||||
use crate::{EnvSnapshot, ProcMacroSrv, dylib, proc_macro_test_dylib_path};
|
use crate::{EnvSnapshot, ProcMacroSrv, dylib, proc_macro_test_dylib_path};
|
||||||
|
|
@ -65,8 +68,17 @@ fn assert_expand_impl(
|
||||||
let input_ts_string = format!("{input_ts:?}");
|
let input_ts_string = format!("{input_ts:?}");
|
||||||
let attr_ts_string = attr_ts.as_ref().map(|it| format!("{it:?}"));
|
let attr_ts_string = attr_ts.as_ref().map(|it| format!("{it:?}"));
|
||||||
|
|
||||||
let res =
|
let res = expander
|
||||||
expander.expand(macro_name, input_ts, attr_ts, def_site, call_site, mixed_site).unwrap();
|
.expand(
|
||||||
|
macro_name,
|
||||||
|
input_ts,
|
||||||
|
attr_ts,
|
||||||
|
def_site,
|
||||||
|
call_site,
|
||||||
|
mixed_site,
|
||||||
|
FIXUP_ERASED_FILE_AST_ID_MARKER,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
expect.assert_eq(&format!(
|
expect.assert_eq(&format!(
|
||||||
"{input_ts_string}\n\n{}\n\n{res:?}",
|
"{input_ts_string}\n\n{}\n\n{res:?}",
|
||||||
attr_ts_string.unwrap_or_default()
|
attr_ts_string.unwrap_or_default()
|
||||||
|
|
@ -76,7 +88,7 @@ fn assert_expand_impl(
|
||||||
range: TextRange::new(0.into(), 150.into()),
|
range: TextRange::new(0.into(), 150.into()),
|
||||||
anchor: SpanAnchor {
|
anchor: SpanAnchor {
|
||||||
file_id: EditionedFileId::current_edition(FileId::from_raw(41)),
|
file_id: EditionedFileId::current_edition(FileId::from_raw(41)),
|
||||||
ast_id: ErasedFileAstId::from_raw(1),
|
ast_id: ROOT_ERASED_FILE_AST_ID,
|
||||||
},
|
},
|
||||||
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
||||||
};
|
};
|
||||||
|
|
@ -84,7 +96,7 @@ fn assert_expand_impl(
|
||||||
range: TextRange::new(0.into(), 100.into()),
|
range: TextRange::new(0.into(), 100.into()),
|
||||||
anchor: SpanAnchor {
|
anchor: SpanAnchor {
|
||||||
file_id: EditionedFileId::current_edition(FileId::from_raw(42)),
|
file_id: EditionedFileId::current_edition(FileId::from_raw(42)),
|
||||||
ast_id: ErasedFileAstId::from_raw(2),
|
ast_id: ROOT_ERASED_FILE_AST_ID,
|
||||||
},
|
},
|
||||||
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
ctx: SyntaxContext::root(span::Edition::CURRENT),
|
||||||
};
|
};
|
||||||
|
|
@ -98,7 +110,17 @@ fn assert_expand_impl(
|
||||||
let fixture_string = format!("{fixture:?}");
|
let fixture_string = format!("{fixture:?}");
|
||||||
let attr_string = attr.as_ref().map(|it| format!("{it:?}"));
|
let attr_string = attr.as_ref().map(|it| format!("{it:?}"));
|
||||||
|
|
||||||
let res = expander.expand(macro_name, fixture, attr, def_site, call_site, mixed_site).unwrap();
|
let res = expander
|
||||||
|
.expand(
|
||||||
|
macro_name,
|
||||||
|
fixture,
|
||||||
|
attr,
|
||||||
|
def_site,
|
||||||
|
call_site,
|
||||||
|
mixed_site,
|
||||||
|
FIXUP_ERASED_FILE_AST_ID_MARKER,
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
expect_spanned
|
expect_spanned
|
||||||
.assert_eq(&format!("{fixture_string}\n\n{}\n\n{res:#?}", attr_string.unwrap_or_default()));
|
.assert_eq(&format!("{fixture_string}\n\n{}\n\n{res:#?}", attr_string.unwrap_or_default()));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,9 @@ vfs.workspace = true
|
||||||
syntax.workspace = true
|
syntax.workspace = true
|
||||||
stdx.workspace = true
|
stdx.workspace = true
|
||||||
|
|
||||||
|
[dev-dependencies]
|
||||||
|
syntax.workspace = true
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["salsa"]
|
default = ["salsa"]
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -6,7 +6,10 @@ mod hygiene;
|
||||||
mod map;
|
mod map;
|
||||||
|
|
||||||
pub use self::{
|
pub use self::{
|
||||||
ast_id::{AstIdMap, AstIdNode, ErasedFileAstId, FileAstId},
|
ast_id::{
|
||||||
|
AstIdMap, AstIdNode, ErasedFileAstId, FIXUP_ERASED_FILE_AST_ID_MARKER, FileAstId,
|
||||||
|
ROOT_ERASED_FILE_AST_ID,
|
||||||
|
},
|
||||||
hygiene::{SyntaxContext, Transparency},
|
hygiene::{SyntaxContext, Transparency},
|
||||||
map::{RealSpanMap, SpanMap},
|
map::{RealSpanMap, SpanMap},
|
||||||
};
|
};
|
||||||
|
|
@ -15,19 +18,6 @@ pub use syntax::Edition;
|
||||||
pub use text_size::{TextRange, TextSize};
|
pub use text_size::{TextRange, TextSize};
|
||||||
pub use vfs::FileId;
|
pub use vfs::FileId;
|
||||||
|
|
||||||
// The first index is always the root node's AstId
|
|
||||||
/// The root ast id always points to the encompassing file, using this in spans is discouraged as
|
|
||||||
/// any range relative to it will be effectively absolute, ruining the entire point of anchored
|
|
||||||
/// relative text ranges.
|
|
||||||
pub const ROOT_ERASED_FILE_AST_ID: ErasedFileAstId = ErasedFileAstId::from_raw(0);
|
|
||||||
|
|
||||||
/// FileId used as the span for syntax node fixups. Any Span containing this file id is to be
|
|
||||||
/// considered fake.
|
|
||||||
pub const FIXUP_ERASED_FILE_AST_ID_MARKER: ErasedFileAstId =
|
|
||||||
// we pick the second to last for this in case we ever consider making this a NonMaxU32, this
|
|
||||||
// is required to be stable for the proc-macro-server
|
|
||||||
ErasedFileAstId::from_raw(!0 - 1);
|
|
||||||
|
|
||||||
pub type Span = SpanData<SyntaxContext>;
|
pub type Span = SpanData<SyntaxContext>;
|
||||||
|
|
||||||
impl Span {
|
impl Span {
|
||||||
|
|
@ -60,7 +50,7 @@ impl<Ctx: fmt::Debug> fmt::Debug for SpanData<Ctx> {
|
||||||
if f.alternate() {
|
if f.alternate() {
|
||||||
fmt::Debug::fmt(&self.anchor.file_id.file_id().index(), f)?;
|
fmt::Debug::fmt(&self.anchor.file_id.file_id().index(), f)?;
|
||||||
f.write_char(':')?;
|
f.write_char(':')?;
|
||||||
fmt::Debug::fmt(&self.anchor.ast_id.into_raw(), f)?;
|
write!(f, "{:#?}", self.anchor.ast_id)?;
|
||||||
f.write_char('@')?;
|
f.write_char('@')?;
|
||||||
fmt::Debug::fmt(&self.range, f)?;
|
fmt::Debug::fmt(&self.range, f)?;
|
||||||
f.write_char('#')?;
|
f.write_char('#')?;
|
||||||
|
|
@ -85,7 +75,7 @@ impl fmt::Display for Span {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
fmt::Debug::fmt(&self.anchor.file_id.file_id().index(), f)?;
|
fmt::Debug::fmt(&self.anchor.file_id.file_id().index(), f)?;
|
||||||
f.write_char(':')?;
|
f.write_char(':')?;
|
||||||
fmt::Debug::fmt(&self.anchor.ast_id.into_raw(), f)?;
|
write!(f, "{:#?}", self.anchor.ast_id)?;
|
||||||
f.write_char('@')?;
|
f.write_char('@')?;
|
||||||
fmt::Debug::fmt(&self.range, f)?;
|
fmt::Debug::fmt(&self.range, f)?;
|
||||||
f.write_char('#')?;
|
f.write_char('#')?;
|
||||||
|
|
@ -101,7 +91,7 @@ pub struct SpanAnchor {
|
||||||
|
|
||||||
impl fmt::Debug for SpanAnchor {
|
impl fmt::Debug for SpanAnchor {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
f.debug_tuple("SpanAnchor").field(&self.file_id).field(&self.ast_id.into_raw()).finish()
|
f.debug_tuple("SpanAnchor").field(&self.file_id).field(&self.ast_id).finish()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -169,7 +169,7 @@ impl fmt::Display for RealSpanMap {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
writeln!(f, "RealSpanMap({:?}):", self.file_id)?;
|
writeln!(f, "RealSpanMap({:?}):", self.file_id)?;
|
||||||
for span in self.pairs.iter() {
|
for span in self.pairs.iter() {
|
||||||
writeln!(f, "{}: {}", u32::from(span.0), span.1.into_raw())?;
|
writeln!(f, "{}: {:#?}", u32::from(span.0), span.1)?;
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,16 @@ impl ast::Name {
|
||||||
pub fn text(&self) -> TokenText<'_> {
|
pub fn text(&self) -> TokenText<'_> {
|
||||||
text_of_first_token(self.syntax())
|
text_of_first_token(self.syntax())
|
||||||
}
|
}
|
||||||
|
pub fn text_non_mutable(&self) -> &str {
|
||||||
|
fn first_token(green_ref: &GreenNodeData) -> &GreenTokenData {
|
||||||
|
green_ref.children().next().and_then(NodeOrToken::into_token).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
match self.syntax().green() {
|
||||||
|
Cow::Borrowed(green_ref) => first_token(green_ref).text(),
|
||||||
|
Cow::Owned(_) => unreachable!(),
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ast::NameRef {
|
impl ast::NameRef {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue