mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-10-01 11:31:15 +00:00
Merge #8996
8996: Fix bug where library functions were not highlighted as such r=arzg a=arzg Sorry about forgetting to test this in my last PR. Co-authored-by: Aramis Razzaghipour <aramisnoah@gmail.com>
This commit is contained in:
commit
8483fb0f26
@ -71,7 +71,7 @@ pub(super) fn element(
|
|||||||
}
|
}
|
||||||
NAME_REF => {
|
NAME_REF => {
|
||||||
let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap();
|
let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap();
|
||||||
highlight_func_by_name_ref(sema, &name_ref).unwrap_or_else(|| {
|
highlight_func_by_name_ref(sema, krate, &name_ref).unwrap_or_else(|| {
|
||||||
let is_self = name_ref.self_token().is_some();
|
let is_self = name_ref.self_token().is_some();
|
||||||
let h = match NameRefClass::classify(sema, &name_ref) {
|
let h = match NameRefClass::classify(sema, &name_ref) {
|
||||||
Some(name_kind) => match name_kind {
|
Some(name_kind) => match name_kind {
|
||||||
@ -108,7 +108,7 @@ pub(super) fn element(
|
|||||||
NameRefClass::FieldShorthand { .. } => SymbolKind::Field.into(),
|
NameRefClass::FieldShorthand { .. } => SymbolKind::Field.into(),
|
||||||
},
|
},
|
||||||
None if syntactic_name_ref_highlighting => {
|
None if syntactic_name_ref_highlighting => {
|
||||||
highlight_name_ref_by_syntax(name_ref, sema)
|
highlight_name_ref_by_syntax(name_ref, sema, krate)
|
||||||
}
|
}
|
||||||
None => HlTag::UnresolvedReference.into(),
|
None => HlTag::UnresolvedReference.into(),
|
||||||
};
|
};
|
||||||
@ -434,19 +434,23 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition)
|
|||||||
|
|
||||||
fn highlight_func_by_name_ref(
|
fn highlight_func_by_name_ref(
|
||||||
sema: &Semantics<RootDatabase>,
|
sema: &Semantics<RootDatabase>,
|
||||||
|
krate: Option<hir::Crate>,
|
||||||
name_ref: &ast::NameRef,
|
name_ref: &ast::NameRef,
|
||||||
) -> Option<Highlight> {
|
) -> Option<Highlight> {
|
||||||
let mc = name_ref.syntax().parent().and_then(ast::MethodCallExpr::cast)?;
|
let mc = name_ref.syntax().parent().and_then(ast::MethodCallExpr::cast)?;
|
||||||
highlight_method_call(sema, &mc)
|
highlight_method_call(sema, krate, &mc)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn highlight_method_call(
|
fn highlight_method_call(
|
||||||
sema: &Semantics<RootDatabase>,
|
sema: &Semantics<RootDatabase>,
|
||||||
|
krate: Option<hir::Crate>,
|
||||||
method_call: &ast::MethodCallExpr,
|
method_call: &ast::MethodCallExpr,
|
||||||
) -> Option<Highlight> {
|
) -> Option<Highlight> {
|
||||||
let func = sema.resolve_method_call(&method_call)?;
|
let func = sema.resolve_method_call(&method_call)?;
|
||||||
|
|
||||||
let mut h = SymbolKind::Function.into();
|
let mut h = SymbolKind::Function.into();
|
||||||
h |= HlMod::Associated;
|
h |= HlMod::Associated;
|
||||||
|
|
||||||
if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) {
|
if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) {
|
||||||
h |= HlMod::Unsafe;
|
h |= HlMod::Unsafe;
|
||||||
}
|
}
|
||||||
@ -454,7 +458,10 @@ fn highlight_method_call(
|
|||||||
h |= HlMod::Async;
|
h |= HlMod::Async;
|
||||||
}
|
}
|
||||||
if func.as_assoc_item(sema.db).and_then(|it| it.containing_trait(sema.db)).is_some() {
|
if func.as_assoc_item(sema.db).and_then(|it| it.containing_trait(sema.db)).is_some() {
|
||||||
h |= HlMod::Trait
|
h |= HlMod::Trait;
|
||||||
|
}
|
||||||
|
if Some(func.module(sema.db).krate()) != krate {
|
||||||
|
h |= HlMod::Library;
|
||||||
}
|
}
|
||||||
|
|
||||||
if let Some(self_param) = func.self_param(sema.db) {
|
if let Some(self_param) = func.self_param(sema.db) {
|
||||||
@ -503,7 +510,11 @@ fn highlight_name_by_syntax(name: ast::Name) -> Highlight {
|
|||||||
tag.into()
|
tag.into()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabase>) -> Highlight {
|
fn highlight_name_ref_by_syntax(
|
||||||
|
name: ast::NameRef,
|
||||||
|
sema: &Semantics<RootDatabase>,
|
||||||
|
krate: Option<hir::Crate>,
|
||||||
|
) -> Highlight {
|
||||||
let default = HlTag::UnresolvedReference;
|
let default = HlTag::UnresolvedReference;
|
||||||
|
|
||||||
let parent = match name.syntax().parent() {
|
let parent = match name.syntax().parent() {
|
||||||
@ -514,7 +525,7 @@ fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabas
|
|||||||
match parent.kind() {
|
match parent.kind() {
|
||||||
METHOD_CALL_EXPR => {
|
METHOD_CALL_EXPR => {
|
||||||
return ast::MethodCallExpr::cast(parent)
|
return ast::MethodCallExpr::cast(parent)
|
||||||
.and_then(|it| highlight_method_call(sema, &it))
|
.and_then(|it| highlight_method_call(sema, krate, &it))
|
||||||
.unwrap_or_else(|| SymbolKind::Function.into());
|
.unwrap_or_else(|| SymbolKind::Function.into());
|
||||||
}
|
}
|
||||||
FIELD_EXPR => {
|
FIELD_EXPR => {
|
||||||
|
@ -258,7 +258,7 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
|
|||||||
|
|
||||||
<span class="keyword">let</span> <span class="variable declaration">control_flow</span> <span class="operator">=</span> <span class="module library">foo</span><span class="operator">::</span><span class="function library">identity</span><span class="parenthesis">(</span><span class="module library">foo</span><span class="operator">::</span><span class="enum library">ControlFlow</span><span class="operator">::</span><span class="enum_variant library">Continue</span><span class="parenthesis">)</span><span class="semicolon">;</span>
|
<span class="keyword">let</span> <span class="variable declaration">control_flow</span> <span class="operator">=</span> <span class="module library">foo</span><span class="operator">::</span><span class="function library">identity</span><span class="parenthesis">(</span><span class="module library">foo</span><span class="operator">::</span><span class="enum library">ControlFlow</span><span class="operator">::</span><span class="enum_variant library">Continue</span><span class="parenthesis">)</span><span class="semicolon">;</span>
|
||||||
|
|
||||||
<span class="keyword control">if</span> <span class="keyword">let</span> <span class="module library">foo</span><span class="operator">::</span><span class="enum library">ControlFlow</span><span class="operator">::</span><span class="enum_variant library">Die</span> <span class="operator">=</span> <span class="variable">control_flow</span> <span class="brace">{</span>
|
<span class="keyword control">if</span> <span class="variable">control_flow</span><span class="operator">.</span><span class="function associated consuming library">should_die</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span>
|
||||||
foo::<span class="macro">die!</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
|
foo::<span class="macro">die!</span><span class="parenthesis">(</span><span class="parenthesis">)</span><span class="semicolon">;</span>
|
||||||
<span class="brace">}</span>
|
<span class="brace">}</span>
|
||||||
<span class="brace">}</span>
|
<span class="brace">}</span>
|
||||||
|
@ -232,7 +232,7 @@ fn use_foo_items() {
|
|||||||
|
|
||||||
let control_flow = foo::identity(foo::ControlFlow::Continue);
|
let control_flow = foo::identity(foo::ControlFlow::Continue);
|
||||||
|
|
||||||
if let foo::ControlFlow::Die = control_flow {
|
if control_flow.should_die() {
|
||||||
foo::die!();
|
foo::die!();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -249,6 +249,12 @@ pub enum ControlFlow {
|
|||||||
Die,
|
Die,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl ControlFlow {
|
||||||
|
pub fn should_die(self) -> bool {
|
||||||
|
matches!(self, ControlFlow::Die)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn identity<T>(x: T) -> T { x }
|
pub fn identity<T>(x: T) -> T { x }
|
||||||
|
|
||||||
pub mod consts {
|
pub mod consts {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user