diff options
Diffstat (limited to 'crates/ra_hir/src/code_model')
-rw-r--r-- | crates/ra_hir/src/code_model/src.rs | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/crates/ra_hir/src/code_model/src.rs b/crates/ra_hir/src/code_model/src.rs index 32bd9c661..e5bae16ab 100644 --- a/crates/ra_hir/src/code_model/src.rs +++ b/crates/ra_hir/src/code_model/src.rs | |||
@@ -1,9 +1,9 @@ | |||
1 | use ra_syntax::ast; | 1 | use ra_syntax::ast::{self, AstNode}; |
2 | 2 | ||
3 | use crate::{ | 3 | use crate::{ |
4 | ids::AstItemDef, AstDatabase, Const, DefDatabase, Enum, EnumVariant, FieldSource, Function, | 4 | ids::AstItemDef, AstDatabase, Const, DefDatabase, Enum, EnumVariant, FieldSource, Function, |
5 | HirFileId, MacroDef, Module, ModuleSource, Static, Struct, StructField, Trait, TypeAlias, | 5 | HasBody, HirDatabase, HirFileId, MacroDef, Module, ModuleSource, Static, Struct, StructField, |
6 | Union, | 6 | Trait, TypeAlias, Union, |
7 | }; | 7 | }; |
8 | 8 | ||
9 | pub struct Source<T> { | 9 | pub struct Source<T> { |
@@ -108,3 +108,27 @@ impl HasSource for MacroDef { | |||
108 | Source { file_id: self.id.0.file_id(), ast: self.id.0.to_node(db) } | 108 | Source { file_id: self.id.0.file_id(), ast: self.id.0.to_node(db) } |
109 | } | 109 | } |
110 | } | 110 | } |
111 | |||
112 | pub trait HasBodySource: HasBody + HasSource | ||
113 | where | ||
114 | Self::Ast: AstNode, | ||
115 | { | ||
116 | fn expr_source( | ||
117 | self, | ||
118 | db: &impl HirDatabase, | ||
119 | expr_id: crate::expr::ExprId, | ||
120 | ) -> Option<Source<ast::Expr>> { | ||
121 | let source_map = self.body_source_map(db); | ||
122 | let expr_syntax = source_map.expr_syntax(expr_id)?; | ||
123 | let source = self.source(db); | ||
124 | let node = expr_syntax.to_node(&source.ast.syntax()); | ||
125 | ast::Expr::cast(node).map(|ast| Source { file_id: source.file_id, ast }) | ||
126 | } | ||
127 | } | ||
128 | |||
129 | impl<T> HasBodySource for T | ||
130 | where | ||
131 | T: HasBody + HasSource, | ||
132 | T::Ast: AstNode, | ||
133 | { | ||
134 | } | ||