diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-07-19 12:15:55 +0100 |
---|---|---|
committer | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-07-19 12:15:55 +0100 |
commit | f209843e31af7f0e0212aa28ffec2efad2a70c6f (patch) | |
tree | 548227da78a3bea644f57714d075410c0bdf7469 /crates/ra_ide_api/src/display | |
parent | 58d4983ba5745975446d60f2886d96f8d2adf0f2 (diff) | |
parent | d4a66166c002f0a49e41d856a49cb5685ac93202 (diff) |
Merge #1545
1545: migrate ra_syntax to the new rowan API r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_ide_api/src/display')
-rw-r--r-- | crates/ra_ide_api/src/display/function_signature.rs | 2 | ||||
-rw-r--r-- | crates/ra_ide_api/src/display/navigation_target.rs | 56 | ||||
-rw-r--r-- | crates/ra_ide_api/src/display/structure.rs | 50 |
3 files changed, 55 insertions, 53 deletions
diff --git a/crates/ra_ide_api/src/display/function_signature.rs b/crates/ra_ide_api/src/display/function_signature.rs index e7ad5a0d1..644a4532b 100644 --- a/crates/ra_ide_api/src/display/function_signature.rs +++ b/crates/ra_ide_api/src/display/function_signature.rs | |||
@@ -38,7 +38,7 @@ impl FunctionSignature { | |||
38 | pub(crate) fn from_hir(db: &db::RootDatabase, function: hir::Function) -> Self { | 38 | pub(crate) fn from_hir(db: &db::RootDatabase, function: hir::Function) -> Self { |
39 | let doc = function.docs(db); | 39 | let doc = function.docs(db); |
40 | let ast_node = function.source(db).ast; | 40 | let ast_node = function.source(db).ast; |
41 | FunctionSignature::from(&*ast_node).with_doc_opt(doc) | 41 | FunctionSignature::from(&ast_node).with_doc_opt(doc) |
42 | } | 42 | } |
43 | } | 43 | } |
44 | 44 | ||
diff --git a/crates/ra_ide_api/src/display/navigation_target.rs b/crates/ra_ide_api/src/display/navigation_target.rs index 20a8d418e..8cc853dd1 100644 --- a/crates/ra_ide_api/src/display/navigation_target.rs +++ b/crates/ra_ide_api/src/display/navigation_target.rs | |||
@@ -5,7 +5,7 @@ use ra_syntax::{ | |||
5 | ast::{self, DocCommentsOwner}, | 5 | ast::{self, DocCommentsOwner}, |
6 | AstNode, AstPtr, SmolStr, | 6 | AstNode, AstPtr, SmolStr, |
7 | SyntaxKind::{self, NAME}, | 7 | SyntaxKind::{self, NAME}, |
8 | SyntaxNode, TextRange, TreeArc, | 8 | SyntaxNode, TextRange, |
9 | }; | 9 | }; |
10 | 10 | ||
11 | use super::short_label::ShortLabel; | 11 | use super::short_label::ShortLabel; |
@@ -169,7 +169,7 @@ impl NavigationTarget { | |||
169 | let file_id = src.file_id.original_file(db); | 169 | let file_id = src.file_id.original_file(db); |
170 | match src.ast { | 170 | match src.ast { |
171 | FieldSource::Named(it) => { | 171 | FieldSource::Named(it) => { |
172 | NavigationTarget::from_named(file_id, &*it, it.doc_comment_text(), it.short_label()) | 172 | NavigationTarget::from_named(file_id, &it, it.doc_comment_text(), it.short_label()) |
173 | } | 173 | } |
174 | FieldSource::Pos(it) => { | 174 | FieldSource::Pos(it) => { |
175 | NavigationTarget::from_syntax(file_id, "".into(), None, it.syntax(), None, None) | 175 | NavigationTarget::from_syntax(file_id, "".into(), None, it.syntax(), None, None) |
@@ -179,13 +179,13 @@ impl NavigationTarget { | |||
179 | 179 | ||
180 | pub(crate) fn from_def_source<A, D>(db: &RootDatabase, def: D) -> NavigationTarget | 180 | pub(crate) fn from_def_source<A, D>(db: &RootDatabase, def: D) -> NavigationTarget |
181 | where | 181 | where |
182 | D: HasSource<Ast = TreeArc<A>>, | 182 | D: HasSource<Ast = A>, |
183 | A: ast::DocCommentsOwner + ast::NameOwner + ShortLabel, | 183 | A: ast::DocCommentsOwner + ast::NameOwner + ShortLabel, |
184 | { | 184 | { |
185 | let src = def.source(db); | 185 | let src = def.source(db); |
186 | NavigationTarget::from_named( | 186 | NavigationTarget::from_named( |
187 | src.file_id.original_file(db), | 187 | src.file_id.original_file(db), |
188 | &*src.ast, | 188 | &src.ast, |
189 | src.ast.doc_comment_text(), | 189 | src.ast.doc_comment_text(), |
190 | src.ast.short_label(), | 190 | src.ast.short_label(), |
191 | ) | 191 | ) |
@@ -249,7 +249,7 @@ impl NavigationTarget { | |||
249 | log::debug!("nav target {}", src.ast.syntax().debug_dump()); | 249 | log::debug!("nav target {}", src.ast.syntax().debug_dump()); |
250 | NavigationTarget::from_named( | 250 | NavigationTarget::from_named( |
251 | src.file_id.original_file(db), | 251 | src.file_id.original_file(db), |
252 | &*src.ast, | 252 | &src.ast, |
253 | src.ast.doc_comment_text(), | 253 | src.ast.doc_comment_text(), |
254 | None, | 254 | None, |
255 | ) | 255 | ) |
@@ -318,22 +318,18 @@ pub(crate) fn docs_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> Option | |||
318 | let parse = db.parse(symbol.file_id); | 318 | let parse = db.parse(symbol.file_id); |
319 | let node = symbol.ptr.to_node(parse.tree().syntax()).to_owned(); | 319 | let node = symbol.ptr.to_node(parse.tree().syntax()).to_owned(); |
320 | 320 | ||
321 | fn doc_comments<N: ast::DocCommentsOwner>(node: &N) -> Option<String> { | ||
322 | node.doc_comment_text() | ||
323 | } | ||
324 | |||
325 | visitor() | 321 | visitor() |
326 | .visit(doc_comments::<ast::FnDef>) | 322 | .visit(|it: ast::FnDef| it.doc_comment_text()) |
327 | .visit(doc_comments::<ast::StructDef>) | 323 | .visit(|it: ast::StructDef| it.doc_comment_text()) |
328 | .visit(doc_comments::<ast::EnumDef>) | 324 | .visit(|it: ast::EnumDef| it.doc_comment_text()) |
329 | .visit(doc_comments::<ast::TraitDef>) | 325 | .visit(|it: ast::TraitDef| it.doc_comment_text()) |
330 | .visit(doc_comments::<ast::Module>) | 326 | .visit(|it: ast::Module| it.doc_comment_text()) |
331 | .visit(doc_comments::<ast::TypeAliasDef>) | 327 | .visit(|it: ast::TypeAliasDef| it.doc_comment_text()) |
332 | .visit(doc_comments::<ast::ConstDef>) | 328 | .visit(|it: ast::ConstDef| it.doc_comment_text()) |
333 | .visit(doc_comments::<ast::StaticDef>) | 329 | .visit(|it: ast::StaticDef| it.doc_comment_text()) |
334 | .visit(doc_comments::<ast::NamedFieldDef>) | 330 | .visit(|it: ast::NamedFieldDef| it.doc_comment_text()) |
335 | .visit(doc_comments::<ast::EnumVariant>) | 331 | .visit(|it: ast::EnumVariant| it.doc_comment_text()) |
336 | .visit(doc_comments::<ast::MacroCall>) | 332 | .visit(|it: ast::MacroCall| it.doc_comment_text()) |
337 | .accept(&node)? | 333 | .accept(&node)? |
338 | } | 334 | } |
339 | 335 | ||
@@ -345,15 +341,15 @@ pub(crate) fn description_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> | |||
345 | let node = symbol.ptr.to_node(parse.tree().syntax()).to_owned(); | 341 | let node = symbol.ptr.to_node(parse.tree().syntax()).to_owned(); |
346 | 342 | ||
347 | visitor() | 343 | visitor() |
348 | .visit(|node: &ast::FnDef| node.short_label()) | 344 | .visit(|node: ast::FnDef| node.short_label()) |
349 | .visit(|node: &ast::StructDef| node.short_label()) | 345 | .visit(|node: ast::StructDef| node.short_label()) |
350 | .visit(|node: &ast::EnumDef| node.short_label()) | 346 | .visit(|node: ast::EnumDef| node.short_label()) |
351 | .visit(|node: &ast::TraitDef| node.short_label()) | 347 | .visit(|node: ast::TraitDef| node.short_label()) |
352 | .visit(|node: &ast::Module| node.short_label()) | 348 | .visit(|node: ast::Module| node.short_label()) |
353 | .visit(|node: &ast::TypeAliasDef| node.short_label()) | 349 | .visit(|node: ast::TypeAliasDef| node.short_label()) |
354 | .visit(|node: &ast::ConstDef| node.short_label()) | 350 | .visit(|node: ast::ConstDef| node.short_label()) |
355 | .visit(|node: &ast::StaticDef| node.short_label()) | 351 | .visit(|node: ast::StaticDef| node.short_label()) |
356 | .visit(|node: &ast::NamedFieldDef| node.short_label()) | 352 | .visit(|node: ast::NamedFieldDef| node.short_label()) |
357 | .visit(|node: &ast::EnumVariant| node.short_label()) | 353 | .visit(|node: ast::EnumVariant| node.short_label()) |
358 | .accept(&node)? | 354 | .accept(&node)? |
359 | } | 355 | } |
diff --git a/crates/ra_ide_api/src/display/structure.rs b/crates/ra_ide_api/src/display/structure.rs index 638484a9b..2e183d2f6 100644 --- a/crates/ra_ide_api/src/display/structure.rs +++ b/crates/ra_ide_api/src/display/structure.rs | |||
@@ -24,14 +24,14 @@ pub fn file_structure(file: &SourceFile) -> Vec<StructureNode> { | |||
24 | for event in file.syntax().preorder() { | 24 | for event in file.syntax().preorder() { |
25 | match event { | 25 | match event { |
26 | WalkEvent::Enter(node) => { | 26 | WalkEvent::Enter(node) => { |
27 | if let Some(mut symbol) = structure_node(node) { | 27 | if let Some(mut symbol) = structure_node(&node) { |
28 | symbol.parent = stack.last().copied(); | 28 | symbol.parent = stack.last().copied(); |
29 | stack.push(res.len()); | 29 | stack.push(res.len()); |
30 | res.push(symbol); | 30 | res.push(symbol); |
31 | } | 31 | } |
32 | } | 32 | } |
33 | WalkEvent::Leave(node) => { | 33 | WalkEvent::Leave(node) => { |
34 | if structure_node(node).is_some() { | 34 | if structure_node(&node).is_some() { |
35 | stack.pop().unwrap(); | 35 | stack.pop().unwrap(); |
36 | } | 36 | } |
37 | } | 37 | } |
@@ -41,19 +41,20 @@ pub fn file_structure(file: &SourceFile) -> Vec<StructureNode> { | |||
41 | } | 41 | } |
42 | 42 | ||
43 | fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { | 43 | fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { |
44 | fn decl<N: NameOwner + AttrsOwner>(node: &N) -> Option<StructureNode> { | 44 | fn decl<N: NameOwner + AttrsOwner>(node: N) -> Option<StructureNode> { |
45 | decl_with_detail(node, None) | 45 | decl_with_detail(node, None) |
46 | } | 46 | } |
47 | 47 | ||
48 | fn decl_with_ascription<N: NameOwner + AttrsOwner + TypeAscriptionOwner>( | 48 | fn decl_with_ascription<N: NameOwner + AttrsOwner + TypeAscriptionOwner>( |
49 | node: &N, | 49 | node: N, |
50 | ) -> Option<StructureNode> { | 50 | ) -> Option<StructureNode> { |
51 | decl_with_type_ref(node, node.ascribed_type()) | 51 | let ty = node.ascribed_type(); |
52 | decl_with_type_ref(node, ty) | ||
52 | } | 53 | } |
53 | 54 | ||
54 | fn decl_with_type_ref<N: NameOwner + AttrsOwner>( | 55 | fn decl_with_type_ref<N: NameOwner + AttrsOwner>( |
55 | node: &N, | 56 | node: N, |
56 | type_ref: Option<&ast::TypeRef>, | 57 | type_ref: Option<ast::TypeRef>, |
57 | ) -> Option<StructureNode> { | 58 | ) -> Option<StructureNode> { |
58 | let detail = type_ref.map(|type_ref| { | 59 | let detail = type_ref.map(|type_ref| { |
59 | let mut detail = String::new(); | 60 | let mut detail = String::new(); |
@@ -64,7 +65,7 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { | |||
64 | } | 65 | } |
65 | 66 | ||
66 | fn decl_with_detail<N: NameOwner + AttrsOwner>( | 67 | fn decl_with_detail<N: NameOwner + AttrsOwner>( |
67 | node: &N, | 68 | node: N, |
68 | detail: Option<String>, | 69 | detail: Option<String>, |
69 | ) -> Option<StructureNode> { | 70 | ) -> Option<StructureNode> { |
70 | let name = node.name()?; | 71 | let name = node.name()?; |
@@ -82,22 +83,24 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { | |||
82 | 83 | ||
83 | fn collapse_ws(node: &SyntaxNode, output: &mut String) { | 84 | fn collapse_ws(node: &SyntaxNode, output: &mut String) { |
84 | let mut can_insert_ws = false; | 85 | let mut can_insert_ws = false; |
85 | for line in node.text().chunks().flat_map(|chunk| chunk.lines()) { | 86 | for chunk in node.text().chunks() { |
86 | let line = line.trim(); | 87 | for line in chunk.lines() { |
87 | if line.is_empty() { | 88 | let line = line.trim(); |
88 | if can_insert_ws { | 89 | if line.is_empty() { |
89 | output.push_str(" "); | 90 | if can_insert_ws { |
90 | can_insert_ws = false; | 91 | output.push_str(" "); |
92 | can_insert_ws = false; | ||
93 | } | ||
94 | } else { | ||
95 | output.push_str(line); | ||
96 | can_insert_ws = true; | ||
91 | } | 97 | } |
92 | } else { | ||
93 | output.push_str(line); | ||
94 | can_insert_ws = true; | ||
95 | } | 98 | } |
96 | } | 99 | } |
97 | } | 100 | } |
98 | 101 | ||
99 | visitor() | 102 | visitor() |
100 | .visit(|fn_def: &ast::FnDef| { | 103 | .visit(|fn_def: ast::FnDef| { |
101 | let mut detail = String::from("fn"); | 104 | let mut detail = String::from("fn"); |
102 | if let Some(type_param_list) = fn_def.type_param_list() { | 105 | if let Some(type_param_list) = fn_def.type_param_list() { |
103 | collapse_ws(type_param_list.syntax(), &mut detail); | 106 | collapse_ws(type_param_list.syntax(), &mut detail); |
@@ -117,11 +120,14 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { | |||
117 | .visit(decl::<ast::EnumVariant>) | 120 | .visit(decl::<ast::EnumVariant>) |
118 | .visit(decl::<ast::TraitDef>) | 121 | .visit(decl::<ast::TraitDef>) |
119 | .visit(decl::<ast::Module>) | 122 | .visit(decl::<ast::Module>) |
120 | .visit(|td: &ast::TypeAliasDef| decl_with_type_ref(td, td.type_ref())) | 123 | .visit(|td: ast::TypeAliasDef| { |
124 | let ty = td.type_ref(); | ||
125 | decl_with_type_ref(td, ty) | ||
126 | }) | ||
121 | .visit(decl_with_ascription::<ast::NamedFieldDef>) | 127 | .visit(decl_with_ascription::<ast::NamedFieldDef>) |
122 | .visit(decl_with_ascription::<ast::ConstDef>) | 128 | .visit(decl_with_ascription::<ast::ConstDef>) |
123 | .visit(decl_with_ascription::<ast::StaticDef>) | 129 | .visit(decl_with_ascription::<ast::StaticDef>) |
124 | .visit(|im: &ast::ImplBlock| { | 130 | .visit(|im: ast::ImplBlock| { |
125 | let target_type = im.target_type()?; | 131 | let target_type = im.target_type()?; |
126 | let target_trait = im.target_trait(); | 132 | let target_trait = im.target_trait(); |
127 | let label = match target_trait { | 133 | let label = match target_trait { |
@@ -142,14 +148,14 @@ fn structure_node(node: &SyntaxNode) -> Option<StructureNode> { | |||
142 | }; | 148 | }; |
143 | Some(node) | 149 | Some(node) |
144 | }) | 150 | }) |
145 | .visit(|mc: &ast::MacroCall| { | 151 | .visit(|mc: ast::MacroCall| { |
146 | let first_token = mc.syntax().first_token().unwrap(); | 152 | let first_token = mc.syntax().first_token().unwrap(); |
147 | if first_token.text().as_str() != "macro_rules" { | 153 | if first_token.text().as_str() != "macro_rules" { |
148 | return None; | 154 | return None; |
149 | } | 155 | } |
150 | decl(mc) | 156 | decl(mc) |
151 | }) | 157 | }) |
152 | .accept(node)? | 158 | .accept(&node)? |
153 | } | 159 | } |
154 | 160 | ||
155 | #[cfg(test)] | 161 | #[cfg(test)] |