aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres/raw.rs
diff options
context:
space:
mode:
authoruHOOCCOOHu <[email protected]>2019-09-29 23:52:15 +0100
committeruHOOCCOOHu <[email protected]>2019-10-02 19:28:02 +0100
commitb1ed887d813bf5775a16624694939fdf836f97b1 (patch)
treeb69daa2ca7d29a3362e9608ad0596de18caffa18 /crates/ra_hir/src/nameres/raw.rs
parentffe179a73663b111e4b3ee8a3f525fb3e461c78e (diff)
Introduce ra_cfg to parse and evaluate CfgExpr
Diffstat (limited to 'crates/ra_hir/src/nameres/raw.rs')
-rw-r--r--crates/ra_hir/src/nameres/raw.rs21
1 files changed, 11 insertions, 10 deletions
diff --git a/crates/ra_hir/src/nameres/raw.rs b/crates/ra_hir/src/nameres/raw.rs
index cacbcb517..ff079bcf1 100644
--- a/crates/ra_hir/src/nameres/raw.rs
+++ b/crates/ra_hir/src/nameres/raw.rs
@@ -2,7 +2,6 @@
2 2
3use std::{ops::Index, sync::Arc}; 3use std::{ops::Index, sync::Arc};
4 4
5use mbe::ast_to_token_tree;
6use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; 5use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId};
7use ra_syntax::{ 6use ra_syntax::{
8 ast::{self, AttrsOwner, NameOwner}, 7 ast::{self, AttrsOwner, NameOwner},
@@ -11,6 +10,7 @@ use ra_syntax::{
11use test_utils::tested_by; 10use test_utils::tested_by;
12 11
13use crate::{ 12use crate::{
13 attr::Attr,
14 db::{AstDatabase, DefDatabase}, 14 db::{AstDatabase, DefDatabase},
15 AsName, AstIdMap, Either, FileAstId, HirFileId, ModuleSource, Name, Path, Source, 15 AsName, AstIdMap, Either, FileAstId, HirFileId, ModuleSource, Name, Path, Source,
16}; 16};
@@ -29,8 +29,6 @@ pub struct RawItems {
29 items: Vec<RawItem>, 29 items: Vec<RawItem>,
30} 30}
31 31
32type Attrs = Arc<[tt::Subtree]>;
33
34#[derive(Debug, Default, PartialEq, Eq)] 32#[derive(Debug, Default, PartialEq, Eq)]
35pub struct ImportSourceMap { 33pub struct ImportSourceMap {
36 map: ArenaMap<ImportId, ImportSourcePtr>, 34 map: ArenaMap<ImportId, ImportSourcePtr>,
@@ -124,7 +122,7 @@ impl Index<Macro> for RawItems {
124 122
125#[derive(Debug, PartialEq, Eq, Clone)] 123#[derive(Debug, PartialEq, Eq, Clone)]
126pub(super) struct RawItem { 124pub(super) struct RawItem {
127 pub(super) attrs: Attrs, 125 pub(super) attrs: Arc<[Attr]>,
128 pub(super) kind: RawItemKind, 126 pub(super) kind: RawItemKind,
129} 127}
130 128
@@ -285,6 +283,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
285 let attrs = self.parse_attrs(&module); 283 let attrs = self.parse_attrs(&module);
286 284
287 let ast_id = self.source_ast_id_map.ast_id(&module); 285 let ast_id = self.source_ast_id_map.ast_id(&module);
286 // FIXME: cfg_attr
288 let is_macro_use = module.has_atom_attr("macro_use"); 287 let is_macro_use = module.has_atom_attr("macro_use");
289 if module.has_semi() { 288 if module.has_semi() {
290 let attr_path = extract_mod_path_attribute(&module); 289 let attr_path = extract_mod_path_attribute(&module);
@@ -315,6 +314,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
315 } 314 }
316 315
317 fn add_use_item(&mut self, current_module: Option<Module>, use_item: ast::UseItem) { 316 fn add_use_item(&mut self, current_module: Option<Module>, use_item: ast::UseItem) {
317 // FIXME: cfg_attr
318 let is_prelude = use_item.has_atom_attr("prelude_import"); 318 let is_prelude = use_item.has_atom_attr("prelude_import");
319 let attrs = self.parse_attrs(&use_item); 319 let attrs = self.parse_attrs(&use_item);
320 320
@@ -349,6 +349,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
349 let path = Path::from_name_ref(&name_ref); 349 let path = Path::from_name_ref(&name_ref);
350 let alias = extern_crate.alias().and_then(|a| a.name()).map(|it| it.as_name()); 350 let alias = extern_crate.alias().and_then(|a| a.name()).map(|it| it.as_name());
351 let attrs = self.parse_attrs(&extern_crate); 351 let attrs = self.parse_attrs(&extern_crate);
352 // FIXME: cfg_attr
352 let is_macro_use = extern_crate.has_atom_attr("macro_use"); 353 let is_macro_use = extern_crate.has_atom_attr("macro_use");
353 let import_data = ImportData { 354 let import_data = ImportData {
354 path, 355 path,
@@ -368,6 +369,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
368 } 369 }
369 370
370 fn add_macro(&mut self, current_module: Option<Module>, m: ast::MacroCall) { 371 fn add_macro(&mut self, current_module: Option<Module>, m: ast::MacroCall) {
372 let attrs = self.parse_attrs(&m);
371 let path = match m 373 let path = match m
372 .path() 374 .path()
373 .and_then(|path| Path::from_src(Source { ast: path, file_id: self.file_id }, self.db)) 375 .and_then(|path| Path::from_src(Source { ast: path, file_id: self.file_id }, self.db))
@@ -378,6 +380,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
378 380
379 let name = m.name().map(|it| it.as_name()); 381 let name = m.name().map(|it| it.as_name());
380 let ast_id = self.source_ast_id_map.ast_id(&m); 382 let ast_id = self.source_ast_id_map.ast_id(&m);
383 // FIXME: cfg_attr
381 let export = m.attrs().filter_map(|x| x.simple_name()).any(|name| name == "macro_export"); 384 let export = m.attrs().filter_map(|x| x.simple_name()).any(|name| name == "macro_export");
382 385
383 let m = self.raw_items.macros.alloc(MacroData { ast_id, path, name, export }); 386 let m = self.raw_items.macros.alloc(MacroData { ast_id, path, name, export });
@@ -387,7 +390,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
387 fn push_import( 390 fn push_import(
388 &mut self, 391 &mut self,
389 current_module: Option<Module>, 392 current_module: Option<Module>,
390 attrs: Attrs, 393 attrs: Arc<[Attr]>,
391 data: ImportData, 394 data: ImportData,
392 source: ImportSourcePtr, 395 source: ImportSourcePtr,
393 ) { 396 ) {
@@ -396,7 +399,7 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
396 self.push_item(current_module, attrs, RawItemKind::Import(import)) 399 self.push_item(current_module, attrs, RawItemKind::Import(import))
397 } 400 }
398 401
399 fn push_item(&mut self, current_module: Option<Module>, attrs: Attrs, kind: RawItemKind) { 402 fn push_item(&mut self, current_module: Option<Module>, attrs: Arc<[Attr]>, kind: RawItemKind) {
400 match current_module { 403 match current_module {
401 Some(module) => match &mut self.raw_items.modules[module] { 404 Some(module) => match &mut self.raw_items.modules[module] {
402 ModuleData::Definition { items, .. } => items, 405 ModuleData::Definition { items, .. } => items,
@@ -407,11 +410,9 @@ impl<DB: AstDatabase> RawItemsCollector<&DB> {
407 .push(RawItem { attrs, kind }) 410 .push(RawItem { attrs, kind })
408 } 411 }
409 412
410 fn parse_attrs(&self, item: &impl ast::AttrsOwner) -> Attrs { 413 fn parse_attrs(&self, item: &impl ast::AttrsOwner) -> Arc<[Attr]> {
411 item.attrs() 414 item.attrs()
412 .flat_map(|attr| attr.value()) 415 .flat_map(|ast| Attr::from_src(Source { ast, file_id: self.file_id }, self.db))
413 .flat_map(|tt| ast_to_token_tree(&tt))
414 .map(|(tt, _)| tt)
415 .collect() 416 .collect()
416 } 417 }
417} 418}