aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_ide/src/syntax_highlighting.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_ide/src/syntax_highlighting.rs')
-rw-r--r--crates/ra_ide/src/syntax_highlighting.rs59
1 files changed, 45 insertions, 14 deletions
diff --git a/crates/ra_ide/src/syntax_highlighting.rs b/crates/ra_ide/src/syntax_highlighting.rs
index 6ac44c2c0..d456d5d36 100644
--- a/crates/ra_ide/src/syntax_highlighting.rs
+++ b/crates/ra_ide/src/syntax_highlighting.rs
@@ -539,21 +539,52 @@ fn highlight_element(
539 _ => h, 539 _ => h,
540 } 540 }
541 } 541 }
542 T![*] => { 542 p if p.is_punct() => match p {
543 let prefix_expr = element.parent().and_then(ast::PrefixExpr::cast)?; 543 T![::] | T![->] | T![=>] | T![&] | T![..] | T![=] | T![@] => {
544 544 HighlightTag::Operator.into()
545 let expr = prefix_expr.expr()?;
546 let ty = sema.type_of_expr(&expr)?;
547 if !ty.is_raw_ptr() {
548 return None;
549 } else {
550 HighlightTag::Operator | HighlightModifier::Unsafe
551 } 545 }
552 } 546 T![!] if element.parent().and_then(ast::MacroCall::cast).is_some() => {
553 T![!] if element.parent().and_then(ast::MacroCall::cast).is_some() => { 547 HighlightTag::Macro.into()
554 Highlight::new(HighlightTag::Macro) 548 }
555 } 549 T![*] if element.parent().and_then(ast::PointerType::cast).is_some() => {
556 p if p.is_punct() => HighlightTag::Punctuation.into(), 550 HighlightTag::Keyword.into()
551 }
552 T![*] if element.parent().and_then(ast::PrefixExpr::cast).is_some() => {
553 let prefix_expr = element.parent().and_then(ast::PrefixExpr::cast)?;
554
555 let expr = prefix_expr.expr()?;
556 let ty = sema.type_of_expr(&expr)?;
557 if ty.is_raw_ptr() {
558 HighlightTag::Operator | HighlightModifier::Unsafe
559 } else if let Some(ast::PrefixOp::Deref) = prefix_expr.op_kind() {
560 HighlightTag::Operator.into()
561 } else {
562 HighlightTag::Punctuation.into()
563 }
564 }
565 T![-] if element.parent().and_then(ast::PrefixExpr::cast).is_some() => {
566 HighlightTag::NumericLiteral.into()
567 }
568 _ if element.parent().and_then(ast::PrefixExpr::cast).is_some() => {
569 HighlightTag::Operator.into()
570 }
571 _ if element.parent().and_then(ast::BinExpr::cast).is_some() => {
572 HighlightTag::Operator.into()
573 }
574 _ if element.parent().and_then(ast::RangeExpr::cast).is_some() => {
575 HighlightTag::Operator.into()
576 }
577 _ if element.parent().and_then(ast::RangePat::cast).is_some() => {
578 HighlightTag::Operator.into()
579 }
580 _ if element.parent().and_then(ast::DotDotPat::cast).is_some() => {
581 HighlightTag::Operator.into()
582 }
583 _ if element.parent().and_then(ast::Attr::cast).is_some() => {
584 HighlightTag::Attribute.into()
585 }
586 _ => HighlightTag::Punctuation.into(),
587 },
557 588
558 k if k.is_keyword() => { 589 k if k.is_keyword() => {
559 let h = Highlight::new(HighlightTag::Keyword); 590 let h = Highlight::new(HighlightTag::Keyword);