Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 21 additions & 10 deletions crates/ide/src/syntax_highlighting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -736,7 +736,8 @@ fn highlight_method_call(
method_call: &ast::MethodCallExpr,
) -> Option<Highlight> {
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;
}
Expand Down Expand Up @@ -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;
}
Expand All @@ -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));
Expand Down
3 changes: 1 addition & 2 deletions crates/ide/src/syntax_highlighting/injection.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,5 @@ pub(super) fn highlight_doc_comment(
stack.add(comment);
}
stack.pop_and_inject(None);
stack
.pop_and_inject(Some(Highlight::from(HighlightTag::Generic) | HighlightModifier::Injected));
stack.pop_and_inject(Some(Highlight::from(HighlightTag::Dummy) | HighlightModifier::Injected));
}
15 changes: 10 additions & 5 deletions crates/ide/src/syntax_highlighting/tags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,8 @@ pub enum HighlightTag {
Operator,
UnresolvedReference,

// FIXME: this two are random and don't fit with the others
Method,
Generic,
// For things which don't have proper Tag, but want to use modifiers.
Dummy,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
Expand All @@ -56,6 +55,8 @@ pub enum HighlightModifier {
Callable,
/// Used for associated functions
Static,
/// Used for items in impls&traits.
Associated,
}

impl HighlightTag {
Expand Down Expand Up @@ -89,10 +90,9 @@ impl HighlightTag {
HighlightTag::Comment => "comment",
HighlightTag::EscapeSequence => "escape_sequence",
HighlightTag::FormatSpecifier => "format_specifier",
HighlightTag::Generic => "generic",
HighlightTag::Dummy => "dummy",
HighlightTag::Keyword => "keyword",
HighlightTag::Punctuation => "punctuation",
HighlightTag::Method => "method",
HighlightTag::NumericLiteral => "numeric_literal",
HighlightTag::Operator => "operator",
HighlightTag::StringLiteral => "string_literal",
Expand Down Expand Up @@ -133,6 +133,7 @@ impl HighlightModifier {
HighlightModifier::Unsafe => "unsafe",
HighlightModifier::Callable => "callable",
HighlightModifier::Static => "static",
HighlightModifier::Associated => "associated",
}
}

Expand Down Expand Up @@ -199,6 +200,10 @@ impl ops::BitOr<HighlightModifier> for Highlight {
}

impl HighlightModifiers {
pub fn contains(self, m: HighlightModifier) -> bool {
self.0 & m.mask() == m.mask()
}

pub fn iter(self) -> impl Iterator<Item = HighlightModifier> {
HighlightModifier::ALL.iter().copied().filter(move |it| self.0 & it.mask() == it.mask())
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,17 +40,17 @@
<span class="keyword">struct</span> <span class="struct declaration">foo</span> <span class="punctuation">{</span><span class="punctuation">}</span>

<span class="keyword">impl</span> <span class="struct">foo</span> <span class="punctuation">{</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="method declaration static">is_static</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="method declaration">is_not_static</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration static">is_static</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration">is_not_static</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="punctuation">}</span>

<span class="keyword">trait</span> <span class="trait declaration">t</span> <span class="punctuation">{</span>
<span class="keyword">fn</span> <span class="method declaration static">t_is_static</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">fn</span> <span class="method declaration">t_is_not_static</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">fn</span> <span class="function declaration static">t_is_static</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">fn</span> <span class="function declaration">t_is_not_static</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="punctuation">}</span>

<span class="keyword">impl</span> <span class="trait">t</span> <span class="keyword">for</span> <span class="struct">foo</span> <span class="punctuation">{</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="method declaration static">is_static</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="method declaration">is_not_static</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration static">is_static</span><span class="punctuation">(</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration">is_not_static</span><span class="punctuation">(</span><span class="operator">&</span><span class="self_keyword">self</span><span class="punctuation">)</span> <span class="punctuation">{</span><span class="punctuation">}</span>
<span class="punctuation">}</span>
</code></pre>
Loading