From 8ae5d6faf6006e873695bef6fd05cba69e027f63 Mon Sep 17 00:00:00 2001 From: Piotr Szpetkowski Date: Fri, 22 Nov 2019 07:56:50 +0100 Subject: [PATCH 1/2] Add support for Stringify builtin macro --- crates/ra_hir_expand/src/builtin_macro.rs | 27 +++++++++++++++++++++++ crates/ra_hir_expand/src/name.rs | 1 + 2 files changed, 28 insertions(+) diff --git a/crates/ra_hir_expand/src/builtin_macro.rs b/crates/ra_hir_expand/src/builtin_macro.rs index 97fb0cb552..9628666d46 100644 --- a/crates/ra_hir_expand/src/builtin_macro.rs +++ b/crates/ra_hir_expand/src/builtin_macro.rs @@ -11,6 +11,7 @@ use crate::quote; #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub enum BuiltinExpander { Line, + Stringify, } impl BuiltinExpander { @@ -22,6 +23,7 @@ impl BuiltinExpander { ) -> Result { match self { BuiltinExpander::Line => line_expand(db, id, tt), + BuiltinExpander::Stringify => stringify_expand(db, id, tt), } } } @@ -34,6 +36,8 @@ pub fn find_builtin_macro( // FIXME: Better registering method if ident == &name::LINE_MACRO { Some(MacroDefId { krate, ast_id, kind: MacroDefKind::BuiltIn(BuiltinExpander::Line) }) + } else if ident == &name::STRINGIFY_MACRO { + Some(MacroDefId { krate, ast_id, kind: MacroDefKind::BuiltIn(BuiltinExpander::Stringify) }) } else { None } @@ -78,3 +82,26 @@ fn line_expand( Ok(expanded) } + +fn stringify_expand( + db: &dyn AstDatabase, + id: MacroCallId, + _tt: &tt::Subtree, +) -> Result { + let loc = db.lookup_intern_macro(id); + let macro_call = loc.ast_id.to_node(db); + + let macro_content = { + let arg = macro_call.token_tree().ok_or_else(|| mbe::ExpandError::UnexpectedToken)?; + let macro_args = arg.syntax().clone(); + let text = macro_args.text(); + let without_parens = TextUnit::of_char('(')..text.len() - TextUnit::of_char(')'); + text.slice(without_parens).to_string() + }; + + let expanded = quote! { + #macro_content + }; + + Ok(expanded) +} diff --git a/crates/ra_hir_expand/src/name.rs b/crates/ra_hir_expand/src/name.rs index 1bf17d12b5..c3f7e77a5a 100644 --- a/crates/ra_hir_expand/src/name.rs +++ b/crates/ra_hir_expand/src/name.rs @@ -143,3 +143,4 @@ pub const BOX_TYPE: Name = Name::new_inline_ascii(3, b"Box"); // Builtin Macros pub const LINE_MACRO: Name = Name::new_inline_ascii(4, b"line"); +pub const STRINGIFY_MACRO: Name = Name::new_inline_ascii(9, b"stringify"); From 4fc900deb121539a5311059e1ebb83ef73b190df Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 22 Nov 2019 12:57:40 +0300 Subject: [PATCH 2/2] Move TypeAlias to hir_def --- crates/ra_hir/src/code_model.rs | 4 ++-- crates/ra_hir/src/db.rs | 8 ++------ crates/ra_hir/src/lib.rs | 1 - crates/ra_hir_def/src/db.rs | 6 +++++- crates/ra_hir_def/src/lib.rs | 1 + crates/{ra_hir => ra_hir_def}/src/type_alias.rs | 16 ++++++---------- 6 files changed, 16 insertions(+), 20 deletions(-) rename crates/{ra_hir => ra_hir_def}/src/type_alias.rs (63%) diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs index 5690040a75..72c9b466f7 100644 --- a/crates/ra_hir/src/code_model.rs +++ b/crates/ra_hir/src/code_model.rs @@ -937,7 +937,7 @@ impl TypeAlias { } pub fn type_ref(self, db: &impl DefDatabase) -> Option { - db.type_alias_data(self).type_ref.clone() + db.type_alias_data(self.id).type_ref.clone() } pub fn ty(self, db: &impl HirDatabase) -> Ty { @@ -945,7 +945,7 @@ impl TypeAlias { } pub fn name(self, db: &impl DefDatabase) -> Name { - db.type_alias_data(self).name.clone() + db.type_alias_data(self.id).name.clone() } } diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs index ed0d680011..6898743317 100644 --- a/crates/ra_hir/src/db.rs +++ b/crates/ra_hir/src/db.rs @@ -16,16 +16,15 @@ use crate::{ CallableDef, FnSig, GenericPredicate, InferenceResult, Namespace, Substs, Ty, TypableDef, TypeCtor, }, - type_alias::TypeAliasData, Const, ConstData, Crate, DefWithBody, FnData, Function, GenericDef, ImplBlock, Module, Static, - StructField, Trait, TypeAlias, + StructField, Trait, }; pub use hir_def::db::{ BodyQuery, BodyWithSourceMapQuery, CrateDefMapQuery, DefDatabase2, DefDatabase2Storage, EnumDataQuery, ExprScopesQuery, GenericParamsQuery, ImplDataQuery, InternDatabase, InternDatabaseStorage, RawItemsQuery, RawItemsWithSourceMapQuery, StructDataQuery, - TraitDataQuery, + TraitDataQuery, TypeAliasDataQuery, }; pub use hir_expand::db::{ AstDatabase, AstDatabaseStorage, AstIdMapQuery, MacroArgQuery, MacroDefQuery, MacroExpandQuery, @@ -39,9 +38,6 @@ pub trait DefDatabase: HirDebugDatabase + DefDatabase2 { #[salsa::invoke(FnData::fn_data_query)] fn fn_data(&self, func: Function) -> Arc; - #[salsa::invoke(TypeAliasData::type_alias_data_query)] - fn type_alias_data(&self, typ: TypeAlias) -> Arc; - #[salsa::invoke(ConstData::const_data_query)] fn const_data(&self, konst: Const) -> Arc; diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 8c6834392d..8e532c36c6 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -32,7 +32,6 @@ pub mod db; pub mod source_binder; mod ids; -mod type_alias; mod ty; mod impl_block; mod expr; diff --git a/crates/ra_hir_def/src/db.rs b/crates/ra_hir_def/src/db.rs index 844f8bbe88..5bbdaa4b20 100644 --- a/crates/ra_hir_def/src/db.rs +++ b/crates/ra_hir_def/src/db.rs @@ -15,7 +15,8 @@ use crate::{ CrateDefMap, }, traits::TraitData, - DefWithBodyId, EnumId, GenericDefId, ImplId, ItemLoc, StructOrUnionId, TraitId, + type_alias::TypeAliasData, + DefWithBodyId, EnumId, GenericDefId, ImplId, ItemLoc, StructOrUnionId, TraitId, TypeAliasId, }; #[salsa::query_group(InternDatabaseStorage)] @@ -64,6 +65,9 @@ pub trait DefDatabase2: InternDatabase + AstDatabase { #[salsa::invoke(TraitData::trait_data_query)] fn trait_data(&self, e: TraitId) -> Arc; + #[salsa::invoke(TypeAliasData::type_alias_data_query)] + fn type_alias_data(&self, e: TypeAliasId) -> Arc; + #[salsa::invoke(Body::body_with_source_map_query)] fn body_with_source_map(&self, def: DefWithBodyId) -> (Arc, Arc); diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index d579f5c7ea..2681444629 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs @@ -20,6 +20,7 @@ pub mod body; pub mod generics; pub mod traits; pub mod resolver; +pub mod type_alias; #[cfg(test)] mod test_db; diff --git a/crates/ra_hir/src/type_alias.rs b/crates/ra_hir_def/src/type_alias.rs similarity index 63% rename from crates/ra_hir/src/type_alias.rs rename to crates/ra_hir_def/src/type_alias.rs index 392f244cf1..c0b49aa7cc 100644 --- a/crates/ra_hir/src/type_alias.rs +++ b/crates/ra_hir_def/src/type_alias.rs @@ -2,28 +2,24 @@ use std::sync::Arc; -use hir_def::type_ref::TypeRef; use hir_expand::name::{AsName, Name}; use ra_syntax::ast::NameOwner; -use crate::{ - db::{AstDatabase, DefDatabase}, - HasSource, TypeAlias, -}; +use crate::{db::DefDatabase2, type_ref::TypeRef, HasSource, Lookup, TypeAliasId}; #[derive(Debug, Clone, PartialEq, Eq)] pub struct TypeAliasData { - pub(crate) name: Name, - pub(crate) type_ref: Option, + pub name: Name, + pub type_ref: Option, } impl TypeAliasData { pub(crate) fn type_alias_data_query( - db: &(impl DefDatabase + AstDatabase), - typ: TypeAlias, + db: &impl DefDatabase2, + typ: TypeAliasId, ) -> Arc { - let node = typ.source(db).value; + let node = typ.lookup(db).source(db).value; let name = node.name().map_or_else(Name::missing, |n| n.as_name()); let type_ref = node.type_ref().map(TypeRef::from_ast); Arc::new(TypeAliasData { name, type_ref })