]> git.lizzy.rs Git - rust.git/commitdiff
Fix API of Attr
authoruHOOCCOOHu <hooccooh1896@gmail.com>
Sun, 29 Sep 2019 21:15:03 +0000 (05:15 +0800)
committeruHOOCCOOHu <hooccooh1896@gmail.com>
Mon, 30 Sep 2019 08:17:53 +0000 (16:17 +0800)
crates/ra_assists/src/assists/add_derive.rs
crates/ra_hir/src/lang_item.rs
crates/ra_hir/src/nameres/raw.rs
crates/ra_ide_api/src/display/structure.rs
crates/ra_ide_api/src/snapshots/highlighting.html
crates/ra_syntax/src/ast/extensions.rs
crates/ra_syntax/src/ast/generated.rs
crates/ra_syntax/src/ast/traits.rs
crates/ra_syntax/src/grammar.ron

index 9c88644df483cd062b0c6fc7032167b14020bbf1..8f2c6266e4ce42abe8af6697a6932119157e1081 100644 (file)
@@ -13,7 +13,7 @@ pub(crate) fn add_derive(mut ctx: AssistCtx<impl HirDatabase>) -> Option<Assist>
     ctx.add_action(AssistId("add_derive"), "add `#[derive]`", |edit| {
         let derive_attr = nominal
             .attrs()
-            .filter_map(|x| x.as_call())
+            .filter_map(|x| x.as_simple_call())
             .filter(|(name, _arg)| name == "derive")
             .map(|(_name, arg)| arg)
             .next();
index bcce314d8818b7e594bda79b365af79eac75528a..dbba433fe01354073fd2c9a3839bcc498b99e8aa 100644 (file)
@@ -151,7 +151,7 @@ fn collect_lang_item<T, N>(
 
 fn lang_item_name<T: AttrsOwner>(node: &T) -> Option<SmolStr> {
     node.attrs()
-        .filter_map(|a| a.as_key_value())
+        .filter_map(|a| a.as_simple_key_value())
         .filter(|(key, _)| key == "lang")
         .map(|(_, val)| val)
         .nth(0)
index c494b95b0e9c36d5a31395b4d9bf662eb222bcae..0e27dd2db318cfe610471a0dc3ba0ed3c2ac44b2 100644 (file)
@@ -353,8 +353,7 @@ fn add_macro(&mut self, current_module: Option<Module>, m: ast::MacroCall) {
 
         let name = m.name().map(|it| it.as_name());
         let ast_id = self.source_ast_id_map.ast_id(&m);
-        let export = m.has_atom_attr("macro_export")
-            || m.attrs().filter_map(|x| x.as_call()).any(|(name, _)| name == "macro_export");
+        let export = m.attrs().filter_map(|x| x.simple_name()).any(|name| name == "macro_export");
 
         let m = self.raw_items.macros.alloc(MacroData { ast_id, path, name, export });
         self.push_item(current_module, RawItem::Macro(m));
@@ -385,7 +384,7 @@ fn push_item(&mut self, current_module: Option<Module>, item: RawItem) {
 
 fn extract_mod_path_attribute(module: &ast::Module) -> Option<SmolStr> {
     module.attrs().into_iter().find_map(|attr| {
-        attr.as_key_value().and_then(|(name, value)| {
+        attr.as_simple_key_value().and_then(|(name, value)| {
             let is_path = name == "path";
             if is_path {
                 Some(value)
index be042ed176ec11129279f2f704ea415578552936..38a56d7524cbdaf2ac8b83c5cd34491bd223de56 100644 (file)
@@ -77,7 +77,7 @@ fn decl_with_detail<N: NameOwner + AttrsOwner>(
             node_range: node.syntax().text_range(),
             kind: node.syntax().kind(),
             detail,
-            deprecated: node.attrs().filter_map(|x| x.as_named()).any(|x| x == "deprecated"),
+            deprecated: node.attrs().filter_map(|x| x.simple_name()).any(|x| x == "deprecated"),
         })
     }
 
index b39c4d3717a7ad89efab4c42c15f5199bf8d6c82..ae30ebba383d06a6f2f287459ac9a112ee53e12c 100644 (file)
@@ -19,7 +19,7 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 .keyword\.unsafe   { color: #DFAF8F; }
 .keyword\.control  { color: #F0DFAF; font-weight: bold; }
 </style>
-<pre><code><span class="attribute">#</span><span class="attribute">[</span><span class="attribute">derive</span><span class="attribute">(</span><span class="attribute">Clone</span><span class="attribute">,</span><span class="attribute"> </span><span class="attribute">Debug</span><span class="attribute">)</span><span class="attribute">]</span>
+<pre><code><span class="attribute">#</span><span class="attribute">[</span><span class="attribute text">derive</span><span class="attribute">(</span><span class="attribute">Clone</span><span class="attribute">,</span><span class="attribute"> </span><span class="attribute">Debug</span><span class="attribute">)</span><span class="attribute">]</span>
 <span class="keyword">struct</span> <span class="type">Foo</span> {
     <span class="keyword">pub</span> <span class="field">x</span>: <span class="type">i32</span>,
     <span class="keyword">pub</span> <span class="field">y</span>: <span class="type">i32</span>,
index 8c5ece65d2bb1bd3cc4cc9bc14cd1d5d2ecc711f..a7b886457954d1bb1d884ad0ff6803c9f24035b3 100644 (file)
@@ -1,10 +1,8 @@
 //! Various extension methods to ast Nodes, which are hard to code-generate.
 //! Extensions for various expressions live in a sibling `expr_extensions` module.
 
-use itertools::Itertools;
-
 use crate::{
-    ast::{self, child_opt, children, AstChildren, AstNode, SyntaxNode},
+    ast::{self, child_opt, children, AstChildren, AstNode, AttrInput, SyntaxNode},
     SmolStr, SyntaxElement,
     SyntaxKind::*,
     SyntaxToken, T,
@@ -39,12 +37,7 @@ fn text_of_first_token(node: &SyntaxNode) -> &SmolStr {
 
 impl ast::Attr {
     pub fn is_inner(&self) -> bool {
-        let tt = match self.value() {
-            None => return false,
-            Some(tt) => tt,
-        };
-
-        let prev = match tt.syntax().prev_sibling() {
+        let prev = match self.syntax().prev_sibling() {
             None => return false,
             Some(prev) => prev,
         };
@@ -52,48 +45,37 @@ pub fn is_inner(&self) -> bool {
         prev.kind() == T![!]
     }
 
-    pub fn as_atom(&self) -> Option<SmolStr> {
-        let tt = self.value()?;
-        let (_bra, attr, _ket) = tt.syntax().children_with_tokens().collect_tuple()?;
-        if attr.kind() == IDENT {
-            Some(attr.as_token()?.text().clone())
-        } else {
-            None
+    pub fn as_simple_atom(&self) -> Option<SmolStr> {
+        match self.input() {
+            None => self.simple_name(),
+            Some(_) => None,
         }
     }
 
-    pub fn as_call(&self) -> Option<(SmolStr, ast::TokenTree)> {
-        let tt = self.value()?;
-        let (_bra, attr, args, _ket) = tt.syntax().children_with_tokens().collect_tuple()?;
-        let args = ast::TokenTree::cast(args.as_node()?.clone())?;
-        if attr.kind() == IDENT {
-            Some((attr.as_token()?.text().clone(), args))
-        } else {
-            None
+    pub fn as_simple_call(&self) -> Option<(SmolStr, ast::TokenTree)> {
+        match self.input() {
+            Some(AttrInput::TokenTree(tt)) => Some((self.simple_name()?, tt)),
+            _ => None,
         }
     }
 
-    pub fn as_named(&self) -> Option<SmolStr> {
-        let tt = self.value()?;
-        let attr = tt.syntax().children_with_tokens().nth(1)?;
-        if attr.kind() == IDENT {
-            Some(attr.as_token()?.text().clone())
-        } else {
-            None
+    pub fn as_simple_key_value(&self) -> Option<(SmolStr, SmolStr)> {
+        match self.input() {
+            Some(AttrInput::Literal(lit)) => {
+                let key = self.simple_name()?;
+                // FIXME: escape? raw string?
+                let value = lit.syntax().first_token()?.text().trim_matches('"').into();
+                Some((key, value))
+            }
+            _ => None,
         }
     }
 
-    pub fn as_key_value(&self) -> Option<(SmolStr, SmolStr)> {
-        let tt = self.value()?;
-        let tt_node = tt.syntax();
-        let attr = tt_node.children_with_tokens().nth(1)?;
-        if attr.kind() == IDENT {
-            let key = attr.as_token()?.text().clone();
-            let val_node = tt_node.children_with_tokens().find(|t| t.kind() == STRING)?;
-            let val = val_node.as_token()?.text().trim_start_matches('"').trim_end_matches('"');
-            Some((key, SmolStr::new(val)))
-        } else {
-            None
+    pub fn simple_name(&self) -> Option<SmolStr> {
+        let path = self.path()?;
+        match (path.segment(), path.qualifier()) {
+            (Some(segment), None) => Some(segment.syntax().first_token()?.text().clone()),
+            _ => None,
         }
     }
 }
index 408449fd6f7e5b4fd2434980077d2bd49d88da99..aaf03ce3f47e9973d657269ce4f594e18883c9b1 100644 (file)
@@ -172,9 +172,6 @@ pub fn path(&self) -> Option<Path> {
     pub fn input(&self) -> Option<AttrInput> {
         AstChildren::new(&self.syntax).next()
     }
-    pub fn value(&self) -> Option<TokenTree> {
-        AstChildren::new(&self.syntax).next()
-    }
 }
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub enum AttrInput {
index c3e676d4c25d7f8a73af697c732f7da64e5e7634..f275a49558d7ad2c264532046e8d4048b02f1258 100644 (file)
@@ -99,7 +99,7 @@ fn attrs(&self) -> AstChildren<ast::Attr> {
         children(self)
     }
     fn has_atom_attr(&self, atom: &str) -> bool {
-        self.attrs().filter_map(|x| x.as_atom()).any(|x| x == atom)
+        self.attrs().filter_map(|x| x.as_simple_atom()).any(|x| x == atom)
     }
 }
 
index 8cb45f3941d9b1ffb66d9a48831fd0042a4c4caa..30328f59faf2b4e635ea009113c74c44b213f13c 100644 (file)
@@ -577,7 +577,7 @@ Grammar(
             options: [ "TokenTree", "Path" ],
         ),
         "AttrInput": ( enum: [ "Literal", "TokenTree" ] ),
-        "Attr": ( options: [ "Path", [ "input", "AttrInput" ], [ "value", "TokenTree" ] ] ),
+        "Attr": ( options: [ "Path", [ "input", "AttrInput" ] ] ),
         "TokenTree": (),
         "TypeParamList": (
             collections: [