Merge pull request #18473 from Veykril/push-xnlzukoqttvz

Render extern blocks in `file_structure`
This commit is contained in:
Lukas Wirth 2024-11-04 11:34:35 +00:00 committed by GitHub
commit 9ad98df61d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 45 additions and 15 deletions

View File

@ -19,6 +19,7 @@ pub struct StructureNode {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum StructureNodeKind {
SymbolKind(SymbolKind),
ExternBlock,
Region,
}
@ -158,6 +159,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
ast::Trait(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Trait)),
ast::TraitAlias(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::TraitAlias)),
ast::Module(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Module)),
ast::Macro(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Macro)),
ast::TypeAlias(it) => decl_with_type_ref(&it, it.ty(), StructureNodeKind::SymbolKind(SymbolKind::TypeAlias)),
ast::RecordField(it) => decl_with_type_ref(&it, it.ty(), StructureNodeKind::SymbolKind(SymbolKind::Field)),
ast::Const(it) => decl_with_type_ref(&it, it.ty(), StructureNodeKind::SymbolKind(SymbolKind::Const)),
@ -205,7 +207,23 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
Some(node)
},
ast::Macro(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Macro)),
ast::ExternBlock(it) => {
let mut label = "extern".to_owned();
let abi = it.abi()?;
if let Some(abi) = abi.string_token() {
label.push(' ');
label.push_str(abi.text());
}
Some(StructureNode {
parent: None,
label,
navigation_range: abi.syntax().text_range(),
node_range: it.syntax().text_range(),
kind: StructureNodeKind::ExternBlock,
detail: None,
deprecated: false,
})
},
_ => None,
}
}
@ -327,6 +345,8 @@ fn f() {}
fn g() {}
}
extern "C" {}
fn let_statements() {
let x = 42;
let mut y = x;
@ -662,11 +682,20 @@ fn let_statements() {
),
deprecated: false,
},
StructureNode {
parent: None,
label: "extern \"C\"",
navigation_range: 638..648,
node_range: 638..651,
kind: ExternBlock,
detail: None,
deprecated: false,
},
StructureNode {
parent: None,
label: "let_statements",
navigation_range: 641..655,
node_range: 638..798,
navigation_range: 656..670,
node_range: 653..813,
kind: SymbolKind(
Function,
),
@ -677,11 +706,11 @@ fn let_statements() {
},
StructureNode {
parent: Some(
26,
27,
),
label: "x",
navigation_range: 668..669,
node_range: 664..675,
navigation_range: 683..684,
node_range: 679..690,
kind: SymbolKind(
Local,
),
@ -690,11 +719,11 @@ fn let_statements() {
},
StructureNode {
parent: Some(
26,
27,
),
label: "mut y",
navigation_range: 684..689,
node_range: 680..694,
navigation_range: 699..704,
node_range: 695..709,
kind: SymbolKind(
Local,
),
@ -703,11 +732,11 @@ fn let_statements() {
},
StructureNode {
parent: Some(
26,
27,
),
label: "Foo { .. }",
navigation_range: 703..725,
node_range: 699..738,
navigation_range: 718..740,
node_range: 714..753,
kind: SymbolKind(
Local,
),
@ -716,11 +745,11 @@ fn let_statements() {
},
StructureNode {
parent: Some(
26,
27,
),
label: "_",
navigation_range: 788..789,
node_range: 784..796,
navigation_range: 803..804,
node_range: 799..811,
kind: SymbolKind(
Local,
),

View File

@ -88,6 +88,7 @@ pub(crate) fn structure_node_kind(kind: StructureNodeKind) -> lsp_types::SymbolK
match kind {
StructureNodeKind::SymbolKind(symbol) => symbol_kind(symbol),
StructureNodeKind::Region => lsp_types::SymbolKind::NAMESPACE,
StructureNodeKind::ExternBlock => lsp_types::SymbolKind::NAMESPACE,
}
}