Remove hir_def/docs.rs module

This commit is contained in:
Lukas Wirth 2020-12-07 18:49:03 +01:00
parent b3652ef288
commit 1caaa201fa
6 changed files with 63 additions and 114 deletions

View file

@ -15,7 +15,6 @@ use tt::Subtree;
use crate::{
db::DefDatabase,
docs::Documentation,
item_tree::{ItemTreeId, ItemTreeNode},
nameres::ModuleSource,
path::ModPath,
@ -23,6 +22,22 @@ use crate::{
AdtId, AttrDefId, Lookup,
};
/// Holds documentation
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Documentation(Arc<str>);
impl Documentation {
pub fn as_str(&self) -> &str {
&self.0
}
}
impl Into<String> for Documentation {
fn into(self) -> String {
self.as_str().to_owned()
}
}
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct Attrs {
entries: Option<Arc<[Attr]>>,
@ -102,7 +117,7 @@ impl Attrs {
},
);
let mut attrs = owner.attrs().peekable();
let entries = if attrs.peek().is_none() {
let entries = if attrs.peek().is_none() && docs.is_none() {
// Avoid heap allocation
None
} else {
@ -154,7 +169,11 @@ impl Attrs {
.intersperse(&SmolStr::new_inline("\n"))
// No FromIterator<SmolStr> for String
.for_each(|s| docs.push_str(s.as_str()));
if docs.is_empty() { None } else { Some(docs) }.map(|it| Documentation::new(&it))
if docs.is_empty() {
None
} else {
Some(Documentation(docs.into()))
}
}
}

View file

@ -1,79 +0,0 @@
//! Defines hir documentation.
//!
//! This really shouldn't exist, instead, we should deshugar doc comments into attributes, see
//! https://github.com/rust-analyzer/rust-analyzer/issues/2148#issuecomment-550519102
use std::sync::Arc;
use itertools::Itertools;
use syntax::{ast, SmolStr};
/// Holds documentation
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Documentation(Arc<str>);
impl Into<String> for Documentation {
fn into(self) -> String {
self.as_str().to_owned()
}
}
impl Documentation {
pub fn new(s: &str) -> Documentation {
Documentation(s.into())
}
pub fn from_ast<N>(node: &N) -> Option<Documentation>
where
N: ast::DocCommentsOwner + ast::AttrsOwner,
{
docs_from_ast(node)
}
pub fn as_str(&self) -> &str {
&*self.0
}
}
pub(crate) fn docs_from_ast<N>(node: &N) -> Option<Documentation>
where
N: ast::DocCommentsOwner + ast::AttrsOwner,
{
let doc_comment_text = node.doc_comment_text();
let doc_attr_text = expand_doc_attrs(node);
let docs = merge_doc_comments_and_attrs(doc_comment_text, doc_attr_text);
docs.map(|it| Documentation::new(&it))
}
fn merge_doc_comments_and_attrs(
doc_comment_text: Option<String>,
doc_attr_text: Option<String>,
) -> Option<String> {
match (doc_comment_text, doc_attr_text) {
(Some(mut comment_text), Some(attr_text)) => {
comment_text.reserve(attr_text.len() + 1);
comment_text.push('\n');
comment_text.push_str(&attr_text);
Some(comment_text)
}
(Some(comment_text), None) => Some(comment_text),
(None, Some(attr_text)) => Some(attr_text),
(None, None) => None,
}
}
fn expand_doc_attrs(owner: &dyn ast::AttrsOwner) -> Option<String> {
let mut docs = String::new();
owner
.attrs()
.filter_map(|attr| attr.as_simple_key_value().filter(|(key, _)| key == "doc"))
.map(|(_, value)| value)
.intersperse(SmolStr::new_inline("\n"))
// No FromIterator<SmolStr> for String
.for_each(|s| docs.push_str(s.as_str()));
if docs.is_empty() {
None
} else {
Some(docs)
}
}

View file

@ -31,7 +31,6 @@ pub mod adt;
pub mod data;
pub mod generics;
pub mod lang_item;
pub mod docs;
pub mod expr;
pub mod body;