Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/span/src/ast_id.rs')
-rw-r--r--crates/span/src/ast_id.rs42
1 files changed, 28 insertions, 14 deletions
diff --git a/crates/span/src/ast_id.rs b/crates/span/src/ast_id.rs
index 121d2e3324..a9288ecd6f 100644
--- a/crates/span/src/ast_id.rs
+++ b/crates/span/src/ast_id.rs
@@ -92,6 +92,7 @@ impl fmt::Debug for ErasedFileAstId {
Use,
Impl,
BlockExpr,
+ AsmExpr,
Fixup,
);
if f.alternate() {
@@ -144,6 +145,10 @@ enum ErasedFileAstIdKind {
Impl,
/// Associated with [`BlockExprFileAstId`].
BlockExpr,
+ // `global_asm!()` is an item, so we need to give it an `AstId`. So we give to all inline asm
+ // because incrementality is not a problem, they will always be the only item in the macro file,
+ // and memory usage also not because they're rare.
+ AsmExpr,
/// Keep this last.
Root,
}
@@ -204,14 +209,17 @@ impl ErasedFileAstId {
.or_else(|| extern_block_ast_id(node, index_map))
.or_else(|| use_ast_id(node, index_map))
.or_else(|| impl_ast_id(node, index_map))
+ .or_else(|| asm_expr_ast_id(node, index_map))
}
fn should_alloc(node: &SyntaxNode) -> bool {
- should_alloc_has_name(node)
- || should_alloc_assoc_item(node)
- || ast::ExternBlock::can_cast(node.kind())
- || ast::Use::can_cast(node.kind())
- || ast::Impl::can_cast(node.kind())
+ let kind = node.kind();
+ should_alloc_has_name(kind)
+ || should_alloc_assoc_item(kind)
+ || ast::ExternBlock::can_cast(kind)
+ || ast::Use::can_cast(kind)
+ || ast::Impl::can_cast(kind)
+ || ast::AsmExpr::can_cast(kind)
}
#[inline]
@@ -278,7 +286,6 @@ impl<N> FileAstId<N> {
#[derive(Hash)]
struct ErasedHasNameFileAstId<'a> {
- kind: SyntaxKind,
name: &'a str,
}
@@ -332,6 +339,19 @@ fn use_ast_id(
}
}
+impl AstIdNode for ast::AsmExpr {}
+
+fn asm_expr_ast_id(
+ node: &SyntaxNode,
+ index_map: &mut ErasedAstIdNextIndexMap,
+) -> Option<ErasedFileAstId> {
+ if ast::AsmExpr::can_cast(node.kind()) {
+ Some(index_map.new_id(ErasedFileAstIdKind::AsmExpr, ()))
+ } else {
+ None
+ }
+}
+
impl AstIdNode for ast::Impl {}
fn impl_ast_id(
@@ -433,7 +453,6 @@ macro_rules! register_has_name_ast_id {
)+
fn has_name_ast_id(node: &SyntaxNode, index_map: &mut ErasedAstIdNextIndexMap) -> Option<ErasedFileAstId> {
- let kind = node.kind();
match_ast! {
match node {
$(
@@ -441,7 +460,6 @@ macro_rules! register_has_name_ast_id {
let name = node.$name_method();
let name = name.as_ref().map_or("", |it| it.text_non_mutable());
let result = ErasedHasNameFileAstId {
- kind,
name,
};
Some(index_map.new_id(ErasedFileAstIdKind::$ident, result))
@@ -452,8 +470,7 @@ macro_rules! register_has_name_ast_id {
}
}
- fn should_alloc_has_name(node: &SyntaxNode) -> bool {
- let kind = node.kind();
+ fn should_alloc_has_name(kind: SyntaxKind) -> bool {
false $( || ast::$ident::can_cast(kind) )*
}
};
@@ -483,7 +500,6 @@ macro_rules! register_assoc_item_ast_id {
index_map: &mut ErasedAstIdNextIndexMap,
parent: Option<&ErasedFileAstId>,
) -> Option<ErasedFileAstId> {
- let kind = node.kind();
match_ast! {
match node {
$(
@@ -491,7 +507,6 @@ macro_rules! register_assoc_item_ast_id {
let name = $name_callback(node);
let name = name.as_ref().map_or("", |it| it.text_non_mutable());
let properties = ErasedHasNameFileAstId {
- kind,
name,
};
let result = ErasedAssocItemFileAstId {
@@ -506,8 +521,7 @@ macro_rules! register_assoc_item_ast_id {
}
}
- fn should_alloc_assoc_item(node: &SyntaxNode) -> bool {
- let kind = node.kind();
+ fn should_alloc_assoc_item(kind: SyntaxKind) -> bool {
false $( || ast::$ident::can_cast(kind) )*
}
};