Skip to content

Commit c452219

Browse files
committed
Deduplicate highlight tags and symbol kinds
Curiously, LSP uses different enums for those, and unsurprising and annoyingly, there are things which exist in one but not in the other. Let's not repeat the mistake and unify the two things
1 parent 25185c1 commit c452219

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)