@@ -6,7 +6,8 @@ use arrayvec::ArrayVec;
66use either:: Either ;
77use hir:: {
88 AssocItem , Crate , FieldSource , HasContainer , HasCrate , HasSource , HirDisplay , HirFileId ,
9- InFile , LocalSource , ModuleSource , Semantics , Symbol , db:: ExpandDatabase , symbols:: FileSymbol ,
9+ InFile , LocalSource , ModuleSource , Semantics , Symbol , db:: ExpandDatabase , sym,
10+ symbols:: FileSymbol ,
1011} ;
1112use ide_db:: {
1213 FileId , FileRange , RootDatabase , SymbolKind ,
@@ -16,12 +17,10 @@ use ide_db::{
1617 famous_defs:: FamousDefs ,
1718 ra_fixture:: UpmapFromRaFixture ,
1819} ;
19- use span:: Edition ;
2020use stdx:: never;
2121use syntax:: {
22- AstNode , SmolStr , SyntaxNode , TextRange , ToSmolStr ,
22+ AstNode , SyntaxNode , TextRange ,
2323 ast:: { self , HasName } ,
24- format_smolstr,
2524} ;
2625
2726/// `NavigationTarget` represents an element in the editor's UI which you can
@@ -48,16 +47,14 @@ pub struct NavigationTarget {
4847 ///
4948 /// This range must be contained within [`Self::full_range`].
5049 pub focus_range : Option < TextRange > ,
51- // FIXME: Symbol
52- pub name : SmolStr ,
50+ pub name : Symbol ,
5351 pub kind : Option < SymbolKind > ,
5452 pub container_name : Option < Symbol > ,
5553 pub description : Option < String > ,
5654 pub docs : Option < Documentation > ,
5755 /// In addition to a `name` field, a `NavigationTarget` may also be aliased
5856 /// In such cases we want a `NavigationTarget` to be accessible by its alias
59- // FIXME: Symbol
60- pub alias : Option < SmolStr > ,
57+ pub alias : Option < Symbol > ,
6158}
6259
6360impl fmt:: Debug for NavigationTarget {
@@ -148,9 +145,7 @@ impl NavigationTarget {
148145 db : & RootDatabase ,
149146 module : hir:: Module ,
150147 ) -> UpmappingResult < NavigationTarget > {
151- let edition = module. krate ( ) . edition ( db) ;
152- let name =
153- module. name ( db) . map ( |it| it. display_no_db ( edition) . to_smolstr ( ) ) . unwrap_or_default ( ) ;
148+ let name = module. name ( db) . map ( |it| it. symbol ( ) . clone ( ) ) . unwrap_or_else ( || sym:: underscore) ;
154149 match module. declaration_source ( db) {
155150 Some ( InFile { value, file_id } ) => {
156151 orig_range_with_focus ( db, file_id, value. syntax ( ) , value. name ( ) ) . map (
@@ -198,7 +193,8 @@ impl NavigationTarget {
198193 InFile { file_id, value } : InFile < & dyn ast:: HasName > ,
199194 kind : SymbolKind ,
200195 ) -> UpmappingResult < NavigationTarget > {
201- let name: SmolStr = value. name ( ) . map ( |it| it. text ( ) . into ( ) ) . unwrap_or_else ( || "_" . into ( ) ) ;
196+ let name =
197+ value. name ( ) . map ( |it| Symbol :: intern ( & it. text ( ) ) ) . unwrap_or_else ( || sym:: underscore) ;
202198
203199 orig_range_with_focus ( db, file_id, value. syntax ( ) , value. name ( ) ) . map (
204200 |( FileRange { file_id, range : full_range } , focus_range) | {
@@ -209,7 +205,7 @@ impl NavigationTarget {
209205
210206 pub ( crate ) fn from_syntax (
211207 file_id : FileId ,
212- name : SmolStr ,
208+ name : Symbol ,
213209 focus_range : Option < TextRange > ,
214210 full_range : TextRange ,
215211 kind : SymbolKind ,
@@ -234,8 +230,6 @@ impl TryToNav for FileSymbol {
234230 sema : & Semantics < ' _ , RootDatabase > ,
235231 ) -> Option < UpmappingResult < NavigationTarget > > {
236232 let db = sema. db ;
237- let edition =
238- self . def . module ( db) . map ( |it| it. krate ( ) . edition ( db) ) . unwrap_or ( Edition :: CURRENT ) ;
239233 let display_target = self . def . krate ( db) . to_display_target ( db) ;
240234 Some (
241235 orig_range_with_focus_r (
@@ -247,11 +241,12 @@ impl TryToNav for FileSymbol {
247241 . map ( |( FileRange { file_id, range : full_range } , focus_range) | {
248242 NavigationTarget {
249243 file_id,
250- name : self . is_alias . then ( || self . def . name ( db) ) . flatten ( ) . map_or_else (
251- || self . name . as_str ( ) . into ( ) ,
252- |it| it. display_no_db ( edition) . to_smolstr ( ) ,
253- ) ,
254- alias : self . is_alias . then ( || self . name . as_str ( ) . into ( ) ) ,
244+ name : self
245+ . is_alias
246+ . then ( || self . def . name ( db) )
247+ . flatten ( )
248+ . map_or_else ( || self . name . clone ( ) , |it| it. symbol ( ) . clone ( ) ) ,
249+ alias : self . is_alias . then ( || self . name . clone ( ) ) ,
255250 kind : Some ( self . def . into ( ) ) ,
256251 full_range,
257252 focus_range,
@@ -354,48 +349,44 @@ pub(crate) trait ToNavFromAst: Sized {
354349 }
355350}
356351
357- fn container_name ( db : & RootDatabase , t : impl HasContainer , edition : Edition ) -> Option < Symbol > {
352+ fn container_name ( db : & RootDatabase , t : impl HasContainer ) -> Option < Symbol > {
358353 match t. container ( db) {
359- hir:: ItemContainer :: Trait ( it) => Some ( it. name ( db) . display_no_db ( edition ) . to_smolstr ( ) ) ,
354+ hir:: ItemContainer :: Trait ( it) => Some ( it. name ( db) . symbol ( ) . clone ( ) ) ,
360355 // FIXME: Handle owners of blocks correctly here
361- hir:: ItemContainer :: Module ( it) => {
362- it. name ( db) . map ( |name| name. display_no_db ( edition) . to_smolstr ( ) )
363- }
356+ hir:: ItemContainer :: Module ( it) => it. name ( db) . map ( |name| name. symbol ( ) . clone ( ) ) ,
364357 _ => None ,
365358 }
366- . as_deref ( )
367- . map ( Symbol :: intern)
368359}
369360
370361impl ToNavFromAst for hir:: Function {
371362 const KIND : SymbolKind = SymbolKind :: Function ;
372363 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
373- container_name ( db, self , self . krate ( db ) . edition ( db ) )
364+ container_name ( db, self )
374365 }
375366}
376367
377368impl ToNavFromAst for hir:: Const {
378369 const KIND : SymbolKind = SymbolKind :: Const ;
379370 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
380- container_name ( db, self , self . krate ( db ) . edition ( db ) )
371+ container_name ( db, self )
381372 }
382373}
383374impl ToNavFromAst for hir:: Static {
384375 const KIND : SymbolKind = SymbolKind :: Static ;
385376 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
386- container_name ( db, self , self . krate ( db ) . edition ( db ) )
377+ container_name ( db, self )
387378 }
388379}
389380impl ToNavFromAst for hir:: Struct {
390381 const KIND : SymbolKind = SymbolKind :: Struct ;
391382 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
392- container_name ( db, self , self . krate ( db ) . edition ( db ) )
383+ container_name ( db, self )
393384 }
394385}
395386impl ToNavFromAst for hir:: Enum {
396387 const KIND : SymbolKind = SymbolKind :: Enum ;
397388 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
398- container_name ( db, self , self . krate ( db ) . edition ( db ) )
389+ container_name ( db, self )
399390 }
400391}
401392impl ToNavFromAst for hir:: Variant {
@@ -404,19 +395,19 @@ impl ToNavFromAst for hir::Variant {
404395impl ToNavFromAst for hir:: Union {
405396 const KIND : SymbolKind = SymbolKind :: Union ;
406397 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
407- container_name ( db, self , self . krate ( db ) . edition ( db ) )
398+ container_name ( db, self )
408399 }
409400}
410401impl ToNavFromAst for hir:: TypeAlias {
411402 const KIND : SymbolKind = SymbolKind :: TypeAlias ;
412403 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
413- container_name ( db, self , self . krate ( db ) . edition ( db ) )
404+ container_name ( db, self )
414405 }
415406}
416407impl ToNavFromAst for hir:: Trait {
417408 const KIND : SymbolKind = SymbolKind :: Trait ;
418409 fn container_name ( self , db : & RootDatabase ) -> Option < Symbol > {
419- container_name ( db, self , self . krate ( db ) . edition ( db ) )
410+ container_name ( db, self )
420411 }
421412}
422413
@@ -452,10 +443,8 @@ where
452443impl ToNav for hir:: Module {
453444 fn to_nav ( & self , db : & RootDatabase ) -> UpmappingResult < NavigationTarget > {
454445 let InFile { file_id, value } = self . definition_source ( db) ;
455- let edition = self . krate ( db) . edition ( db) ;
456446
457- let name =
458- self . name ( db) . map ( |it| it. display_no_db ( edition) . to_smolstr ( ) ) . unwrap_or_default ( ) ;
447+ let name = self . name ( db) . map ( |it| it. symbol ( ) . clone ( ) ) . unwrap_or_else ( || sym:: underscore) ;
459448 let ( syntax, focus) = match & value {
460449 ModuleSource :: SourceFile ( node) => ( node. syntax ( ) , None ) ,
461450 ModuleSource :: Module ( node) => ( node. syntax ( ) , node. name ( ) ) ,
@@ -500,7 +489,7 @@ impl TryToNav for hir::Impl {
500489 |( FileRange { file_id, range : full_range } , focus_range) | {
501490 NavigationTarget :: from_syntax (
502491 file_id,
503- "impl" . into ( ) ,
492+ sym :: kw_impl ,
504493 focus_range,
505494 full_range,
506495 SymbolKind :: Impl ,
@@ -522,24 +511,20 @@ impl TryToNav for hir::ExternCrateDecl {
522511 . rename ( )
523512 . map_or_else ( || value. name_ref ( ) . map ( Either :: Left ) , |it| it. name ( ) . map ( Either :: Right ) ) ;
524513 let krate = self . module ( db) . krate ( ) ;
525- let edition = krate. edition ( db) ;
526514
527515 Some ( orig_range_with_focus ( db, file_id, value. syntax ( ) , focus) . map (
528516 |( FileRange { file_id, range : full_range } , focus_range) | {
529517 let mut res = NavigationTarget :: from_syntax (
530518 file_id,
531- self . alias_or_name ( db)
532- . unwrap_or_else ( || self . name ( db) )
533- . display_no_db ( edition)
534- . to_smolstr ( ) ,
519+ self . alias_or_name ( db) . unwrap_or_else ( || self . name ( db) ) . symbol ( ) . clone ( ) ,
535520 focus_range,
536521 full_range,
537522 SymbolKind :: Module ,
538523 ) ;
539524
540525 res. docs = self . docs ( db) ;
541526 res. description = Some ( self . display ( db, krate. to_display_target ( db) ) . to_string ( ) ) ;
542- res. container_name = container_name ( db, * self , edition ) ;
527+ res. container_name = container_name ( db, * self ) ;
543528 res
544529 } ,
545530 ) )
@@ -571,7 +556,7 @@ impl TryToNav for hir::Field {
571556 |( FileRange { file_id, range : full_range } , focus_range) | {
572557 NavigationTarget :: from_syntax (
573558 file_id,
574- format_smolstr ! ( "{}" , self . index( ) ) ,
559+ Symbol :: integer ( self . index ( ) ) ,
575560 focus_range,
576561 full_range,
577562 SymbolKind :: Field ,
@@ -656,11 +641,10 @@ impl ToNav for LocalSource {
656641 Either :: Left ( bind_pat) => ( bind_pat. syntax ( ) , bind_pat. name ( ) ) ,
657642 Either :: Right ( it) => ( it. syntax ( ) , it. name ( ) ) ,
658643 } ;
659- let edition = self . local . parent ( db) . module ( db) . krate ( ) . edition ( db) ;
660644
661645 orig_range_with_focus ( db, file_id, node, name) . map (
662646 |( FileRange { file_id, range : full_range } , focus_range) | {
663- let name = local. name ( db) . display_no_db ( edition ) . to_smolstr ( ) ;
647+ let name = local. name ( db) . symbol ( ) . clone ( ) ;
664648 let kind = if local. is_self ( db) {
665649 SymbolKind :: SelfParam
666650 } else if local. is_param ( db) {
@@ -697,8 +681,7 @@ impl TryToNav for hir::Label {
697681 ) -> Option < UpmappingResult < NavigationTarget > > {
698682 let db = sema. db ;
699683 let InFile { file_id, value } = self . source ( db) ?;
700- // Labels can't be keywords, so no escaping needed.
701- let name = self . name ( db) . display_no_db ( Edition :: Edition2015 ) . to_smolstr ( ) ;
684+ let name = self . name ( db) . symbol ( ) . clone ( ) ;
702685
703686 Some ( orig_range_with_focus ( db, file_id, value. syntax ( ) , value. lifetime ( ) ) . map (
704687 |( FileRange { file_id, range : full_range } , focus_range) | NavigationTarget {
@@ -723,8 +706,7 @@ impl TryToNav for hir::TypeParam {
723706 ) -> Option < UpmappingResult < NavigationTarget > > {
724707 let db = sema. db ;
725708 let InFile { file_id, value } = self . merge ( ) . source ( db) ?;
726- let edition = self . module ( db) . krate ( ) . edition ( db) ;
727- let name = self . name ( db) . display_no_db ( edition) . to_smolstr ( ) ;
709+ let name = self . name ( db) . symbol ( ) . clone ( ) ;
728710
729711 let value = match value {
730712 Either :: Left ( ast:: TypeOrConstParam :: Type ( x) ) => Either :: Left ( x) ,
@@ -773,8 +755,7 @@ impl TryToNav for hir::LifetimeParam {
773755 ) -> Option < UpmappingResult < NavigationTarget > > {
774756 let db = sema. db ;
775757 let InFile { file_id, value } = self . source ( db) ?;
776- // Lifetimes cannot be keywords, so not escaping needed.
777- let name = self . name ( db) . display_no_db ( Edition :: Edition2015 ) . to_smolstr ( ) ;
758+ let name = self . name ( db) . symbol ( ) . clone ( ) ;
778759
779760 Some ( orig_range ( db, file_id, value. syntax ( ) ) . map (
780761 |( FileRange { file_id, range : full_range } , focus_range) | NavigationTarget {
@@ -799,8 +780,7 @@ impl TryToNav for hir::ConstParam {
799780 ) -> Option < UpmappingResult < NavigationTarget > > {
800781 let db = sema. db ;
801782 let InFile { file_id, value } = self . merge ( ) . source ( db) ?;
802- let edition = self . module ( db) . krate ( ) . edition ( db) ;
803- let name = self . name ( db) . display_no_db ( edition) . to_smolstr ( ) ;
783+ let name = self . name ( db) . symbol ( ) . clone ( ) ;
804784
805785 let value = match value {
806786 Either :: Left ( ast:: TypeOrConstParam :: Const ( x) ) => x,
@@ -835,21 +815,17 @@ impl TryToNav for hir::InlineAsmOperand {
835815 let InFile { file_id, value } = & self . source ( db) ?;
836816 let file_id = * file_id;
837817 Some ( orig_range_with_focus ( db, file_id, value. syntax ( ) , value. name ( ) ) . map (
838- |( FileRange { file_id, range : full_range } , focus_range) | {
839- let edition = self . parent ( db) . module ( db) . krate ( ) . edition ( db) ;
840- NavigationTarget {
841- file_id,
842- name : self
843- . name ( db)
844- . map_or_else ( || "_" . into ( ) , |it| it. display ( db, edition) . to_smolstr ( ) ) ,
845- alias : None ,
846- kind : Some ( SymbolKind :: Local ) ,
847- full_range,
848- focus_range,
849- container_name : None ,
850- description : None ,
851- docs : None ,
852- }
818+ |( FileRange { file_id, range : full_range } , focus_range) | NavigationTarget {
819+ file_id,
820+ name :
821+ self . name ( db) . map_or_else ( || sym:: underscore. clone ( ) , |it| it. symbol ( ) . clone ( ) ) ,
822+ alias : None ,
823+ kind : Some ( SymbolKind :: Local ) ,
824+ full_range,
825+ focus_range,
826+ container_name : None ,
827+ description : None ,
828+ docs : None ,
853829 } ,
854830 ) )
855831 }
0 commit comments