Skip to content

Commit c7b7c37

Browse files
bors[bot]matklad
andauthored
Merge #6937
6937: Deduplicate highlight tags and symbol kinds r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents 38b108c + c452219 commit c7b7c37

File tree

6 files changed

+128
-124
lines changed

6 files changed

+128
-124
lines changed

crates/ide/src/display/navigation_target.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ use crate::FileSymbol;
1818

1919
use super::short_label::ShortLabel;
2020

21-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
21+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
2222
pub enum SymbolKind {
2323
Module,
2424
Impl,
2525
Field,
2626
TypeParam,
2727
LifetimeParam,
28+
ValueParam,
2829
SelfParam,
2930
Local,
3031
Function,
@@ -406,10 +407,11 @@ impl ToNav for hir::Local {
406407
Some(it) => it.to_string().into(),
407408
None => "".into(),
408409
};
410+
let kind = if self.is_param(db) { SymbolKind::ValueParam } else { SymbolKind::Local };
409411
NavigationTarget {
410412
file_id: full_range.file_id,
411413
name,
412-
kind: Some(SymbolKind::Local),
414+
kind: Some(kind),
413415
full_range: full_range.range,
414416
focus_range: None,
415417
container_name: None,

crates/ide/src/references.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -546,7 +546,7 @@ fn bar() {
546546
fn foo(i : u32) -> u32 { i<|> }
547547
"#,
548548
expect![[r#"
549-
i Local FileId(0) 7..8 Other
549+
i ValueParam FileId(0) 7..8 Other
550550
551551
FileId(0) 25..26 Other Read
552552
"#]],
@@ -560,7 +560,7 @@ fn foo(i : u32) -> u32 { i<|> }
560560
fn foo(i<|> : u32) -> u32 { i }
561561
"#,
562562
expect![[r#"
563-
i Local FileId(0) 7..8 Other
563+
i ValueParam FileId(0) 7..8 Other
564564
565565
FileId(0) 25..26 Other Read
566566
"#]],

crates/ide/src/syntax_highlighting.rs

Lines changed: 54 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use crate::{
2323
syntax_highlighting::{
2424
format::FormatStringHighlighter, macro_rules::MacroRulesHighlighter, tags::Highlight,
2525
},
26-
FileId, HighlightModifier, HighlightTag,
26+
FileId, HighlightModifier, HighlightTag, SymbolKind,
2727
};
2828

2929
pub(crate) use html::highlight_as_html;
@@ -103,7 +103,7 @@ pub(crate) fn highlight(
103103
if let Some(range) = macro_call_range(&mc) {
104104
stack.add(HighlightedRange {
105105
range,
106-
highlight: HighlightTag::Macro.into(),
106+
highlight: HighlightTag::Symbol(SymbolKind::Macro).into(),
107107
binding_hash: None,
108108
});
109109
}
@@ -470,13 +470,13 @@ fn highlight_element(
470470
};
471471

472472
match name_kind {
473-
Some(NameClass::ExternCrate(_)) => HighlightTag::Module.into(),
473+
Some(NameClass::ExternCrate(_)) => HighlightTag::Symbol(SymbolKind::Module).into(),
474474
Some(NameClass::Definition(def)) => {
475475
highlight_def(db, def) | HighlightModifier::Definition
476476
}
477477
Some(NameClass::ConstReference(def)) => highlight_def(db, def),
478478
Some(NameClass::PatFieldShorthand { field_ref, .. }) => {
479-
let mut h = HighlightTag::Field.into();
479+
let mut h = HighlightTag::Symbol(SymbolKind::Field).into();
480480
if let Definition::Field(field) = field_ref {
481481
if let VariantDef::Union(_) = field.parent_def(db) {
482482
h |= HighlightModifier::Unsafe;
@@ -493,14 +493,16 @@ fn highlight_element(
493493
NAME_REF if element.ancestors().any(|it| it.kind() == ATTR) => {
494494
// even though we track whether we are in an attribute or not we still need this special case
495495
// as otherwise we would emit unresolved references for name refs inside attributes
496-
Highlight::from(HighlightTag::Function)
496+
Highlight::from(HighlightTag::Symbol(SymbolKind::Function))
497497
}
498498
NAME_REF => {
499499
let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap();
500500
highlight_func_by_name_ref(sema, &name_ref).unwrap_or_else(|| {
501501
match NameRefClass::classify(sema, &name_ref) {
502502
Some(name_kind) => match name_kind {
503-
NameRefClass::ExternCrate(_) => HighlightTag::Module.into(),
503+
NameRefClass::ExternCrate(_) => {
504+
HighlightTag::Symbol(SymbolKind::Module).into()
505+
}
504506
NameRefClass::Definition(def) => {
505507
if let Definition::Local(local) = &def {
506508
if let Some(name) = local.name(db) {
@@ -530,7 +532,9 @@ fn highlight_element(
530532

531533
h
532534
}
533-
NameRefClass::FieldShorthand { .. } => HighlightTag::Field.into(),
535+
NameRefClass::FieldShorthand { .. } => {
536+
HighlightTag::Symbol(SymbolKind::Field).into()
537+
}
534538
},
535539
None if syntactic_name_ref_highlighting => {
536540
highlight_name_ref_by_syntax(name_ref, sema)
@@ -556,7 +560,7 @@ fn highlight_element(
556560
CHAR => HighlightTag::CharLiteral.into(),
557561
QUESTION => Highlight::new(HighlightTag::Operator) | HighlightModifier::ControlFlow,
558562
LIFETIME => {
559-
let h = Highlight::new(HighlightTag::Lifetime);
563+
let h = Highlight::new(HighlightTag::Symbol(SymbolKind::LifetimeParam));
560564
match element.parent().map(|it| it.kind()) {
561565
Some(LIFETIME_PARAM) | Some(LABEL) => h | HighlightModifier::Definition,
562566
_ => h,
@@ -580,7 +584,7 @@ fn highlight_element(
580584
HighlightTag::Operator.into()
581585
}
582586
T![!] if element.parent().and_then(ast::MacroCall::cast).is_some() => {
583-
HighlightTag::Macro.into()
587+
HighlightTag::Symbol(SymbolKind::Macro).into()
584588
}
585589
T![!] if element.parent().and_then(ast::NeverType::cast).is_some() => {
586590
HighlightTag::BuiltinType.into()
@@ -659,7 +663,7 @@ fn highlight_element(
659663
.and_then(SyntaxNode::parent)
660664
.and_then(ast::Path::cast)
661665
.and_then(|p| sema.resolve_path(&p));
662-
let mut h = HighlightTag::SelfKeyword.into();
666+
let mut h = HighlightTag::Symbol(SymbolKind::SelfParam).into();
663667
if self_param_is_mut
664668
|| matches!(self_path,
665669
Some(hir::PathResolution::Local(local))
@@ -756,10 +760,10 @@ fn highlight_method_call(
756760

757761
fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
758762
match def {
759-
Definition::Macro(_) => HighlightTag::Macro,
760-
Definition::Field(_) => HighlightTag::Field,
763+
Definition::Macro(_) => HighlightTag::Symbol(SymbolKind::Macro),
764+
Definition::Field(_) => HighlightTag::Symbol(SymbolKind::Field),
761765
Definition::ModuleDef(def) => match def {
762-
hir::ModuleDef::Module(_) => HighlightTag::Module,
766+
hir::ModuleDef::Module(_) => HighlightTag::Symbol(SymbolKind::Module),
763767
hir::ModuleDef::Function(func) => {
764768
let mut h = if func.as_assoc_item(db).is_some() {
765769
if func.self_param(db).is_none() {
@@ -768,35 +772,38 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
768772
HighlightTag::Method.into()
769773
}
770774
} else {
771-
HighlightTag::Function.into()
775+
HighlightTag::Symbol(SymbolKind::Function).into()
772776
};
773777
if func.is_unsafe(db) {
774778
h |= HighlightModifier::Unsafe;
775779
}
776780
return h;
777781
}
778-
hir::ModuleDef::Adt(hir::Adt::Struct(_)) => HighlightTag::Struct,
779-
hir::ModuleDef::Adt(hir::Adt::Enum(_)) => HighlightTag::Enum,
780-
hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Union,
781-
hir::ModuleDef::EnumVariant(_) => HighlightTag::EnumVariant,
782-
hir::ModuleDef::Const(_) => HighlightTag::Constant,
783-
hir::ModuleDef::Trait(_) => HighlightTag::Trait,
784-
hir::ModuleDef::TypeAlias(_) => HighlightTag::TypeAlias,
782+
hir::ModuleDef::Adt(hir::Adt::Struct(_)) => HighlightTag::Symbol(SymbolKind::Struct),
783+
hir::ModuleDef::Adt(hir::Adt::Enum(_)) => HighlightTag::Symbol(SymbolKind::Enum),
784+
hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Symbol(SymbolKind::Union),
785+
hir::ModuleDef::EnumVariant(_) => HighlightTag::Symbol(SymbolKind::Variant),
786+
hir::ModuleDef::Const(_) => HighlightTag::Symbol(SymbolKind::Const),
787+
hir::ModuleDef::Trait(_) => HighlightTag::Symbol(SymbolKind::Trait),
788+
hir::ModuleDef::TypeAlias(_) => HighlightTag::Symbol(SymbolKind::TypeAlias),
785789
hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType,
786790
hir::ModuleDef::Static(s) => {
787-
let mut h = Highlight::new(HighlightTag::Static);
791+
let mut h = Highlight::new(HighlightTag::Symbol(SymbolKind::Static));
788792
if s.is_mut(db) {
789793
h |= HighlightModifier::Mutable;
790794
h |= HighlightModifier::Unsafe;
791795
}
792796
return h;
793797
}
794798
},
795-
Definition::SelfType(_) => HighlightTag::SelfType,
796-
Definition::TypeParam(_) => HighlightTag::TypeParam,
799+
Definition::SelfType(_) => HighlightTag::Symbol(SymbolKind::Impl),
800+
Definition::TypeParam(_) => HighlightTag::Symbol(SymbolKind::TypeParam),
797801
Definition::Local(local) => {
798-
let tag =
799-
if local.is_param(db) { HighlightTag::ValueParam } else { HighlightTag::Local };
802+
let tag = if local.is_param(db) {
803+
HighlightTag::Symbol(SymbolKind::ValueParam)
804+
} else {
805+
HighlightTag::Symbol(SymbolKind::Local)
806+
};
800807
let mut h = Highlight::new(tag);
801808
if local.is_mut(db) || local.ty(db).is_mutable_reference() {
802809
h |= HighlightModifier::Mutable;
@@ -806,7 +813,7 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight {
806813
}
807814
return h;
808815
}
809-
Definition::LifetimeParam(_) => HighlightTag::Lifetime,
816+
Definition::LifetimeParam(_) => HighlightTag::Symbol(SymbolKind::LifetimeParam),
810817
}
811818
.into()
812819
}
@@ -820,19 +827,19 @@ fn highlight_name_by_syntax(name: ast::Name) -> Highlight {
820827
};
821828

822829
let tag = match parent.kind() {
823-
STRUCT => HighlightTag::Struct,
824-
ENUM => HighlightTag::Enum,
825-
UNION => HighlightTag::Union,
826-
TRAIT => HighlightTag::Trait,
827-
TYPE_ALIAS => HighlightTag::TypeAlias,
828-
TYPE_PARAM => HighlightTag::TypeParam,
829-
RECORD_FIELD => HighlightTag::Field,
830-
MODULE => HighlightTag::Module,
831-
FN => HighlightTag::Function,
832-
CONST => HighlightTag::Constant,
833-
STATIC => HighlightTag::Static,
834-
VARIANT => HighlightTag::EnumVariant,
835-
IDENT_PAT => HighlightTag::Local,
830+
STRUCT => HighlightTag::Symbol(SymbolKind::Struct),
831+
ENUM => HighlightTag::Symbol(SymbolKind::Enum),
832+
VARIANT => HighlightTag::Symbol(SymbolKind::Variant),
833+
UNION => HighlightTag::Symbol(SymbolKind::Union),
834+
TRAIT => HighlightTag::Symbol(SymbolKind::Trait),
835+
TYPE_ALIAS => HighlightTag::Symbol(SymbolKind::TypeAlias),
836+
TYPE_PARAM => HighlightTag::Symbol(SymbolKind::TypeParam),
837+
RECORD_FIELD => HighlightTag::Symbol(SymbolKind::Field),
838+
MODULE => HighlightTag::Symbol(SymbolKind::Module),
839+
FN => HighlightTag::Symbol(SymbolKind::Function),
840+
CONST => HighlightTag::Symbol(SymbolKind::Const),
841+
STATIC => HighlightTag::Symbol(SymbolKind::Static),
842+
IDENT_PAT => HighlightTag::Symbol(SymbolKind::Local),
836843
_ => default,
837844
};
838845

@@ -851,10 +858,10 @@ fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabas
851858
METHOD_CALL_EXPR => {
852859
return ast::MethodCallExpr::cast(parent)
853860
.and_then(|method_call| highlight_method_call(sema, &method_call))
854-
.unwrap_or_else(|| HighlightTag::Function.into());
861+
.unwrap_or_else(|| HighlightTag::Symbol(SymbolKind::Function).into());
855862
}
856863
FIELD_EXPR => {
857-
let h = HighlightTag::Field;
864+
let h = HighlightTag::Symbol(SymbolKind::Field);
858865
let is_union = ast::FieldExpr::cast(parent)
859866
.and_then(|field_expr| {
860867
let field = sema.resolve_field(&field_expr)?;
@@ -881,9 +888,9 @@ fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabas
881888
_ => {
882889
// within path, decide whether it is module or adt by checking for uppercase name
883890
return if name.text().chars().next().unwrap_or_default().is_uppercase() {
884-
HighlightTag::Struct
891+
HighlightTag::Symbol(SymbolKind::Struct)
885892
} else {
886-
HighlightTag::Module
893+
HighlightTag::Symbol(SymbolKind::Module)
887894
}
888895
.into();
889896
}
@@ -894,11 +901,11 @@ fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabas
894901
};
895902

896903
match parent.kind() {
897-
CALL_EXPR => HighlightTag::Function.into(),
904+
CALL_EXPR => HighlightTag::Symbol(SymbolKind::Function).into(),
898905
_ => if name.text().chars().next().unwrap_or_default().is_uppercase() {
899-
HighlightTag::Struct.into()
906+
HighlightTag::Symbol(SymbolKind::Struct)
900907
} else {
901-
HighlightTag::Constant
908+
HighlightTag::Symbol(SymbolKind::Const)
902909
}
903910
.into(),
904911
}

crates/ide/src/syntax_highlighting/format.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use syntax::{
44
AstNode, AstToken, SyntaxElement, SyntaxKind, SyntaxNode, TextRange,
55
};
66

7-
use crate::{syntax_highlighting::HighlightedRangeStack, HighlightTag, HighlightedRange};
7+
use crate::{
8+
syntax_highlighting::HighlightedRangeStack, HighlightTag, HighlightedRange, SymbolKind,
9+
};
810

911
#[derive(Default)]
1012
pub(super) struct FormatStringHighlighter {
@@ -71,6 +73,6 @@ fn highlight_format_specifier(kind: FormatSpecifier) -> Option<HighlightTag> {
7173
| FormatSpecifier::Asterisk
7274
| FormatSpecifier::QuestionMark => HighlightTag::FormatSpecifier,
7375
FormatSpecifier::Integer | FormatSpecifier::Zero => HighlightTag::NumericLiteral,
74-
FormatSpecifier::Identifier => HighlightTag::Local,
76+
FormatSpecifier::Identifier => HighlightTag::Symbol(SymbolKind::Local),
7577
})
7678
}

0 commit comments

Comments
 (0)