]> git.lizzy.rs Git - rust.git/commitdiff
Added defWithBody
authorLenard Pratt <l3np27@gmail.com>
Sat, 30 Mar 2019 10:50:00 +0000 (10:50 +0000)
committerLenard Pratt <l3np27@gmail.com>
Sat, 30 Mar 2019 10:50:00 +0000 (10:50 +0000)
crates/ra_hir/src/code_model_api.rs
crates/ra_hir/src/db.rs
crates/ra_hir/src/expr.rs
crates/ra_hir/src/expr/scope.rs
crates/ra_hir/src/lib.rs
crates/ra_syntax/src/ast/generated.rs
crates/ra_syntax/src/grammar.ron

index 624c25c4d6f3cbafbff772e49c0a8d49438abcfa..db6e67d7fbee48d89ba68b86db392f6eee416529 100644 (file)
@@ -433,6 +433,78 @@ fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
     }
 }
 
+/// The defs which have a body.
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub enum DefWithBody {
+    Func(Function),
+    Const(Const),
+    Static(Static),
+}
+
+impl DefWithBody {
+    pub fn get_funct(&self) -> &Function {
+        match *self {
+            DefWithBody::Func(ref f) => f,
+            _ => unreachable!()
+        }
+    }
+
+    pub fn const_source(&self, db: &impl DefDatabase) -> (HirFileId, TreeArc<ast::ConstDef>) {
+       match *self {
+           DefWithBody::Const(ref c) => c.source(db),
+           _ => unreachable!()
+       }
+    }
+
+    pub fn func_source(&self, db: &impl DefDatabase) -> (HirFileId, TreeArc<ast::FnDef>) {
+       match *self {
+           DefWithBody::Func(ref f) => f.source(db),
+           _ => unreachable!()
+       }
+    }
+
+    pub fn static_source(&self, db: &impl DefDatabase) -> (HirFileId, TreeArc<ast::StaticDef>) {
+       match *self {
+           DefWithBody::Static(ref s) => s.source(db),
+           _ => unreachable!()
+       }
+    }
+
+    pub fn infer(&self, db: &impl HirDatabase) -> Arc<InferenceResult> {
+        db.infer(*self)
+    }
+
+    pub fn body(&self, db: &impl HirDatabase) -> Arc<Body> {
+        db.body_hir(*self)
+    }
+    
+    /// Builds a resolver for code inside this item.
+    pub fn resolver(&self, db: &impl HirDatabase) -> Resolver {
+        // // take the outer scope...
+        // let r = self
+        //     .impl_block(db)
+        //     .map(|ib| ib.resolver(db))
+        //     .unwrap_or_else(|| self.module(db).resolver(db));
+        // // ...and add generic params, if present
+        // let p = self.generic_params(db);
+        // let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
+        // r
+        unimplemented!()
+    }
+
+    pub fn signature(&self, db: &impl HirDatabase) -> Arc<FnSignature> {
+        // db.fn_signature(*self)
+        unimplemented!()
+    }
+
+    pub fn scopes(&self, db: &impl HirDatabase) -> ScopesWithSourceMap {
+        let scopes = db.expr_scopes(*self);
+        let source_map = db.body_with_source_map(*self).1;
+        ScopesWithSourceMap { scopes, source_map }
+    }
+    
+}
+
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct Function {
     pub(crate) id: FunctionId,
@@ -483,11 +555,11 @@ pub fn name(&self, db: &impl HirDatabase) -> Name {
     }
 
     pub fn body_source_map(&self, db: &impl HirDatabase) -> Arc<BodySourceMap> {
-        db.body_with_source_map(*self).1
+        db.body_with_source_map(DefWithBody::Func(*self)).1
     }
 
     pub fn body(&self, db: &impl HirDatabase) -> Arc<Body> {
-        db.body_hir(*self)
+        db.body_hir(DefWithBody::Func(*self))
     }
 
     pub fn ty(&self, db: &impl HirDatabase) -> Ty {
@@ -495,8 +567,8 @@ pub fn ty(&self, db: &impl HirDatabase) -> Ty {
     }
 
     pub fn scopes(&self, db: &impl HirDatabase) -> ScopesWithSourceMap {
-        let scopes = db.expr_scopes(*self);
-        let source_map = db.body_with_source_map(*self).1;
+        let scopes = db.expr_scopes( DefWithBody::Func(*self));
+        let source_map = db.body_with_source_map(DefWithBody::Func(*self)).1;
         ScopesWithSourceMap { scopes, source_map }
     }
 
@@ -505,7 +577,7 @@ pub fn signature(&self, db: &impl HirDatabase) -> Arc<FnSignature> {
     }
 
     pub fn infer(&self, db: &impl HirDatabase) -> Arc<InferenceResult> {
-        db.infer(*self)
+        db.infer(DefWithBody::Func(*self))
     }
 
     pub fn generic_params(&self, db: &impl DefDatabase) -> Arc<GenericParams> {
@@ -716,4 +788,4 @@ impl Docs for TypeAlias {
     fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
         docs_from_ast(&*self.source(db).1)
     }
-}
+}
\ No newline at end of file
index 1470058480af8d950d6e139003fa93fb4ace5bd6..a2aff241ce78e1071162930ff319be3425feb3d0 100644 (file)
@@ -8,6 +8,7 @@
     Function, FnSignature, ExprScopes, TypeAlias,
     Struct, Enum, StructField,
     Const, ConstSignature, Static,
+    DefWithBody,
     nameres::{Namespace, ImportSourceMap, RawItems, CrateDefMap},
     ty::{InferenceResult, Ty, method_resolution::CrateImplBlocks, TypableDef, CallableDef, FnSig},
     adt::{StructData, EnumData},
@@ -83,10 +84,10 @@ fn impls_in_module_with_source_map(
 #[salsa::query_group(HirDatabaseStorage)]
 pub trait HirDatabase: DefDatabase {
     #[salsa::invoke(ExprScopes::expr_scopes_query)]
-    fn expr_scopes(&self, func: Function) -> Arc<ExprScopes>;
+    fn expr_scopes(&self, def: DefWithBody) -> Arc<ExprScopes>;
 
     #[salsa::invoke(crate::ty::infer)]
-    fn infer(&self, func: Function) -> Arc<InferenceResult>;
+    fn infer(&self, def:DefWithBody) -> Arc<InferenceResult>;
 
     #[salsa::invoke(crate::ty::type_for_def)]
     fn type_for_def(&self, def: TypableDef, ns: Namespace) -> Ty;
@@ -100,11 +101,11 @@ pub trait HirDatabase: DefDatabase {
     #[salsa::invoke(crate::expr::body_with_source_map_query)]
     fn body_with_source_map(
         &self,
-        func: Function,
+        def: DefWithBody,
     ) -> (Arc<crate::expr::Body>, Arc<crate::expr::BodySourceMap>);
 
     #[salsa::invoke(crate::expr::body_hir_query)]
-    fn body_hir(&self, func: Function) -> Arc<crate::expr::Body>;
+    fn body_hir(&self, def: DefWithBody) -> Arc<crate::expr::Body>;
 
     #[salsa::invoke(crate::ty::method_resolution::CrateImplBlocks::impls_in_crate_query)]
     fn impls_in_crate(&self, krate: Crate) -> Arc<CrateImplBlocks>;
index a85422955b991b39d535e65394931af2c89a3487..280746761fc478c7ac9e057092e00c011f2cd8d4 100644 (file)
@@ -10,7 +10,7 @@
 };
 
 use crate::{
-    Path, Name, HirDatabase, Function, Resolver,
+    Path, Name, HirDatabase, Function, Resolver,DefWithBody,
     name::AsName,
     type_ref::{Mutability, TypeRef},
 };
@@ -29,7 +29,7 @@
 pub struct Body {
     // FIXME: this should be more general, consts & statics also have bodies
     /// The Function of the item this body belongs to
-    owner: Function,
+    owner: DefWithBody,
     exprs: Arena<ExprId, Expr>,
     pats: Arena<PatId, Pat>,
     /// The patterns for the function's parameters. While the parameter types are
@@ -66,7 +66,7 @@ pub fn body_expr(&self) -> ExprId {
         self.body_expr
     }
 
-    pub fn owner(&self) -> Function {
+    pub fn owner(&self) -> DefWithBody {
         self.owner
     }
 
@@ -464,7 +464,7 @@ pub fn walk_child_pats(&self, mut f: impl FnMut(PatId)) {
 // Queries
 
 struct ExprCollector {
-    owner: Function,
+    owner: DefWithBody,
     exprs: Arena<ExprId, Expr>,
     pats: Arena<PatId, Pat>,
     source_map: BodySourceMap,
@@ -473,7 +473,7 @@ struct ExprCollector {
 }
 
 impl ExprCollector {
-    fn new(owner: Function) -> Self {
+    fn new(owner: DefWithBody) -> Self {
         ExprCollector {
             owner,
             exprs: Arena::default(),
@@ -503,6 +503,9 @@ fn empty_block(&mut self) -> ExprId {
         self.exprs.alloc(block)
     }
 
+
+    
+
     fn collect_expr(&mut self, expr: &ast::Expr) -> ExprId {
         let syntax_ptr = SyntaxNodePtr::new(expr.syntax());
         match expr.kind() {
@@ -871,6 +874,15 @@ fn collect_pat_opt(&mut self, pat: Option<&ast::Pat>) -> PatId {
         }
     }
 
+
+    fn collect_const_body(&mut self,node:&ast::ConstDef)  {
+        
+    }
+
+    fn collect_static_body(&mut self,node:&ast::StaticDef) {
+
+    }
+
     fn collect_fn_body(&mut self, node: &ast::FnDef) {
         if let Some(param_list) = node.param_list() {
             if let Some(self_param) = param_list.self_param() {
@@ -917,19 +929,25 @@ fn finish(self) -> (Body, BodySourceMap) {
 
 pub(crate) fn body_with_source_map_query(
     db: &impl HirDatabase,
-    func: Function,
+    def: DefWithBody,
 ) -> (Arc<Body>, Arc<BodySourceMap>) {
-    let mut collector = ExprCollector::new(func);
 
-    // FIXME: consts, etc.
-    collector.collect_fn_body(&func.source(db).1);
+    let mut collector = ExprCollector::new(def);
 
+    // FIXME: do can this be turned into a method
+    
+    match def {
+        DefWithBody::Const(ref c) => collector.collect_const_body(&def.const_source(db).1),
+        DefWithBody::Func(ref f) => collector.collect_fn_body(&def.func_source(db).1),
+        DefWithBody::Static(ref s) => collector.collect_static_body(&def.static_source(db).1)
+    }
+    
     let (body, source_map) = collector.finish();
     (Arc::new(body), Arc::new(source_map))
 }
 
-pub(crate) fn body_hir_query(db: &impl HirDatabase, func: Function) -> Arc<Body> {
-    db.body_with_source_map(func).0
+pub(crate) fn body_hir_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<Body> {
+    db.body_with_source_map(def).0   
 }
 
 #[cfg(test)]
index ed005c9f7006e48eb0ac9e64c17c8654f1c49d34..539da06c31573e19023dbccaadae1d21571d474f 100644 (file)
@@ -10,7 +10,7 @@
 use ra_arena::{Arena, RawId, impl_arena_id};
 
 use crate::{
-    Name, AsName, Function,
+    Name, AsName, Function,DefWithBody,
     expr::{PatId, ExprId, Pat, Expr, Body, Statement, BodySourceMap},
     HirDatabase,
 };
@@ -40,8 +40,8 @@ pub struct ScopeData {
 
 impl ExprScopes {
     // FIXME: This should take something more general than Function
-    pub(crate) fn expr_scopes_query(db: &impl HirDatabase, function: Function) -> Arc<ExprScopes> {
-        let body = db.body_hir(function);
+    pub(crate) fn expr_scopes_query(db: &impl HirDatabase, def: DefWithBody) -> Arc<ExprScopes> {
+        let body = db.body_hir(def);
         let res = ExprScopes::new(body);
         Arc::new(res)
     }
index 7c603bbd3e77a1ad70e14701ce7719fe8547c49e..62cec72d9df471b2b5b439bc40fd849ff02c2c65 100644 (file)
@@ -67,10 +67,12 @@ fn from(it: $v) -> $e {
 
 pub use self::code_model_api::{
     Crate, CrateDependency,
+    DefWithBody,
     Module, ModuleDef, ModuleSource,
     Struct, Enum, EnumVariant,
     Function, FnSignature,
     StructField, FieldSource,
     Static, Const, ConstSignature,
     Trait, TypeAlias,
+    
 };
index 47a37e4d19c7475baac8bc99790cb5e79f5fe1a7..31b4e73fb73d84ad88e69e8287ba66e2317fcb07 100644 (file)
@@ -657,6 +657,7 @@ fn to_owned(&self) -> TreeArc<ContinueExpr> { TreeArc::cast(self.syntax.to_owned
 }
 
 
+
 impl ContinueExpr {}
 
 // DynTraitType
index ad6d74162b94b6f871896d96955d8f306162c2d5..19e50c9b84c30d48b6b53350c737669ddfbeffba 100644 (file)
@@ -313,6 +313,7 @@ Grammar(
                 "DocCommentsOwner",
                 "TypeAscriptionOwner",
             ],
+            options: ["body","Block"],
         ),
         "StaticDef": (
             traits: [
@@ -323,6 +324,7 @@ Grammar(
                 "DocCommentsOwner",
                 "TypeAscriptionOwner",
             ],
+            options: ["body","Block"],
         ),
         "TypeAliasDef": (
             traits: [