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

View File

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