diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir_def/src/attr.rs | 2 | ||||
-rw-r--r-- | crates/ide/src/display/navigation_target.rs | 52 | ||||
-rw-r--r-- | crates/mbe/src/mbe_expander/matcher.rs | 32 | ||||
-rw-r--r-- | crates/mbe/src/tests.rs | 13 |
4 files changed, 68 insertions, 31 deletions
diff --git a/crates/hir_def/src/attr.rs b/crates/hir_def/src/attr.rs index ff8fb7483..c64b78445 100644 --- a/crates/hir_def/src/attr.rs +++ b/crates/hir_def/src/attr.rs | |||
@@ -23,7 +23,7 @@ use crate::{ | |||
23 | }; | 23 | }; |
24 | 24 | ||
25 | /// Holds documentation | 25 | /// Holds documentation |
26 | #[derive(Debug, Clone, PartialEq, Eq)] | 26 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
27 | pub struct Documentation(String); | 27 | pub struct Documentation(String); |
28 | 28 | ||
29 | impl Documentation { | 29 | impl Documentation { |
diff --git a/crates/ide/src/display/navigation_target.rs b/crates/ide/src/display/navigation_target.rs index 4790d648a..234f80a3a 100644 --- a/crates/ide/src/display/navigation_target.rs +++ b/crates/ide/src/display/navigation_target.rs | |||
@@ -1,11 +1,13 @@ | |||
1 | //! FIXME: write short doc here | 1 | //! FIXME: write short doc here |
2 | 2 | ||
3 | use either::Either; | 3 | use either::Either; |
4 | use hir::{AssocItem, FieldSource, HasSource, InFile, ModuleSource}; | 4 | use hir::{ |
5 | AssocItem, Documentation, FieldSource, HasAttrs, HasSource, HirFileId, InFile, ModuleSource, | ||
6 | }; | ||
5 | use ide_db::base_db::{FileId, SourceDatabase}; | 7 | use ide_db::base_db::{FileId, SourceDatabase}; |
6 | use ide_db::{defs::Definition, RootDatabase}; | 8 | use ide_db::{defs::Definition, RootDatabase}; |
7 | use syntax::{ | 9 | use syntax::{ |
8 | ast::{self, DocCommentsOwner, NameOwner}, | 10 | ast::{self, NameOwner}, |
9 | match_ast, AstNode, SmolStr, | 11 | match_ast, AstNode, SmolStr, |
10 | SyntaxKind::{self, IDENT_PAT, TYPE_PARAM}, | 12 | SyntaxKind::{self, IDENT_PAT, TYPE_PARAM}, |
11 | TextRange, | 13 | TextRange, |
@@ -43,7 +45,7 @@ pub struct NavigationTarget { | |||
43 | pub kind: SyntaxKind, | 45 | pub kind: SyntaxKind, |
44 | pub container_name: Option<SmolStr>, | 46 | pub container_name: Option<SmolStr>, |
45 | pub description: Option<String>, | 47 | pub description: Option<String>, |
46 | pub docs: Option<String>, | 48 | pub docs: Option<Documentation>, |
47 | } | 49 | } |
48 | 50 | ||
49 | pub(crate) trait ToNav { | 51 | pub(crate) trait ToNav { |
@@ -71,7 +73,7 @@ impl NavigationTarget { | |||
71 | frange.range, | 73 | frange.range, |
72 | src.value.syntax().kind(), | 74 | src.value.syntax().kind(), |
73 | ); | 75 | ); |
74 | res.docs = src.value.doc_comment_text(); | 76 | res.docs = module.attrs(db).docs(); |
75 | res.description = src.value.short_label(); | 77 | res.description = src.value.short_label(); |
76 | return res; | 78 | return res; |
77 | } | 79 | } |
@@ -214,14 +216,14 @@ impl ToNavFromAst for hir::Trait {} | |||
214 | 216 | ||
215 | impl<D> ToNav for D | 217 | impl<D> ToNav for D |
216 | where | 218 | where |
217 | D: HasSource + ToNavFromAst + Copy, | 219 | D: HasSource + ToNavFromAst + Copy + HasAttrs, |
218 | D::Ast: ast::DocCommentsOwner + ast::NameOwner + ShortLabel, | 220 | D::Ast: ast::NameOwner + ShortLabel, |
219 | { | 221 | { |
220 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { | 222 | fn to_nav(&self, db: &RootDatabase) -> NavigationTarget { |
221 | let src = self.source(db); | 223 | let src = self.source(db); |
222 | let mut res = | 224 | let mut res = |
223 | NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); | 225 | NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); |
224 | res.docs = src.value.doc_comment_text(); | 226 | res.docs = self.docs(db); |
225 | res.description = src.value.short_label(); | 227 | res.description = src.value.short_label(); |
226 | res | 228 | res |
227 | } | 229 | } |
@@ -274,7 +276,7 @@ impl ToNav for hir::Field { | |||
274 | match &src.value { | 276 | match &src.value { |
275 | FieldSource::Named(it) => { | 277 | FieldSource::Named(it) => { |
276 | let mut res = NavigationTarget::from_named(db, src.with_value(it)); | 278 | let mut res = NavigationTarget::from_named(db, src.with_value(it)); |
277 | res.docs = it.doc_comment_text(); | 279 | res.docs = self.docs(db); |
278 | res.description = it.short_label(); | 280 | res.description = it.short_label(); |
279 | res | 281 | res |
280 | } | 282 | } |
@@ -298,7 +300,7 @@ impl ToNav for hir::MacroDef { | |||
298 | log::debug!("nav target {:#?}", src.value.syntax()); | 300 | log::debug!("nav target {:#?}", src.value.syntax()); |
299 | let mut res = | 301 | let mut res = |
300 | NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); | 302 | NavigationTarget::from_named(db, src.as_ref().map(|it| it as &dyn ast::NameOwner)); |
301 | res.docs = src.value.doc_comment_text(); | 303 | res.docs = self.docs(db); |
302 | res | 304 | res |
303 | } | 305 | } |
304 | } | 306 | } |
@@ -374,26 +376,28 @@ impl ToNav for hir::TypeParam { | |||
374 | } | 376 | } |
375 | } | 377 | } |
376 | 378 | ||
377 | pub(crate) fn docs_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> Option<String> { | 379 | pub(crate) fn docs_from_symbol(db: &RootDatabase, symbol: &FileSymbol) -> Option<Documentation> { |
378 | let parse = db.parse(symbol.file_id); | 380 | let parse = db.parse(symbol.file_id); |
379 | let node = symbol.ptr.to_node(parse.tree().syntax()); | 381 | let node = symbol.ptr.to_node(parse.tree().syntax()); |
382 | let file_id = HirFileId::from(symbol.file_id); | ||
380 | 383 | ||
381 | match_ast! { | 384 | let it = match_ast! { |
382 | match node { | 385 | match node { |
383 | ast::Fn(it) => it.doc_comment_text(), | 386 | ast::Fn(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
384 | ast::Struct(it) => it.doc_comment_text(), | 387 | ast::Struct(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
385 | ast::Enum(it) => it.doc_comment_text(), | 388 | ast::Enum(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
386 | ast::Trait(it) => it.doc_comment_text(), | 389 | ast::Trait(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
387 | ast::Module(it) => it.doc_comment_text(), | 390 | ast::Module(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
388 | ast::TypeAlias(it) => it.doc_comment_text(), | 391 | ast::TypeAlias(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
389 | ast::Const(it) => it.doc_comment_text(), | 392 | ast::Const(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
390 | ast::Static(it) => it.doc_comment_text(), | 393 | ast::Static(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
391 | ast::RecordField(it) => it.doc_comment_text(), | 394 | ast::RecordField(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
392 | ast::Variant(it) => it.doc_comment_text(), | 395 | ast::Variant(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
393 | ast::MacroCall(it) => it.doc_comment_text(), | 396 | ast::MacroCall(it) => hir::Attrs::from_attrs_owner(db, InFile::new(file_id, &it)), |
394 | _ => None, | 397 | _ => return None, |
395 | } | 398 | } |
396 | } | 399 | }; |
400 | it.docs() | ||
397 | } | 401 | } |
398 | 402 | ||
399 | /// Get a description of a symbol. | 403 | /// Get a description of a symbol. |
diff --git a/crates/mbe/src/mbe_expander/matcher.rs b/crates/mbe/src/mbe_expander/matcher.rs index 3f8445897..93ee77908 100644 --- a/crates/mbe/src/mbe_expander/matcher.rs +++ b/crates/mbe/src/mbe_expander/matcher.rs | |||
@@ -356,6 +356,18 @@ impl<'a> TtIter<'a> { | |||
356 | ExpandResult { value: _, err: Some(_) } => None, | 356 | ExpandResult { value: _, err: Some(_) } => None, |
357 | } | 357 | } |
358 | } | 358 | } |
359 | |||
360 | pub(crate) fn eat_char(&mut self, c: char) -> Option<tt::TokenTree> { | ||
361 | let mut fork = self.clone(); | ||
362 | match fork.expect_char(c) { | ||
363 | Ok(_) => { | ||
364 | let tt = self.next().cloned(); | ||
365 | *self = fork; | ||
366 | tt | ||
367 | } | ||
368 | Err(_) => None, | ||
369 | } | ||
370 | } | ||
359 | } | 371 | } |
360 | 372 | ||
361 | pub(super) fn match_repeat( | 373 | pub(super) fn match_repeat( |
@@ -447,10 +459,22 @@ fn match_meta_var(kind: &str, input: &mut TtIter) -> ExpandResult<Option<Fragmen | |||
447 | .expect_lifetime() | 459 | .expect_lifetime() |
448 | .map(|tt| Some(tt)) | 460 | .map(|tt| Some(tt)) |
449 | .map_err(|()| err!("expected lifetime")), | 461 | .map_err(|()| err!("expected lifetime")), |
450 | "literal" => input | 462 | "literal" => { |
451 | .expect_literal() | 463 | let neg = input.eat_char('-'); |
452 | .map(|literal| Some(tt::Leaf::from(literal.clone()).into())) | 464 | input |
453 | .map_err(|()| err!()), | 465 | .expect_literal() |
466 | .map(|literal| { | ||
467 | let lit = tt::Leaf::from(literal.clone()); | ||
468 | match neg { | ||
469 | None => Some(lit.into()), | ||
470 | Some(neg) => Some(tt::TokenTree::Subtree(tt::Subtree { | ||
471 | delimiter: None, | ||
472 | token_trees: vec![neg, lit.into()], | ||
473 | })), | ||
474 | } | ||
475 | }) | ||
476 | .map_err(|()| err!()) | ||
477 | } | ||
454 | // `vis` is optional | 478 | // `vis` is optional |
455 | "vis" => match input.eat_vis() { | 479 | "vis" => match input.eat_vis() { |
456 | Some(vis) => Ok(Some(vis)), | 480 | Some(vis) => Ok(Some(vis)), |
diff --git a/crates/mbe/src/tests.rs b/crates/mbe/src/tests.rs index 0796ceee1..843054fe8 100644 --- a/crates/mbe/src/tests.rs +++ b/crates/mbe/src/tests.rs | |||
@@ -1008,11 +1008,20 @@ fn test_literal() { | |||
1008 | parse_macro( | 1008 | parse_macro( |
1009 | r#" | 1009 | r#" |
1010 | macro_rules! foo { | 1010 | macro_rules! foo { |
1011 | ($ type:ty $ lit:literal) => { const VALUE: $ type = $ lit;}; | 1011 | ($ type:ty , $ lit:literal) => { const VALUE: $ type = $ lit;}; |
1012 | } | 1012 | } |
1013 | "#, | 1013 | "#, |
1014 | ) | 1014 | ) |
1015 | .assert_expand_items(r#"foo!(u8 0);"#, r#"const VALUE : u8 = 0 ;"#); | 1015 | .assert_expand_items(r#"foo!(u8,0);"#, r#"const VALUE : u8 = 0 ;"#); |
1016 | |||
1017 | parse_macro( | ||
1018 | r#" | ||
1019 | macro_rules! foo { | ||
1020 | ($ type:ty , $ lit:literal) => { const VALUE: $ type = $ lit;}; | ||
1021 | } | ||
1022 | "#, | ||
1023 | ) | ||
1024 | .assert_expand_items(r#"foo!(i32,-1);"#, r#"const VALUE : i32 = - 1 ;"#); | ||
1016 | } | 1025 | } |
1017 | 1026 | ||
1018 | #[test] | 1027 | #[test] |