aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/syntax_highlighting/highlight.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ide/src/syntax_highlighting/highlight.rs')
-rw-r--r--crates/ide/src/syntax_highlighting/highlight.rs23
1 files changed, 17 insertions, 6 deletions
diff --git a/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs
index b4a3d39c9..9503c936d 100644
--- a/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/crates/ide/src/syntax_highlighting/highlight.rs
@@ -71,7 +71,7 @@ pub(super) fn element(
71 } 71 }
72 NAME_REF => { 72 NAME_REF => {
73 let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap(); 73 let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap();
74 highlight_func_by_name_ref(sema, &name_ref).unwrap_or_else(|| { 74 highlight_func_by_name_ref(sema, krate, &name_ref).unwrap_or_else(|| {
75 let is_self = name_ref.self_token().is_some(); 75 let is_self = name_ref.self_token().is_some();
76 let h = match NameRefClass::classify(sema, &name_ref) { 76 let h = match NameRefClass::classify(sema, &name_ref) {
77 Some(name_kind) => match name_kind { 77 Some(name_kind) => match name_kind {
@@ -108,7 +108,7 @@ pub(super) fn element(
108 NameRefClass::FieldShorthand { .. } => SymbolKind::Field.into(), 108 NameRefClass::FieldShorthand { .. } => SymbolKind::Field.into(),
109 }, 109 },
110 None if syntactic_name_ref_highlighting => { 110 None if syntactic_name_ref_highlighting => {
111 highlight_name_ref_by_syntax(name_ref, sema) 111 highlight_name_ref_by_syntax(name_ref, sema, krate)
112 } 112 }
113 None => HlTag::UnresolvedReference.into(), 113 None => HlTag::UnresolvedReference.into(),
114 }; 114 };
@@ -434,19 +434,23 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition)
434 434
435fn highlight_func_by_name_ref( 435fn highlight_func_by_name_ref(
436 sema: &Semantics<RootDatabase>, 436 sema: &Semantics<RootDatabase>,
437 krate: Option<hir::Crate>,
437 name_ref: &ast::NameRef, 438 name_ref: &ast::NameRef,
438) -> Option<Highlight> { 439) -> Option<Highlight> {
439 let mc = name_ref.syntax().parent().and_then(ast::MethodCallExpr::cast)?; 440 let mc = name_ref.syntax().parent().and_then(ast::MethodCallExpr::cast)?;
440 highlight_method_call(sema, &mc) 441 highlight_method_call(sema, krate, &mc)
441} 442}
442 443
443fn highlight_method_call( 444fn highlight_method_call(
444 sema: &Semantics<RootDatabase>, 445 sema: &Semantics<RootDatabase>,
446 krate: Option<hir::Crate>,
445 method_call: &ast::MethodCallExpr, 447 method_call: &ast::MethodCallExpr,
446) -> Option<Highlight> { 448) -> Option<Highlight> {
447 let func = sema.resolve_method_call(&method_call)?; 449 let func = sema.resolve_method_call(&method_call)?;
450
448 let mut h = SymbolKind::Function.into(); 451 let mut h = SymbolKind::Function.into();
449 h |= HlMod::Associated; 452 h |= HlMod::Associated;
453
450 if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) { 454 if func.is_unsafe(sema.db) || sema.is_unsafe_method_call(&method_call) {
451 h |= HlMod::Unsafe; 455 h |= HlMod::Unsafe;
452 } 456 }
@@ -454,7 +458,10 @@ fn highlight_method_call(
454 h |= HlMod::Async; 458 h |= HlMod::Async;
455 } 459 }
456 if func.as_assoc_item(sema.db).and_then(|it| it.containing_trait(sema.db)).is_some() { 460 if func.as_assoc_item(sema.db).and_then(|it| it.containing_trait(sema.db)).is_some() {
457 h |= HlMod::Trait 461 h |= HlMod::Trait;
462 }
463 if Some(func.module(sema.db).krate()) != krate {
464 h |= HlMod::Library;
458 } 465 }
459 466
460 if let Some(self_param) = func.self_param(sema.db) { 467 if let Some(self_param) = func.self_param(sema.db) {
@@ -503,7 +510,11 @@ fn highlight_name_by_syntax(name: ast::Name) -> Highlight {
503 tag.into() 510 tag.into()
504} 511}
505 512
506fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabase>) -> Highlight { 513fn highlight_name_ref_by_syntax(
514 name: ast::NameRef,
515 sema: &Semantics<RootDatabase>,
516 krate: Option<hir::Crate>,
517) -> Highlight {
507 let default = HlTag::UnresolvedReference; 518 let default = HlTag::UnresolvedReference;
508 519
509 let parent = match name.syntax().parent() { 520 let parent = match name.syntax().parent() {
@@ -514,7 +525,7 @@ fn highlight_name_ref_by_syntax(name: ast::NameRef, sema: &Semantics<RootDatabas
514 match parent.kind() { 525 match parent.kind() {
515 METHOD_CALL_EXPR => { 526 METHOD_CALL_EXPR => {
516 return ast::MethodCallExpr::cast(parent) 527 return ast::MethodCallExpr::cast(parent)
517 .and_then(|it| highlight_method_call(sema, &it)) 528 .and_then(|it| highlight_method_call(sema, krate, &it))
518 .unwrap_or_else(|| SymbolKind::Function.into()); 529 .unwrap_or_else(|| SymbolKind::Function.into());
519 } 530 }
520 FIELD_EXPR => { 531 FIELD_EXPR => {