Skip to content

Commit aa59ac3

Browse files
authored
Merge pull request rust-lang#18473 from Veykril/push-xnlzukoqttvz
Render extern blocks in `file_structure`
2 parents 0cd3fb2 + 8071cbd commit aa59ac3

File tree

2 files changed

+45
-15
lines changed

2 files changed

+45
-15
lines changed

src/tools/rust-analyzer/crates/ide/src/file_structure.rs

+44-15
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ pub struct StructureNode {
1919
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
2020
pub enum StructureNodeKind {
2121
SymbolKind(SymbolKind),
22+
ExternBlock,
2223
Region,
2324
}
2425

@@ -158,6 +159,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> {
158159
ast::Trait(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Trait)),
159160
ast::TraitAlias(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::TraitAlias)),
160161
ast::Module(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Module)),
162+
ast::Macro(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Macro)),
161163
ast::TypeAlias(it) => decl_with_type_ref(&it, it.ty(), StructureNodeKind::SymbolKind(SymbolKind::TypeAlias)),
162164
ast::RecordField(it) => decl_with_type_ref(&it, it.ty(), StructureNodeKind::SymbolKind(SymbolKind::Field)),
163165
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> {
205207

206208
Some(node)
207209
},
208-
ast::Macro(it) => decl(it, StructureNodeKind::SymbolKind(SymbolKind::Macro)),
210+
ast::ExternBlock(it) => {
211+
let mut label = "extern".to_owned();
212+
let abi = it.abi()?;
213+
if let Some(abi) = abi.string_token() {
214+
label.push(' ');
215+
label.push_str(abi.text());
216+
}
217+
Some(StructureNode {
218+
parent: None,
219+
label,
220+
navigation_range: abi.syntax().text_range(),
221+
node_range: it.syntax().text_range(),
222+
kind: StructureNodeKind::ExternBlock,
223+
detail: None,
224+
deprecated: false,
225+
})
226+
},
209227
_ => None,
210228
}
211229
}
@@ -327,6 +345,8 @@ fn f() {}
327345
fn g() {}
328346
}
329347
348+
extern "C" {}
349+
330350
fn let_statements() {
331351
let x = 42;
332352
let mut y = x;
@@ -662,11 +682,20 @@ fn let_statements() {
662682
),
663683
deprecated: false,
664684
},
685+
StructureNode {
686+
parent: None,
687+
label: "extern \"C\"",
688+
navigation_range: 638..648,
689+
node_range: 638..651,
690+
kind: ExternBlock,
691+
detail: None,
692+
deprecated: false,
693+
},
665694
StructureNode {
666695
parent: None,
667696
label: "let_statements",
668-
navigation_range: 641..655,
669-
node_range: 638..798,
697+
navigation_range: 656..670,
698+
node_range: 653..813,
670699
kind: SymbolKind(
671700
Function,
672701
),
@@ -677,11 +706,11 @@ fn let_statements() {
677706
},
678707
StructureNode {
679708
parent: Some(
680-
26,
709+
27,
681710
),
682711
label: "x",
683-
navigation_range: 668..669,
684-
node_range: 664..675,
712+
navigation_range: 683..684,
713+
node_range: 679..690,
685714
kind: SymbolKind(
686715
Local,
687716
),
@@ -690,11 +719,11 @@ fn let_statements() {
690719
},
691720
StructureNode {
692721
parent: Some(
693-
26,
722+
27,
694723
),
695724
label: "mut y",
696-
navigation_range: 684..689,
697-
node_range: 680..694,
725+
navigation_range: 699..704,
726+
node_range: 695..709,
698727
kind: SymbolKind(
699728
Local,
700729
),
@@ -703,11 +732,11 @@ fn let_statements() {
703732
},
704733
StructureNode {
705734
parent: Some(
706-
26,
735+
27,
707736
),
708737
label: "Foo { .. }",
709-
navigation_range: 703..725,
710-
node_range: 699..738,
738+
navigation_range: 718..740,
739+
node_range: 714..753,
711740
kind: SymbolKind(
712741
Local,
713742
),
@@ -716,11 +745,11 @@ fn let_statements() {
716745
},
717746
StructureNode {
718747
parent: Some(
719-
26,
748+
27,
720749
),
721750
label: "_",
722-
navigation_range: 788..789,
723-
node_range: 784..796,
751+
navigation_range: 803..804,
752+
node_range: 799..811,
724753
kind: SymbolKind(
725754
Local,
726755
),

src/tools/rust-analyzer/crates/rust-analyzer/src/lsp/to_proto.rs

+1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ pub(crate) fn structure_node_kind(kind: StructureNodeKind) -> lsp_types::SymbolK
8888
match kind {
8989
StructureNodeKind::SymbolKind(symbol) => symbol_kind(symbol),
9090
StructureNodeKind::Region => lsp_types::SymbolKind::NAMESPACE,
91+
StructureNodeKind::ExternBlock => lsp_types::SymbolKind::NAMESPACE,
9192
}
9293
}
9394

0 commit comments

Comments
 (0)