};
match name_kind {
+ Some(NameClass::ExternCrate(_)) => HighlightTag::Module.into(),
Some(NameClass::Definition(def)) => {
highlight_name(db, def, false) | HighlightModifier::Definition
}
let possibly_unsafe = is_possibly_unsafe(&name_ref);
match classify_name_ref(sema, &name_ref) {
Some(name_kind) => match name_kind {
+ NameRefClass::ExternCrate(_) => HighlightTag::Module.into(),
NameRefClass::Definition(def) => {
if let Definition::Local(local) = &def {
if let Some(name) = local.name(db) {
_ => h,
}
}
+ REF_EXPR => {
+ let ref_expr = element.into_node().and_then(ast::RefExpr::cast)?;
+ let expr = ref_expr.expr()?;
+ let field_expr = match expr {
+ ast::Expr::FieldExpr(fe) => fe,
+ _ => return None,
+ };
+
+ let expr = field_expr.expr()?;
+ let ty = sema.type_of_expr(&expr)?;
+ if !ty.is_packed(db) {
+ return None;
+ }
+
+ // FIXME account for alignment... somehow
+
+ Highlight::new(HighlightTag::Operator) | HighlightModifier::Unsafe
+ }
p if p.is_punct() => match p {
T![::] | T![->] | T![=>] | T![&] | T![..] | T![=] | T![@] => {
HighlightTag::Operator.into()