Skip to content

Commit abf2e3e

Browse files
committed
Replace more smol strings with symbols
1 parent 6ba7d24 commit abf2e3e

File tree

5 files changed

+68
-86
lines changed

5 files changed

+68
-86
lines changed

crates/ide/src/goto_definition.rs

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ fn try_lookup_include_path(
245245
Some(NavigationTarget {
246246
file_id,
247247
full_range: TextRange::new(0.into(), size),
248-
name: path.into(),
248+
name: hir::Symbol::intern(&path),
249249
alias: None,
250250
focus_range: None,
251251
kind: None,
@@ -598,7 +598,13 @@ fn expr_to_nav(
598598
let value_range = value.syntax().text_range();
599599
let navs = navigation_target::orig_range_with_focus_r(db, file_id, value_range, focus_range);
600600
navs.map(|(hir::FileRangeWrapper { file_id, range }, focus_range)| {
601-
NavigationTarget::from_syntax(file_id, "<expr>".into(), focus_range, range, kind)
601+
NavigationTarget::from_syntax(
602+
file_id,
603+
hir::Symbol::intern("<expr>"),
604+
focus_range,
605+
range,
606+
kind,
607+
)
602608
})
603609
}
604610

@@ -607,7 +613,6 @@ mod tests {
607613
use crate::{GotoDefinitionConfig, fixture};
608614
use ide_db::{FileRange, MiniCore};
609615
use itertools::Itertools;
610-
use syntax::SmolStr;
611616

612617
const TEST_CONFIG: GotoDefinitionConfig<'_> =
613618
GotoDefinitionConfig { minicore: MiniCore::default() };
@@ -658,7 +663,7 @@ mod tests {
658663
let Some(target) = navs.into_iter().next() else {
659664
panic!("expected single navigation target but encountered none");
660665
};
661-
assert_eq!(target.name, SmolStr::new_inline(expected_name));
666+
assert_eq!(target.name, hir::Symbol::intern(expected_name));
662667
}
663668

664669
#[test]

crates/ide/src/navigation_target.rs

Lines changed: 47 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ use arrayvec::ArrayVec;
66
use either::Either;
77
use 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
};
1112
use 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;
2020
use stdx::never;
2121
use 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

6360
impl 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

370361
impl 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

377368
impl 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
}
383374
impl 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
}
389380
impl 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
}
395386
impl 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
}
401392
impl ToNavFromAst for hir::Variant {
@@ -404,19 +395,19 @@ impl ToNavFromAst for hir::Variant {
404395
impl 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
}
410401
impl 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
}
416407
impl 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
452443
impl 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
}

crates/ide/src/references.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,7 @@ use self$0;
10581058
use self$0;
10591059
"#,
10601060
expect![[r#"
1061-
Module FileId(0) 0..10
1061+
_ Module FileId(0) 0..10
10621062
10631063
FileId(0) 4..8 import
10641064
"#]],
@@ -3130,7 +3130,7 @@ fn foo<'r#fn>(s: &'r#fn str) {
31303130
}
31313131
"#,
31323132
expect![[r#"
3133-
'r#break Label FileId(0) 87..96 87..95
3133+
'break Label FileId(0) 87..96 87..95
31343134
31353135
FileId(0) 113..121
31363136
"#]],
@@ -3146,7 +3146,7 @@ fn foo<'r#fn$0>(s: &'r#fn str) {
31463146
}
31473147
"#,
31483148
expect![[r#"
3149-
'r#fn LifetimeParam FileId(0) 7..12
3149+
'fn LifetimeParam FileId(0) 7..12
31503150
31513151
FileId(0) 18..23
31523152
FileId(0) 44..49

0 commit comments

Comments
 (0)