mirror of
				https://github.com/rust-lang/rust-analyzer.git
				synced 2025-11-03 13:13:18 +00:00 
			
		
		
		
	Merge #9423
9423: fix: Resolve attribute paths in attribute highlighting r=Veykril a=Veykril Attributes have a new highlighting format now, whereas the `#[` `]` tokens are now tagged with `attribute.attribute` like before, but all other idents inside token trees are now `generic.attribute`. If a path in an attribute can't be resolved it will instead get the `builtinAttribute.attribute` tags now as highlighting doesn't know about builtins like `allow` yet, so we don't want to emit unresolved references. Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
		
						commit
						13cbe64a59
					
				@ -1,4 +1,4 @@
 | 
				
			|||||||
//! Builtin derives.
 | 
					//! Builtin attributes.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
use syntax::ast;
 | 
					use syntax::ast;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -102,7 +102,8 @@ pub struct HlRange {
 | 
				
			|||||||
// //-
 | 
					// //-
 | 
				
			||||||
//
 | 
					//
 | 
				
			||||||
// [horizontal]
 | 
					// [horizontal]
 | 
				
			||||||
// attribute:: Emitted for attributes.
 | 
					// attribute:: Emitted for the `#[` `]` tokens.
 | 
				
			||||||
 | 
					// builtinAttribute:: Emitted for names to builtin attributes in attribute path, the `repr` in `#[repr(u8)]` for example.
 | 
				
			||||||
// builtinType:: Emitted for builtin types like `u32`, `str` and `f32`.
 | 
					// builtinType:: Emitted for builtin types like `u32`, `str` and `f32`.
 | 
				
			||||||
// comment:: Emitted for comments.
 | 
					// comment:: Emitted for comments.
 | 
				
			||||||
// constParameter:: Emitted for const parameters.
 | 
					// constParameter:: Emitted for const parameters.
 | 
				
			||||||
 | 
				
			|||||||
@ -71,16 +71,46 @@ pub(super) fn element(
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
        // Highlight references like the definitions they resolve to
 | 
					        // Highlight references like the definitions they resolve to
 | 
				
			||||||
        NAME_REF if element.ancestors().any(|it| it.kind() == ATTR) => {
 | 
					        NAME_REF if element.ancestors().any(|it| it.kind() == ATTR) => {
 | 
				
			||||||
            // even though we track whether we are in an attribute or not we still need this special case
 | 
					            // FIXME: We highlight paths in attributes slightly differently to work around this module
 | 
				
			||||||
            // as otherwise we would emit unresolved references for name refs inside attributes
 | 
					            // currently not knowing about tool attributes and rustc builtin attributes as
 | 
				
			||||||
            SymbolKind::Function.into()
 | 
					            // we do not want to resolve those to functions that may be defined in scope.
 | 
				
			||||||
 | 
					            let name_ref = element.into_node().and_then(ast::NameRef::cast).unwrap();
 | 
				
			||||||
 | 
					            match NameRefClass::classify(sema, &name_ref) {
 | 
				
			||||||
 | 
					                Some(name_class) => match name_class {
 | 
				
			||||||
 | 
					                    NameRefClass::Definition(Definition::ModuleDef(hir::ModuleDef::Module(_)))
 | 
				
			||||||
 | 
					                        if name_ref
 | 
				
			||||||
 | 
					                            .syntax()
 | 
				
			||||||
 | 
					                            .ancestors()
 | 
				
			||||||
 | 
					                            .find_map(ast::Path::cast)
 | 
				
			||||||
 | 
					                            .map_or(false, |it| it.parent_path().is_some()) =>
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        HlTag::Symbol(SymbolKind::Module)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    NameRefClass::Definition(Definition::Macro(m))
 | 
				
			||||||
 | 
					                        if m.kind() == hir::MacroKind::Attr =>
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        HlTag::Symbol(SymbolKind::Macro)
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    _ => HlTag::BuiltinAttr,
 | 
				
			||||||
 | 
					                },
 | 
				
			||||||
 | 
					                None => HlTag::BuiltinAttr,
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            .into()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        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, krate, &name_ref).unwrap_or_else(|| {
 | 
					            highlight_method_call_by_name_ref(sema, krate, &name_ref).unwrap_or_else(|| {
 | 
				
			||||||
                let is_self = name_ref.self_token().is_some();
 | 
					                let name_class = match NameRefClass::classify(sema, &name_ref) {
 | 
				
			||||||
                let h = match NameRefClass::classify(sema, &name_ref) {
 | 
					                    Some(name_kind) => name_kind,
 | 
				
			||||||
                    Some(name_kind) => match name_kind {
 | 
					                    None => {
 | 
				
			||||||
 | 
					                        return if syntactic_name_ref_highlighting {
 | 
				
			||||||
 | 
					                            highlight_name_ref_by_syntax(name_ref, sema, krate)
 | 
				
			||||||
 | 
					                        } else {
 | 
				
			||||||
 | 
					                            HlTag::UnresolvedReference.into()
 | 
				
			||||||
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                };
 | 
				
			||||||
 | 
					                let h = match name_class {
 | 
				
			||||||
                    NameRefClass::ExternCrate(_) => SymbolKind::Module.into(),
 | 
					                    NameRefClass::ExternCrate(_) => SymbolKind::Module.into(),
 | 
				
			||||||
                    NameRefClass::Definition(def) => {
 | 
					                    NameRefClass::Definition(def) => {
 | 
				
			||||||
                        if let Definition::Local(local) = &def {
 | 
					                        if let Definition::Local(local) = &def {
 | 
				
			||||||
@ -95,11 +125,7 @@ pub(super) fn element(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
                        match def {
 | 
					                        match def {
 | 
				
			||||||
                            Definition::Local(local)
 | 
					                            Definition::Local(local)
 | 
				
			||||||
                                    if is_consumed_lvalue(
 | 
					                                if is_consumed_lvalue(name_ref.syntax(), &local, db) =>
 | 
				
			||||||
                                        name_ref.syntax().clone().into(),
 | 
					 | 
				
			||||||
                                        &local,
 | 
					 | 
				
			||||||
                                        db,
 | 
					 | 
				
			||||||
                                    ) =>
 | 
					 | 
				
			||||||
                            {
 | 
					                            {
 | 
				
			||||||
                                h |= HlMod::Consuming;
 | 
					                                h |= HlMod::Consuming;
 | 
				
			||||||
                            }
 | 
					                            }
 | 
				
			||||||
@ -113,8 +139,7 @@ pub(super) fn element(
 | 
				
			|||||||
                            Definition::Field(field) => {
 | 
					                            Definition::Field(field) => {
 | 
				
			||||||
                                if let Some(parent) = name_ref.syntax().parent() {
 | 
					                                if let Some(parent) = name_ref.syntax().parent() {
 | 
				
			||||||
                                    if matches!(parent.kind(), FIELD_EXPR | RECORD_PAT_FIELD) {
 | 
					                                    if matches!(parent.kind(), FIELD_EXPR | RECORD_PAT_FIELD) {
 | 
				
			||||||
                                            if let hir::VariantDef::Union(_) = field.parent_def(db)
 | 
					                                        if let hir::VariantDef::Union(_) = field.parent_def(db) {
 | 
				
			||||||
                                            {
 | 
					 | 
				
			||||||
                                            h |= HlMod::Unsafe;
 | 
					                                            h |= HlMod::Unsafe;
 | 
				
			||||||
                                        }
 | 
					                                        }
 | 
				
			||||||
                                    }
 | 
					                                    }
 | 
				
			||||||
@ -126,13 +151,8 @@ pub(super) fn element(
 | 
				
			|||||||
                        h
 | 
					                        h
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                    NameRefClass::FieldShorthand { .. } => SymbolKind::Field.into(),
 | 
					                    NameRefClass::FieldShorthand { .. } => SymbolKind::Field.into(),
 | 
				
			||||||
                    },
 | 
					 | 
				
			||||||
                    None if syntactic_name_ref_highlighting => {
 | 
					 | 
				
			||||||
                        highlight_name_ref_by_syntax(name_ref, sema, krate)
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    None => HlTag::UnresolvedReference.into(),
 | 
					 | 
				
			||||||
                };
 | 
					                };
 | 
				
			||||||
                if h.tag == HlTag::Symbol(SymbolKind::Module) && is_self {
 | 
					                if h.tag == HlTag::Symbol(SymbolKind::Module) && name_ref.self_token().is_some() {
 | 
				
			||||||
                    SymbolKind::SelfParam.into()
 | 
					                    SymbolKind::SelfParam.into()
 | 
				
			||||||
                } else {
 | 
					                } else {
 | 
				
			||||||
                    h
 | 
					                    h
 | 
				
			||||||
@ -172,6 +192,7 @@ pub(super) fn element(
 | 
				
			|||||||
                _ => Highlight::from(SymbolKind::LifetimeParam) | HlMod::Definition,
 | 
					                _ => Highlight::from(SymbolKind::LifetimeParam) | HlMod::Definition,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        IDENT if parent_matches::<ast::TokenTree>(&element) => HlTag::None.into(),
 | 
				
			||||||
        p if p.is_punct() => match p {
 | 
					        p if p.is_punct() => match p {
 | 
				
			||||||
            T![&] if parent_matches::<ast::BinExpr>(&element) => HlOperator::Bitwise.into(),
 | 
					            T![&] if parent_matches::<ast::BinExpr>(&element) => HlOperator::Bitwise.into(),
 | 
				
			||||||
            T![&] => {
 | 
					            T![&] => {
 | 
				
			||||||
@ -450,7 +471,7 @@ fn highlight_def(db: &RootDatabase, krate: Option<hir::Crate>, def: Definition)
 | 
				
			|||||||
    h
 | 
					    h
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn highlight_func_by_name_ref(
 | 
					fn highlight_method_call_by_name_ref(
 | 
				
			||||||
    sema: &Semantics<RootDatabase>,
 | 
					    sema: &Semantics<RootDatabase>,
 | 
				
			||||||
    krate: Option<hir::Crate>,
 | 
					    krate: Option<hir::Crate>,
 | 
				
			||||||
    name_ref: &ast::NameRef,
 | 
					    name_ref: &ast::NameRef,
 | 
				
			||||||
@ -599,13 +620,10 @@ fn highlight_name_ref_by_syntax(
 | 
				
			|||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
fn is_consumed_lvalue(
 | 
					fn is_consumed_lvalue(node: &SyntaxNode, local: &hir::Local, db: &RootDatabase) -> bool {
 | 
				
			||||||
    node: NodeOrToken<SyntaxNode, SyntaxToken>,
 | 
					 | 
				
			||||||
    local: &hir::Local,
 | 
					 | 
				
			||||||
    db: &RootDatabase,
 | 
					 | 
				
			||||||
) -> bool {
 | 
					 | 
				
			||||||
    // When lvalues are passed as arguments and they're not Copy, then mark them as Consuming.
 | 
					    // When lvalues are passed as arguments and they're not Copy, then mark them as Consuming.
 | 
				
			||||||
    parents_match(node, &[PATH_SEGMENT, PATH, PATH_EXPR, ARG_LIST]) && !local.ty(db).is_copy(db)
 | 
					    parents_match(node.clone().into(), &[PATH_SEGMENT, PATH, PATH_EXPR, ARG_LIST])
 | 
				
			||||||
 | 
					        && !local.ty(db).is_copy(db)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/// Returns true if the parent nodes of `node` all match the `SyntaxKind`s in `kinds` exactly.
 | 
					/// Returns true if the parent nodes of `node` all match the `SyntaxKind`s in `kinds` exactly.
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,7 @@ pub enum HlTag {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    Attribute,
 | 
					    Attribute,
 | 
				
			||||||
    BoolLiteral,
 | 
					    BoolLiteral,
 | 
				
			||||||
 | 
					    BuiltinAttr,
 | 
				
			||||||
    BuiltinType,
 | 
					    BuiltinType,
 | 
				
			||||||
    ByteLiteral,
 | 
					    ByteLiteral,
 | 
				
			||||||
    CharLiteral,
 | 
					    CharLiteral,
 | 
				
			||||||
@ -141,6 +142,7 @@ impl HlTag {
 | 
				
			|||||||
            },
 | 
					            },
 | 
				
			||||||
            HlTag::Attribute => "attribute",
 | 
					            HlTag::Attribute => "attribute",
 | 
				
			||||||
            HlTag::BoolLiteral => "bool_literal",
 | 
					            HlTag::BoolLiteral => "bool_literal",
 | 
				
			||||||
 | 
					            HlTag::BuiltinAttr => "builtin_attr",
 | 
				
			||||||
            HlTag::BuiltinType => "builtin_type",
 | 
					            HlTag::BuiltinType => "builtin_type",
 | 
				
			||||||
            HlTag::ByteLiteral => "byte_literal",
 | 
					            HlTag::ByteLiteral => "byte_literal",
 | 
				
			||||||
            HlTag::CharLiteral => "char_literal",
 | 
					            HlTag::CharLiteral => "char_literal",
 | 
				
			||||||
 | 
				
			|||||||
@ -70,7 +70,7 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 | 
				
			|||||||
    <span class="comment documentation">/// # Examples</span>
 | 
					    <span class="comment documentation">/// # Examples</span>
 | 
				
			||||||
    <span class="comment documentation">///</span>
 | 
					    <span class="comment documentation">///</span>
 | 
				
			||||||
    <span class="comment documentation">/// ```</span>
 | 
					    <span class="comment documentation">/// ```</span>
 | 
				
			||||||
    <span class="comment documentation">/// #</span><span class="none injected"> </span><span class="attribute attribute injected">#</span><span class="attribute attribute injected">!</span><span class="attribute attribute injected">[</span><span class="function attribute injected">allow</span><span class="parenthesis attribute injected">(</span><span class="attribute attribute injected">unused_mut</span><span class="parenthesis attribute injected">)</span><span class="attribute attribute injected">]</span>
 | 
					    <span class="comment documentation">/// #</span><span class="none injected"> </span><span class="attribute attribute injected">#</span><span class="attribute attribute injected">!</span><span class="attribute attribute injected">[</span><span class="builtin_attr attribute injected">allow</span><span class="parenthesis attribute injected">(</span><span class="none attribute injected">unused_mut</span><span class="parenthesis attribute injected">)</span><span class="attribute attribute injected">]</span>
 | 
				
			||||||
    <span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="keyword injected">mut</span><span class="none injected"> </span><span class="variable declaration injected mutable">foo</span><span class="colon injected">:</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="function injected">new</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
 | 
					    <span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="keyword injected">mut</span><span class="none injected"> </span><span class="variable declaration injected mutable">foo</span><span class="colon injected">:</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="struct injected">Foo</span><span class="operator injected">::</span><span class="function injected">new</span><span class="parenthesis injected">(</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
 | 
				
			||||||
    <span class="comment documentation">/// ```</span>
 | 
					    <span class="comment documentation">/// ```</span>
 | 
				
			||||||
    <span class="keyword">pub</span> <span class="keyword">const</span> <span class="keyword">fn</span> <span class="function associated declaration static public">new</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">-></span> <span class="struct">Foo</span> <span class="brace">{</span>
 | 
					    <span class="keyword">pub</span> <span class="keyword">const</span> <span class="keyword">fn</span> <span class="function associated declaration static public">new</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="operator">-></span> <span class="struct">Foo</span> <span class="brace">{</span>
 | 
				
			||||||
@ -140,12 +140,12 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 | 
				
			|||||||
<span class="comment documentation">///</span>
 | 
					<span class="comment documentation">///</span>
 | 
				
			||||||
<span class="comment documentation">/// ```</span>
 | 
					<span class="comment documentation">/// ```</span>
 | 
				
			||||||
<span class="comment documentation">/// </span><span class="keyword control injected">loop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="brace injected">}</span>
 | 
					<span class="comment documentation">/// </span><span class="keyword control injected">loop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="brace injected">}</span>
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">cfg_attr</span><span class="parenthesis attribute">(</span><span class="attribute attribute">not</span><span class="parenthesis attribute">(</span><span class="attribute attribute">feature </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"false"</span><span class="parenthesis attribute">)</span><span class="comma attribute">,</span><span class="attribute attribute"> doc </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"</span><span class="keyword control injected">loop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="brace injected">}</span><span class="string_literal attribute">"</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">cfg_attr</span><span class="parenthesis attribute">(</span><span class="none attribute">not</span><span class="parenthesis attribute">(</span><span class="none attribute">feature</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"false"</span><span class="parenthesis attribute">)</span><span class="comma attribute">,</span><span class="attribute attribute"> </span><span class="none attribute">doc</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"</span><span class="keyword control injected">loop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="brace injected">}</span><span class="string_literal attribute">"</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">doc</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"</span><span class="keyword control injected">loop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="brace injected">}</span><span class="string_literal attribute">"</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">doc</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"</span><span class="keyword control injected">loop</span><span class="none injected"> </span><span class="brace injected">{</span><span class="brace injected">}</span><span class="string_literal attribute">"</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="comment documentation">/// ```</span>
 | 
					<span class="comment documentation">/// ```</span>
 | 
				
			||||||
<span class="comment documentation">///</span>
 | 
					<span class="comment documentation">///</span>
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">cfg_attr</span><span class="parenthesis attribute">(</span><span class="attribute attribute">feature </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"alloc"</span><span class="comma attribute">,</span><span class="attribute attribute"> doc </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"```rust"</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">cfg_attr</span><span class="parenthesis attribute">(</span><span class="none attribute">feature</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"alloc"</span><span class="comma attribute">,</span><span class="attribute attribute"> </span><span class="none attribute">doc</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"```rust"</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">cfg_attr</span><span class="parenthesis attribute">(</span><span class="attribute attribute">not</span><span class="parenthesis attribute">(</span><span class="attribute attribute">feature </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"alloc"</span><span class="parenthesis attribute">)</span><span class="comma attribute">,</span><span class="attribute attribute"> doc </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"```ignore"</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">cfg_attr</span><span class="parenthesis attribute">(</span><span class="none attribute">not</span><span class="parenthesis attribute">(</span><span class="none attribute">feature</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"alloc"</span><span class="parenthesis attribute">)</span><span class="comma attribute">,</span><span class="attribute attribute"> </span><span class="none attribute">doc</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"```ignore"</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="punctuation injected">_</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="function injected">example</span><span class="parenthesis injected">(</span><span class="operator injected">&</span><span class="none injected">alloc::</span><span class="macro injected">vec!</span><span class="bracket injected">[</span><span class="numeric_literal injected">1</span><span class="comma injected">,</span><span class="none injected"> </span><span class="numeric_literal injected">2</span><span class="comma injected">,</span><span class="none injected"> </span><span class="numeric_literal injected">3</span><span class="bracket injected">]</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
 | 
					<span class="comment documentation">/// </span><span class="keyword injected">let</span><span class="none injected"> </span><span class="punctuation injected">_</span><span class="none injected"> </span><span class="operator injected">=</span><span class="none injected"> </span><span class="function injected">example</span><span class="parenthesis injected">(</span><span class="operator injected">&</span><span class="none injected">alloc::</span><span class="macro injected">vec!</span><span class="bracket injected">[</span><span class="numeric_literal injected">1</span><span class="comma injected">,</span><span class="none injected"> </span><span class="numeric_literal injected">2</span><span class="comma injected">,</span><span class="none injected"> </span><span class="numeric_literal injected">3</span><span class="bracket injected">]</span><span class="parenthesis injected">)</span><span class="semicolon injected">;</span>
 | 
				
			||||||
<span class="comment documentation">/// ```</span>
 | 
					<span class="comment documentation">/// ```</span>
 | 
				
			||||||
<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration public">mix_and_match</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
 | 
					<span class="keyword">pub</span> <span class="keyword">fn</span> <span class="function declaration public">mix_and_match</span><span class="parenthesis">(</span><span class="parenthesis">)</span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
 | 
				
			|||||||
@ -43,7 +43,7 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 | 
				
			|||||||
        <span class="punctuation">$</span>crate<span class="colon">:</span><span class="colon">:</span>io<span class="colon">:</span><span class="colon">:</span>_print<span class="parenthesis">(</span><span class="punctuation">$</span>crate<span class="colon">:</span><span class="colon">:</span>format_args_nl<span class="punctuation">!</span><span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>arg<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="semicolon">;</span>
 | 
					        <span class="punctuation">$</span>crate<span class="colon">:</span><span class="colon">:</span>io<span class="colon">:</span><span class="colon">:</span>_print<span class="parenthesis">(</span><span class="punctuation">$</span>crate<span class="colon">:</span><span class="colon">:</span>format_args_nl<span class="punctuation">!</span><span class="parenthesis">(</span><span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>arg<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span><span class="parenthesis">)</span><span class="semicolon">;</span>
 | 
				
			||||||
    <span class="brace">}</span><span class="parenthesis">)</span>
 | 
					    <span class="brace">}</span><span class="parenthesis">)</span>
 | 
				
			||||||
<span class="brace">}</span>
 | 
					<span class="brace">}</span>
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">rustc_builtin_macro</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">rustc_builtin_macro</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">format_args_nl</span> <span class="brace">{</span>
 | 
					<span class="keyword">macro_rules</span><span class="punctuation">!</span> <span class="macro declaration">format_args_nl</span> <span class="brace">{</span>
 | 
				
			||||||
    <span class="parenthesis">(</span><span class="punctuation">$</span>fmt<span class="colon">:</span>expr<span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">></span> <span class="brace">{</span><span class="brace">{</span> <span class="comment">/* compiler built-in */</span> <span class="brace">}</span><span class="brace">}</span><span class="semicolon">;</span>
 | 
					    <span class="parenthesis">(</span><span class="punctuation">$</span>fmt<span class="colon">:</span>expr<span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">></span> <span class="brace">{</span><span class="brace">{</span> <span class="comment">/* compiler built-in */</span> <span class="brace">}</span><span class="brace">}</span><span class="semicolon">;</span>
 | 
				
			||||||
    <span class="parenthesis">(</span><span class="punctuation">$</span>fmt<span class="colon">:</span>expr<span class="comma">,</span> <span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>args<span class="colon">:</span>tt<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">></span> <span class="brace">{</span><span class="brace">{</span> <span class="comment">/* compiler built-in */</span> <span class="brace">}</span><span class="brace">}</span><span class="semicolon">;</span>
 | 
					    <span class="parenthesis">(</span><span class="punctuation">$</span>fmt<span class="colon">:</span>expr<span class="comma">,</span> <span class="punctuation">$</span><span class="parenthesis">(</span><span class="punctuation">$</span>args<span class="colon">:</span>tt<span class="parenthesis">)</span><span class="punctuation">*</span><span class="parenthesis">)</span> <span class="operator">=</span><span class="angle">></span> <span class="brace">{</span><span class="brace">{</span> <span class="comment">/* compiler built-in */</span> <span class="brace">}</span><span class="brace">}</span><span class="semicolon">;</span>
 | 
				
			||||||
 | 
				
			|||||||
@ -57,7 +57,7 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable unsafe">global_mut</span><span class="colon">:</span> <span class="struct">TypeForStaticMut</span> <span class="operator">=</span> <span class="struct">TypeForStaticMut</span> <span class="brace">{</span> <span class="field">a</span><span class="colon">:</span> <span class="numeric_literal">0</span> <span class="brace">}</span><span class="semicolon">;</span>
 | 
					<span class="keyword">static</span> <span class="keyword">mut</span> <span class="static declaration mutable unsafe">global_mut</span><span class="colon">:</span> <span class="struct">TypeForStaticMut</span> <span class="operator">=</span> <span class="struct">TypeForStaticMut</span> <span class="brace">{</span> <span class="field">a</span><span class="colon">:</span> <span class="numeric_literal">0</span> <span class="brace">}</span><span class="semicolon">;</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">repr</span><span class="parenthesis attribute">(</span><span class="attribute attribute">packed</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">repr</span><span class="parenthesis attribute">(</span><span class="none attribute">packed</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="keyword">struct</span> <span class="struct declaration">Packed</span> <span class="brace">{</span>
 | 
					<span class="keyword">struct</span> <span class="struct declaration">Packed</span> <span class="brace">{</span>
 | 
				
			||||||
    <span class="field declaration">a</span><span class="colon">:</span> <span class="builtin_type">u16</span><span class="comma">,</span>
 | 
					    <span class="field declaration">a</span><span class="colon">:</span> <span class="builtin_type">u16</span><span class="comma">,</span>
 | 
				
			||||||
<span class="brace">}</span>
 | 
					<span class="brace">}</span>
 | 
				
			||||||
 | 
				
			|||||||
@ -41,23 +41,23 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 | 
				
			|||||||
<pre><code><span class="keyword">use</span> <span class="module">inner</span><span class="operator">::</span><span class="brace">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="module declaration">inner_mod</span><span class="brace">}</span><span class="semicolon">;</span>
 | 
					<pre><code><span class="keyword">use</span> <span class="module">inner</span><span class="operator">::</span><span class="brace">{</span><span class="self_keyword">self</span> <span class="keyword">as</span> <span class="module declaration">inner_mod</span><span class="brace">}</span><span class="semicolon">;</span>
 | 
				
			||||||
<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="brace">{</span><span class="brace">}</span>
 | 
					<span class="keyword">mod</span> <span class="module declaration">inner</span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">rustc_builtin_macro</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">rustc_builtin_macro</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="keyword">macro</span> <span class="macro declaration">Copy</span> <span class="brace">{</span><span class="brace">}</span>
 | 
					<span class="keyword">macro</span> <span class="macro declaration">Copy</span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<span class="comment">// Needed for function consuming vs normal</span>
 | 
					<span class="comment">// Needed for function consuming vs normal</span>
 | 
				
			||||||
<span class="keyword">pub</span> <span class="keyword">mod</span> <span class="module declaration public">marker</span> <span class="brace">{</span>
 | 
					<span class="keyword">pub</span> <span class="keyword">mod</span> <span class="module declaration public">marker</span> <span class="brace">{</span>
 | 
				
			||||||
    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"copy"</span><span class="attribute attribute">]</span>
 | 
					    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"copy"</span><span class="attribute attribute">]</span>
 | 
				
			||||||
    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">Copy</span> <span class="brace">{</span><span class="brace">}</span>
 | 
					    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">Copy</span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
<span class="brace">}</span>
 | 
					<span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<span class="keyword">pub</span> <span class="keyword">mod</span> <span class="module declaration public">ops</span> <span class="brace">{</span>
 | 
					<span class="keyword">pub</span> <span class="keyword">mod</span> <span class="module declaration public">ops</span> <span class="brace">{</span>
 | 
				
			||||||
    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"fn_once"</span><span class="attribute attribute">]</span>
 | 
					    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"fn_once"</span><span class="attribute attribute">]</span>
 | 
				
			||||||
    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">FnOnce</span><span class="angle"><</span><span class="type_param declaration">Args</span><span class="angle">></span> <span class="brace">{</span><span class="brace">}</span>
 | 
					    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">FnOnce</span><span class="angle"><</span><span class="type_param declaration">Args</span><span class="angle">></span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"fn_mut"</span><span class="attribute attribute">]</span>
 | 
					    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"fn_mut"</span><span class="attribute attribute">]</span>
 | 
				
			||||||
    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">FnMut</span><span class="angle"><</span><span class="type_param declaration">Args</span><span class="angle">></span><span class="colon">:</span> <span class="trait public">FnOnce</span><span class="angle"><</span><span class="type_param">Args</span><span class="angle">></span> <span class="brace">{</span><span class="brace">}</span>
 | 
					    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">FnMut</span><span class="angle"><</span><span class="type_param declaration">Args</span><span class="angle">></span><span class="colon">:</span> <span class="trait public">FnOnce</span><span class="angle"><</span><span class="type_param">Args</span><span class="angle">></span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"fn"</span><span class="attribute attribute">]</span>
 | 
					    <span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">lang</span><span class="attribute attribute"> </span><span class="operator attribute">=</span><span class="attribute attribute"> </span><span class="string_literal attribute">"fn"</span><span class="attribute attribute">]</span>
 | 
				
			||||||
    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">Fn</span><span class="angle"><</span><span class="type_param declaration">Args</span><span class="angle">></span><span class="colon">:</span> <span class="trait public">FnMut</span><span class="angle"><</span><span class="type_param">Args</span><span class="angle">></span> <span class="brace">{</span><span class="brace">}</span>
 | 
					    <span class="keyword">pub</span> <span class="keyword">trait</span> <span class="trait declaration public">Fn</span><span class="angle"><</span><span class="type_param declaration">Args</span><span class="angle">></span><span class="colon">:</span> <span class="trait public">FnMut</span><span class="angle"><</span><span class="type_param">Args</span><span class="angle">></span> <span class="brace">{</span><span class="brace">}</span>
 | 
				
			||||||
<span class="brace">}</span>
 | 
					<span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -91,7 +91,7 @@ pre                 { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
 | 
				
			|||||||
    <span class="brace">}</span>
 | 
					    <span class="brace">}</span>
 | 
				
			||||||
<span class="brace">}</span>
 | 
					<span class="brace">}</span>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="function attribute">derive</span><span class="parenthesis attribute">(</span><span class="attribute attribute">Copy</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
					<span class="attribute attribute">#</span><span class="attribute attribute">[</span><span class="builtin_attr attribute">derive</span><span class="parenthesis attribute">(</span><span class="none attribute">Copy</span><span class="parenthesis attribute">)</span><span class="attribute attribute">]</span>
 | 
				
			||||||
<span class="keyword">struct</span> <span class="struct declaration">FooCopy</span> <span class="brace">{</span>
 | 
					<span class="keyword">struct</span> <span class="struct declaration">FooCopy</span> <span class="brace">{</span>
 | 
				
			||||||
    <span class="field declaration">x</span><span class="colon">:</span> <span class="builtin_type">u32</span><span class="comma">,</span>
 | 
					    <span class="field declaration">x</span><span class="colon">:</span> <span class="builtin_type">u32</span><span class="comma">,</span>
 | 
				
			||||||
<span class="brace">}</span>
 | 
					<span class="brace">}</span>
 | 
				
			||||||
 | 
				
			|||||||
@ -378,7 +378,7 @@ fn benchmark_syntax_highlighting_parser() {
 | 
				
			|||||||
            .filter(|it| it.highlight.tag == HlTag::Symbol(SymbolKind::Function))
 | 
					            .filter(|it| it.highlight.tag == HlTag::Symbol(SymbolKind::Function))
 | 
				
			||||||
            .count()
 | 
					            .count()
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    assert_eq!(hash, 1632);
 | 
					    assert_eq!(hash, 1616);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#[test]
 | 
					#[test]
 | 
				
			||||||
 | 
				
			|||||||
@ -45,6 +45,7 @@ define_semantic_token_types![
 | 
				
			|||||||
    (BOOLEAN, "boolean"),
 | 
					    (BOOLEAN, "boolean"),
 | 
				
			||||||
    (BRACE, "brace"),
 | 
					    (BRACE, "brace"),
 | 
				
			||||||
    (BRACKET, "bracket"),
 | 
					    (BRACKET, "bracket"),
 | 
				
			||||||
 | 
					    (BUILTIN_ATTRIBUTE, "builtinAttribute"),
 | 
				
			||||||
    (BUILTIN_TYPE, "builtinType"),
 | 
					    (BUILTIN_TYPE, "builtinType"),
 | 
				
			||||||
    (CHAR, "character"),
 | 
					    (CHAR, "character"),
 | 
				
			||||||
    (COLON, "colon"),
 | 
					    (COLON, "colon"),
 | 
				
			||||||
 | 
				
			|||||||
@ -464,6 +464,7 @@ fn semantic_token_type_and_modifiers(
 | 
				
			|||||||
        },
 | 
					        },
 | 
				
			||||||
        HlTag::Attribute => semantic_tokens::ATTRIBUTE,
 | 
					        HlTag::Attribute => semantic_tokens::ATTRIBUTE,
 | 
				
			||||||
        HlTag::BoolLiteral => semantic_tokens::BOOLEAN,
 | 
					        HlTag::BoolLiteral => semantic_tokens::BOOLEAN,
 | 
				
			||||||
 | 
					        HlTag::BuiltinAttr => semantic_tokens::BUILTIN_ATTRIBUTE,
 | 
				
			||||||
        HlTag::BuiltinType => semantic_tokens::BUILTIN_TYPE,
 | 
					        HlTag::BuiltinType => semantic_tokens::BUILTIN_TYPE,
 | 
				
			||||||
        HlTag::ByteLiteral | HlTag::NumericLiteral => lsp_types::SemanticTokenType::NUMBER,
 | 
					        HlTag::ByteLiteral | HlTag::NumericLiteral => lsp_types::SemanticTokenType::NUMBER,
 | 
				
			||||||
        HlTag::CharLiteral => semantic_tokens::CHAR,
 | 
					        HlTag::CharLiteral => semantic_tokens::CHAR,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user