From a13947abe62a44c4ffa802be54e041a3d18e7f2b Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 19 Dec 2020 17:10:47 +0300 Subject: Use more Rustic highlighting specifiers *Method* works for OO languages, but in rust we can also have associated constants & types, so let's move this to a modifier. --- crates/ide/src/syntax_highlighting.rs | 31 +++++++++++++------ crates/ide/src/syntax_highlighting/tags.rs | 11 +++++-- .../test_data/highlight_assoc_functions.html | 12 ++++---- .../test_data/highlight_doctest.html | 4 +-- .../test_data/highlight_injection.html | 2 +- .../test_data/highlight_unsafe.html | 10 +++--- .../test_data/highlighting.html | 36 +++++++++++----------- crates/rust-analyzer/src/to_proto.rs | 10 ++++-- 8 files changed, 69 insertions(+), 47 deletions(-) (limited to 'crates') diff --git a/crates/ide/src/syntax_highlighting.rs b/crates/ide/src/syntax_highlighting.rs index 7f98aa316..67ad7c63d 100644 --- a/crates/ide/src/syntax_highlighting.rs +++ b/crates/ide/src/syntax_highlighting.rs @@ -736,7 +736,8 @@ fn highlight_method_call( method_call: &ast::MethodCallExpr, ) -> Option { let func = sema.resolve_method_call(&method_call)?; - let mut h = HighlightTag::Method.into(); + let mut h = HighlightTag::Symbol(SymbolKind::Function).into(); + h |= HighlightModifier::Associated; if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) { h |= HighlightModifier::Unsafe; } @@ -765,15 +766,13 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight { Definition::ModuleDef(def) => match def { hir::ModuleDef::Module(_) => HighlightTag::Symbol(SymbolKind::Module), hir::ModuleDef::Function(func) => { - let mut h = if func.as_assoc_item(db).is_some() { + let mut h = Highlight::new(HighlightTag::Symbol(SymbolKind::Function)); + if func.as_assoc_item(db).is_some() { + h |= HighlightModifier::Associated; if func.self_param(db).is_none() { - Highlight::from(HighlightTag::Method) | HighlightModifier::Static - } else { - HighlightTag::Method.into() + h |= HighlightModifier::Static } - } else { - HighlightTag::Symbol(SymbolKind::Function).into() - }; + } if func.is_unsafe(db) { h |= HighlightModifier::Unsafe; } @@ -783,9 +782,21 @@ fn highlight_def(db: &RootDatabase, def: Definition) -> Highlight { hir::ModuleDef::Adt(hir::Adt::Enum(_)) => HighlightTag::Symbol(SymbolKind::Enum), hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Symbol(SymbolKind::Union), hir::ModuleDef::EnumVariant(_) => HighlightTag::Symbol(SymbolKind::Variant), - hir::ModuleDef::Const(_) => HighlightTag::Symbol(SymbolKind::Const), + hir::ModuleDef::Const(konst) => { + let mut h = Highlight::new(HighlightTag::Symbol(SymbolKind::Const)); + if konst.as_assoc_item(db).is_some() { + h |= HighlightModifier::Associated + } + return h; + } hir::ModuleDef::Trait(_) => HighlightTag::Symbol(SymbolKind::Trait), - hir::ModuleDef::TypeAlias(_) => HighlightTag::Symbol(SymbolKind::TypeAlias), + hir::ModuleDef::TypeAlias(type_) => { + let mut h = Highlight::new(HighlightTag::Symbol(SymbolKind::TypeAlias)); + if type_.as_assoc_item(db).is_some() { + h |= HighlightModifier::Associated + } + return h; + } hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType, hir::ModuleDef::Static(s) => { let mut h = Highlight::new(HighlightTag::Symbol(SymbolKind::Static)); diff --git a/crates/ide/src/syntax_highlighting/tags.rs b/crates/ide/src/syntax_highlighting/tags.rs index e0117a6b2..1b3b31747 100644 --- a/crates/ide/src/syntax_highlighting/tags.rs +++ b/crates/ide/src/syntax_highlighting/tags.rs @@ -33,8 +33,7 @@ pub enum HighlightTag { Operator, UnresolvedReference, - // FIXME: this two are random and don't fit with the others - Method, + // FIXME: this one is random and don't fit with the others Generic, } @@ -56,6 +55,8 @@ pub enum HighlightModifier { Callable, /// Used for associated functions Static, + /// Used for items in impls&traits. + Associated, } impl HighlightTag { @@ -92,7 +93,6 @@ impl HighlightTag { HighlightTag::Generic => "generic", HighlightTag::Keyword => "keyword", HighlightTag::Punctuation => "punctuation", - HighlightTag::Method => "method", HighlightTag::NumericLiteral => "numeric_literal", HighlightTag::Operator => "operator", HighlightTag::StringLiteral => "string_literal", @@ -133,6 +133,7 @@ impl HighlightModifier { HighlightModifier::Unsafe => "unsafe", HighlightModifier::Callable => "callable", HighlightModifier::Static => "static", + HighlightModifier::Associated => "associated", } } @@ -199,6 +200,10 @@ impl ops::BitOr for Highlight { } impl HighlightModifiers { + pub fn contains(self, m: HighlightModifier) -> bool { + self.0 & m.mask() == m.mask() + } + pub fn iter(self) -> impl Iterator { HighlightModifier::ALL.iter().copied().filter(move |it| self.0 & it.mask() == it.mask()) } diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html b/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html index 6fb606a47..cd80d72b7 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_assoc_functions.html @@ -40,17 +40,17 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd struct foo {} impl foo { - pub fn is_static() {} - pub fn is_not_static(&self) {} + pub fn is_static() {} + pub fn is_not_static(&self) {} } trait t { - fn t_is_static() {} - fn t_is_not_static(&self) {} + fn t_is_static() {} + fn t_is_not_static(&self) {} } impl t for foo { - pub fn is_static() {} - pub fn is_not_static(&self) {} + pub fn is_static() {} + pub fn is_not_static(&self) {} } \ No newline at end of file diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html b/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html index 920956b51..882c529d8 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_doctest.html @@ -53,7 +53,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd /// # #![allow(unused_mut)] /// let mut foo: Foo = Foo::new(); /// ``` - pub const fn new() -> Foo { + pub const fn new() -> Foo { Foo { bar: true } } @@ -87,7 +87,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd /// ```sh /// echo 1 /// ``` - pub fn foo(&self) -> bool { + pub fn foo(&self) -> bool { true } } diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html b/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html index 31daf2bd0..57c178916 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_injection.html @@ -40,7 +40,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd fn main() { fixture(r#" trait Foo { - fn foo() { + fn foo() { println!("2 + 2 = {}", 4); } }"# diff --git a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html index 67ec73f15..1d05b7713 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlight_unsafe.html @@ -45,7 +45,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd struct HasUnsafeFn; impl HasUnsafeFn { - unsafe fn unsafe_method(&self) {} + unsafe fn unsafe_method(&self) {} } struct TypeForStaticMut { @@ -60,11 +60,11 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd } trait DoTheAutoref { - fn calls_autoref(&self); + fn calls_autoref(&self); } impl DoTheAutoref for u16 { - fn calls_autoref(&self) {} + fn calls_autoref(&self) {} } fn main() { @@ -78,7 +78,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd Union { b: 0 } => (), Union { a } => (), } - HasUnsafeFn.unsafe_method(); + HasUnsafeFn.unsafe_method(); // unsafe deref let y = *x; @@ -94,6 +94,6 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd let Packed { a: ref _a } = packed; // unsafe auto ref of packed field - packed.a.calls_autoref(); + packed.a.calls_autoref(); } } \ No newline at end of file diff --git a/crates/ide/src/syntax_highlighting/test_data/highlighting.html b/crates/ide/src/syntax_highlighting/test_data/highlighting.html index 3530a5fdb..118434418 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlighting.html +++ b/crates/ide/src/syntax_highlighting/test_data/highlighting.html @@ -65,25 +65,25 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd } trait Bar { - fn bar(&self) -> i32; + fn bar(&self) -> i32; } impl Bar for Foo { - fn bar(&self) -> i32 { + fn bar(&self) -> i32 { self.x } } impl Foo { - fn baz(mut self, f: Foo) -> i32 { - f.baz(self) + fn baz(mut self, f: Foo) -> i32 { + f.baz(self) } - fn qux(&mut self) { + fn qux(&mut self) { self.x = 0; } - fn quop(&self) -> i32 { + fn quop(&self) -> i32 { self.x } } @@ -94,15 +94,15 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd } impl FooCopy { - fn baz(self, f: FooCopy) -> u32 { - f.baz(self) + fn baz(self, f: FooCopy) -> u32 { + f.baz(self) } - fn qux(&mut self) { + fn qux(&mut self) { self.x = 0; } - fn quop(&self) -> u32 { + fn quop(&self) -> u32 { self.x } } @@ -178,17 +178,17 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd let mut foo = Foo { x, y: x }; let foo2 = Foo { x, y: x }; - foo.quop(); - foo.qux(); - foo.baz(foo2); + foo.quop(); + foo.qux(); + foo.baz(foo2); let mut copy = FooCopy { x }; - copy.quop(); - copy.qux(); - copy.baz(copy); + copy.quop(); + copy.qux(); + copy.baz(copy); let a = |x| x; - let bar = Foo::baz; + let bar = Foo::baz; let baz = -42; let baz = -baz; @@ -203,7 +203,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd use Option::*; impl<T> Option<T> { - fn and<U>(self, other: Option<U>) -> Option<(T, U)> { + fn and<U>(self, other: Option<U>) -> Option<(T, U)> { match other { None => unimplemented!(), Nope => Nope, diff --git a/crates/rust-analyzer/src/to_proto.rs b/crates/rust-analyzer/src/to_proto.rs index 229df47dc..9bea7366b 100644 --- a/crates/rust-analyzer/src/to_proto.rs +++ b/crates/rust-analyzer/src/to_proto.rs @@ -381,7 +381,13 @@ fn semantic_token_type_and_modifiers( SymbolKind::ValueParam => lsp_types::SemanticTokenType::PARAMETER, SymbolKind::SelfParam => semantic_tokens::SELF_KEYWORD, SymbolKind::Local => lsp_types::SemanticTokenType::VARIABLE, - SymbolKind::Function => lsp_types::SemanticTokenType::FUNCTION, + SymbolKind::Function => { + if highlight.modifiers.contains(HighlightModifier::Associated) { + lsp_types::SemanticTokenType::METHOD + } else { + lsp_types::SemanticTokenType::FUNCTION + } + } SymbolKind::Const => { mods |= semantic_tokens::CONSTANT; mods |= lsp_types::SemanticTokenModifier::STATIC; @@ -401,7 +407,6 @@ fn semantic_token_type_and_modifiers( }, HighlightTag::BuiltinType => semantic_tokens::BUILTIN_TYPE, HighlightTag::Generic => semantic_tokens::GENERIC, - HighlightTag::Method => lsp_types::SemanticTokenType::METHOD, HighlightTag::ByteLiteral | HighlightTag::NumericLiteral => { lsp_types::SemanticTokenType::NUMBER } @@ -431,6 +436,7 @@ fn semantic_token_type_and_modifiers( HighlightModifier::Unsafe => semantic_tokens::UNSAFE, HighlightModifier::Callable => semantic_tokens::CALLABLE, HighlightModifier::Static => lsp_types::SemanticTokenModifier::STATIC, + HighlightModifier::Associated => continue, }; mods |= modifier; } -- cgit v1.2.3