@@ -4,7 +4,7 @@ use std::collections::hash_map::Entry;
44
55use hir_expand:: { mod_path:: path, name, name:: AsName , span_map:: SpanMapRef , HirFileId } ;
66use la_arena:: Arena ;
7- use span:: AstIdMap ;
7+ use span:: { AstIdMap , SyntaxContextId } ;
88use syntax:: {
99 ast:: { self , HasModuleItem , HasName , HasTypeBounds , IsString } ,
1010 AstNode ,
@@ -45,7 +45,7 @@ impl<'a> Ctx<'a> {
4545 db,
4646 tree : ItemTree :: default ( ) ,
4747 source_ast_id_map : db. ast_id_map ( file) ,
48- body_ctx : crate :: lower:: LowerCtx :: with_file_id ( db, file) ,
48+ body_ctx : crate :: lower:: LowerCtx :: new ( db, file) ,
4949 }
5050 }
5151
@@ -535,7 +535,9 @@ impl<'a> Ctx<'a> {
535535 fn lower_use ( & mut self , use_item : & ast:: Use ) -> Option < FileItemTreeId < Use > > {
536536 let visibility = self . lower_visibility ( use_item) ;
537537 let ast_id = self . source_ast_id_map . ast_id ( use_item) ;
538- let ( use_tree, _) = lower_use_tree ( self . db , self . span_map ( ) , use_item. use_tree ( ) ?) ?;
538+ let ( use_tree, _) = lower_use_tree ( self . db , use_item. use_tree ( ) ?, & mut |range| {
539+ self . span_map ( ) . span_for_range ( range) . ctx
540+ } ) ?;
539541
540542 let res = Use { visibility, ast_id, use_tree } ;
541543 Some ( id ( self . data ( ) . uses . alloc ( res) ) )
@@ -558,7 +560,9 @@ impl<'a> Ctx<'a> {
558560
559561 fn lower_macro_call ( & mut self , m : & ast:: MacroCall ) -> Option < FileItemTreeId < MacroCall > > {
560562 let span_map = self . span_map ( ) ;
561- let path = Interned :: new ( ModPath :: from_src ( self . db . upcast ( ) , m. path ( ) ?, span_map) ?) ;
563+ let path = Interned :: new ( ModPath :: from_src ( self . db . upcast ( ) , m. path ( ) ?, & mut |range| {
564+ span_map. span_for_range ( range) . ctx
565+ } ) ?) ;
562566 let ast_id = self . source_ast_id_map . ast_id ( m) ;
563567 let expand_to = hir_expand:: ExpandTo :: from_call_site ( m) ;
564568 let res = MacroCall {
@@ -672,8 +676,9 @@ impl<'a> Ctx<'a> {
672676 }
673677
674678 fn lower_visibility ( & mut self , item : & dyn ast:: HasVisibility ) -> RawVisibilityId {
675- let vis =
676- RawVisibility :: from_opt_ast_with_span_map ( self . db , item. visibility ( ) , self . span_map ( ) ) ;
679+ let vis = RawVisibility :: from_ast ( self . db , item. visibility ( ) , & mut |range| {
680+ self . span_map ( ) . span_for_range ( range) . ctx
681+ } ) ;
677682 self . data ( ) . vis . alloc ( vis)
678683 }
679684
@@ -745,28 +750,33 @@ fn lower_abi(abi: ast::Abi) -> Interned<str> {
745750
746751struct UseTreeLowering < ' a > {
747752 db : & ' a dyn DefDatabase ,
748- span_map : SpanMapRef < ' a > ,
749753 mapping : Arena < ast:: UseTree > ,
750754}
751755
752756impl UseTreeLowering < ' _ > {
753- fn lower_use_tree ( & mut self , tree : ast:: UseTree ) -> Option < UseTree > {
757+ fn lower_use_tree (
758+ & mut self ,
759+ tree : ast:: UseTree ,
760+ span_for_range : & mut dyn FnMut ( :: tt:: TextRange ) -> SyntaxContextId ,
761+ ) -> Option < UseTree > {
754762 if let Some ( use_tree_list) = tree. use_tree_list ( ) {
755763 let prefix = match tree. path ( ) {
756764 // E.g. use something::{{{inner}}};
757765 None => None ,
758766 // E.g. `use something::{inner}` (prefix is `None`, path is `something`)
759767 // or `use something::{path::{inner::{innerer}}}` (prefix is `something::path`, path is `inner`)
760768 Some ( path) => {
761- match ModPath :: from_src ( self . db . upcast ( ) , path, self . span_map ) {
769+ match ModPath :: from_src ( self . db . upcast ( ) , path, span_for_range ) {
762770 Some ( it) => Some ( it) ,
763771 None => return None , // FIXME: report errors somewhere
764772 }
765773 }
766774 } ;
767775
768- let list =
769- use_tree_list. use_trees ( ) . filter_map ( |tree| self . lower_use_tree ( tree) ) . collect ( ) ;
776+ let list = use_tree_list
777+ . use_trees ( )
778+ . filter_map ( |tree| self . lower_use_tree ( tree, span_for_range) )
779+ . collect ( ) ;
770780
771781 Some (
772782 self . use_tree (
@@ -777,7 +787,7 @@ impl UseTreeLowering<'_> {
777787 } else {
778788 let is_glob = tree. star_token ( ) . is_some ( ) ;
779789 let path = match tree. path ( ) {
780- Some ( path) => Some ( ModPath :: from_src ( self . db . upcast ( ) , path, self . span_map ) ?) ,
790+ Some ( path) => Some ( ModPath :: from_src ( self . db . upcast ( ) , path, span_for_range ) ?) ,
781791 None => None ,
782792 } ;
783793 let alias = tree. rename ( ) . map ( |a| {
@@ -813,10 +823,10 @@ impl UseTreeLowering<'_> {
813823
814824pub ( crate ) fn lower_use_tree (
815825 db : & dyn DefDatabase ,
816- span_map : SpanMapRef < ' _ > ,
817826 tree : ast:: UseTree ,
827+ span_for_range : & mut dyn FnMut ( :: tt:: TextRange ) -> SyntaxContextId ,
818828) -> Option < ( UseTree , Arena < ast:: UseTree > ) > {
819- let mut lowering = UseTreeLowering { db, span_map , mapping : Arena :: new ( ) } ;
820- let tree = lowering. lower_use_tree ( tree) ?;
829+ let mut lowering = UseTreeLowering { db, mapping : Arena :: new ( ) } ;
830+ let tree = lowering. lower_use_tree ( tree, span_for_range ) ?;
821831 Some ( ( tree, lowering. mapping ) )
822832}
0 commit comments