}
};
- match name_kind {
+ let h = match name_kind {
Some(name_kind) => highlight_name(db, name_kind),
None => highlight_name_by_syntax(name),
- }
+ };
+ h | HighlightModifier::Definition
}
// Highlight references like the definitions they resolve to
// Simple token-based highlighting
COMMENT => HighlightTag::Comment.into(),
- STRING | RAW_STRING | RAW_BYTE_STRING | BYTE_STRING => HighlightTag::LiteralString.into(),
+ STRING | RAW_STRING | RAW_BYTE_STRING | BYTE_STRING => HighlightTag::StringLiteral.into(),
ATTR => HighlightTag::Attribute.into(),
- INT_NUMBER | FLOAT_NUMBER => HighlightTag::LiteralNumeric.into(),
- BYTE => HighlightTag::LiteralByte.into(),
- CHAR => HighlightTag::LiteralChar.into(),
- LIFETIME => HighlightTag::TypeLifetime.into(),
+ INT_NUMBER | FLOAT_NUMBER => HighlightTag::NumericLiteral.into(),
+ BYTE => HighlightTag::ByteLiteral.into(),
+ CHAR => HighlightTag::CharLiteral.into(),
+ // FIXME: set Declaration for decls
+ LIFETIME => HighlightTag::Lifetime.into(),
k if k.is_keyword() => {
let h = Highlight::new(HighlightTag::Keyword);
hir::ModuleDef::Adt(hir::Adt::Struct(_)) => HighlightTag::Struct,
hir::ModuleDef::Adt(hir::Adt::Enum(_)) => HighlightTag::Enum,
hir::ModuleDef::Adt(hir::Adt::Union(_)) => HighlightTag::Union,
- hir::ModuleDef::EnumVariant(_) => HighlightTag::Constant,
+ hir::ModuleDef::EnumVariant(_) => HighlightTag::EnumVariant,
hir::ModuleDef::Const(_) => HighlightTag::Constant,
- hir::ModuleDef::Static(_) => HighlightTag::Constant,
+ hir::ModuleDef::Static(_) => HighlightTag::Static,
hir::ModuleDef::Trait(_) => HighlightTag::Trait,
hir::ModuleDef::TypeAlias(_) => HighlightTag::TypeAlias,
hir::ModuleDef::BuiltinType(_) => HighlightTag::BuiltinType,
},
- NameDefinition::SelfType(_) => HighlightTag::TypeSelf,
+ NameDefinition::SelfType(_) => HighlightTag::SelfType,
NameDefinition::TypeParam(_) => HighlightTag::TypeParam,
+ // FIXME: distinguish between locals and parameters
NameDefinition::Local(local) => {
- let mut h = Highlight::new(HighlightTag::Variable);
+ let mut h = Highlight::new(HighlightTag::Local);
if local.is_mut(db) || local.ty(db).is_mutable_reference() {
h |= HighlightModifier::Mutable;
}
match parent.kind() {
STRUCT_DEF => HighlightTag::Struct.into(),
ENUM_DEF => HighlightTag::Enum.into(),
+ UNION_KW => HighlightTag::Union.into(),
TRAIT_DEF => HighlightTag::Trait.into(),
TYPE_ALIAS_DEF => HighlightTag::TypeAlias.into(),
TYPE_PARAM => HighlightTag::TypeParam.into(),
if let Some(range) = literal.open_quote_text_range() {
acc.push(HighlightedRange {
range,
- highlight: HighlightTag::LiteralString.into(),
+ highlight: HighlightTag::StringLiteral.into(),
binding_hash: None,
})
}
if let Some(range) = literal.close_quote_text_range() {
acc.push(HighlightedRange {
range,
- highlight: HighlightTag::LiteralString.into(),
+ highlight: HighlightTag::StringLiteral.into(),
binding_hash: None,
})
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub enum HighlightTag {
- Struct,
- Enum,
- Union,
- Trait,
- TypeAlias,
+ Attribute,
BuiltinType,
-
+ ByteLiteral,
+ CharLiteral,
+ Comment,
+ Constant,
+ Enum,
+ EnumVariant,
Field,
Function,
- Module,
- Constant,
+ Keyword,
+ Lifetime,
Macro,
- Variable,
-
- TypeSelf,
+ Module,
+ NumericLiteral,
+ SelfType,
+ Static,
+ StringLiteral,
+ Struct,
+ Trait,
+ TypeAlias,
TypeParam,
- TypeLifetime,
-
- LiteralByte,
- LiteralNumeric,
- LiteralChar,
-
- Comment,
- LiteralString,
- Attribute,
-
- Keyword,
+ Union,
+ Local,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[repr(u8)]
pub enum HighlightModifier {
- Mutable = 0,
- Unsafe,
/// Used with keywords like `if` and `break`.
- Control,
+ Control = 0,
+ /// `foo` in `fn foo(x: i32)` is a definition, `foo` in `foo(90 + 2)` is
+ /// not.
+ Definition,
+ Mutable,
+ Unsafe,
}
impl HighlightTag {
fn as_str(self) -> &'static str {
match self {
- HighlightTag::Struct => "struct",
- HighlightTag::Enum => "enum",
- HighlightTag::Union => "union",
- HighlightTag::Trait => "trait",
- HighlightTag::TypeAlias => "type_alias",
+ HighlightTag::Attribute => "attribute",
HighlightTag::BuiltinType => "builtin_type",
-
+ HighlightTag::ByteLiteral => "byte_literal",
+ HighlightTag::CharLiteral => "char_literal",
+ HighlightTag::Comment => "comment",
+ HighlightTag::Constant => "constant",
+ HighlightTag::Enum => "enum",
+ HighlightTag::EnumVariant => "enum_variant",
HighlightTag::Field => "field",
HighlightTag::Function => "function",
- HighlightTag::Module => "module",
- HighlightTag::Constant => "constant",
- HighlightTag::Macro => "macro",
- HighlightTag::Variable => "variable",
- HighlightTag::TypeSelf => "type.self",
- HighlightTag::TypeParam => "type.param",
- HighlightTag::TypeLifetime => "type.lifetime",
- HighlightTag::LiteralByte => "literal.byte",
- HighlightTag::LiteralNumeric => "literal.numeric",
- HighlightTag::LiteralChar => "literal.char",
- HighlightTag::Comment => "comment",
- HighlightTag::LiteralString => "string",
- HighlightTag::Attribute => "attribute",
HighlightTag::Keyword => "keyword",
+ HighlightTag::Lifetime => "lifetime",
+ HighlightTag::Macro => "macro",
+ HighlightTag::Module => "module",
+ HighlightTag::NumericLiteral => "numeric_literal",
+ HighlightTag::SelfType => "self_type",
+ HighlightTag::Static => "static",
+ HighlightTag::StringLiteral => "string",
+ HighlightTag::Struct => "struct",
+ HighlightTag::Trait => "trait",
+ HighlightTag::TypeAlias => "type_alias",
+ HighlightTag::TypeParam => "type_param",
+ HighlightTag::Union => "union",
+ HighlightTag::Local => "variable",
}
}
}
fn as_str(self) -> &'static str {
match self {
+ HighlightModifier::Control => "control",
+ HighlightModifier::Definition => "declaration",
HighlightModifier::Mutable => "mutable",
HighlightModifier::Unsafe => "unsafe",
- HighlightModifier::Control => "control",
}
}
use crate::{
req,
- semantic_tokens::{self, ModifierSet, BUILTIN, CONSTANT, CONTROL, MUTABLE, UNSAFE},
+ semantic_tokens::{self, ModifierSet, CONSTANT, CONTROL, MUTABLE, UNSAFE},
world::WorldSnapshot,
Result,
};
-use semantic_tokens::ATTRIBUTE;
+use semantic_tokens::{ATTRIBUTE, BUILTIN_TYPE, ENUM_MEMBER, LIFETIME, TYPE_ALIAS, UNION};
pub trait Conv {
type Output;
fn conv(self) -> Self::Output {
let mut mods = ModifierSet::default();
let type_ = match self.tag {
- HighlightTag::Struct
- | HighlightTag::Enum
- | HighlightTag::Union
- | HighlightTag::TypeAlias
- | HighlightTag::Trait
- | HighlightTag::BuiltinType => SemanticTokenType::TYPE,
+ HighlightTag::Struct => SemanticTokenType::STRUCT,
+ HighlightTag::Enum => SemanticTokenType::ENUM,
+ HighlightTag::Union => UNION,
+ HighlightTag::TypeAlias => TYPE_ALIAS,
+ HighlightTag::Trait => SemanticTokenType::INTERFACE,
+ HighlightTag::BuiltinType => BUILTIN_TYPE,
+ HighlightTag::SelfType => SemanticTokenType::TYPE,
HighlightTag::Field => SemanticTokenType::MEMBER,
HighlightTag::Function => SemanticTokenType::FUNCTION,
HighlightTag::Module => SemanticTokenType::NAMESPACE,
HighlightTag::Constant => {
+ mods |= CONSTANT;
mods |= SemanticTokenModifier::STATIC;
- mods |= SemanticTokenModifier::READONLY;
- CONSTANT
+ SemanticTokenType::VARIABLE
}
- HighlightTag::Macro => SemanticTokenType::MACRO,
- HighlightTag::Variable => SemanticTokenType::VARIABLE,
- HighlightTag::TypeSelf => {
- mods |= SemanticTokenModifier::REFERENCE;
- SemanticTokenType::TYPE
+ HighlightTag::Static => {
+ mods |= SemanticTokenModifier::STATIC;
+ SemanticTokenType::VARIABLE
}
+ HighlightTag::EnumVariant => ENUM_MEMBER,
+ HighlightTag::Macro => SemanticTokenType::MACRO,
+ HighlightTag::Local => SemanticTokenType::VARIABLE,
HighlightTag::TypeParam => SemanticTokenType::TYPE_PARAMETER,
- HighlightTag::TypeLifetime => {
- mods |= SemanticTokenModifier::REFERENCE;
- SemanticTokenType::LABEL
- }
- HighlightTag::LiteralByte => SemanticTokenType::NUMBER,
- HighlightTag::LiteralNumeric => SemanticTokenType::NUMBER,
- HighlightTag::LiteralChar => SemanticTokenType::NUMBER,
+ HighlightTag::Lifetime => LIFETIME,
+ HighlightTag::ByteLiteral | HighlightTag::NumericLiteral => SemanticTokenType::NUMBER,
+ HighlightTag::CharLiteral | HighlightTag::StringLiteral => SemanticTokenType::STRING,
HighlightTag::Comment => SemanticTokenType::COMMENT,
- HighlightTag::LiteralString => SemanticTokenType::STRING,
HighlightTag::Attribute => ATTRIBUTE,
HighlightTag::Keyword => SemanticTokenType::KEYWORD,
};
for modifier in self.modifiers.iter() {
let modifier = match modifier {
+ HighlightModifier::Definition => SemanticTokenModifier::DECLARATION,
+ HighlightModifier::Control => CONTROL,
HighlightModifier::Mutable => MUTABLE,
HighlightModifier::Unsafe => UNSAFE,
- HighlightModifier::Control => CONTROL,
};
mods |= modifier;
}
use lsp_types::{Range, SemanticToken, SemanticTokenModifier, SemanticTokenType};
pub(crate) const ATTRIBUTE: SemanticTokenType = SemanticTokenType::new("attribute");
-pub(crate) const CONSTANT: SemanticTokenType = SemanticTokenType::new("constant");
+pub(crate) const BUILTIN_TYPE: SemanticTokenType = SemanticTokenType::new("builtinType");
+pub(crate) const ENUM_MEMBER: SemanticTokenType = SemanticTokenType::new("enumMember");
+pub(crate) const LIFETIME: SemanticTokenType = SemanticTokenType::new("lifetime");
+pub(crate) const TYPE_ALIAS: SemanticTokenType = SemanticTokenType::new("typeAlias");
+pub(crate) const UNION: SemanticTokenType = SemanticTokenType::new("union");
+pub(crate) const CONSTANT: SemanticTokenModifier = SemanticTokenModifier::new("constant");
+pub(crate) const CONTROL: SemanticTokenModifier = SemanticTokenModifier::new("control");
pub(crate) const MUTABLE: SemanticTokenModifier = SemanticTokenModifier::new("mutable");
pub(crate) const UNSAFE: SemanticTokenModifier = SemanticTokenModifier::new("unsafe");
-pub(crate) const CONTROL: SemanticTokenModifier = SemanticTokenModifier::new("control");
pub(crate) const SUPPORTED_TYPES: &[SemanticTokenType] = &[
SemanticTokenType::COMMENT,
SemanticTokenType::PARAMETER,
SemanticTokenType::LABEL,
ATTRIBUTE,
- CONSTANT,
+ BUILTIN_TYPE,
+ ENUM_MEMBER,
+ LIFETIME,
+ TYPE_ALIAS,
+ UNION,
];
pub(crate) const SUPPORTED_MODIFIERS: &[SemanticTokenModifier] = &[
SemanticTokenModifier::ASYNC,
SemanticTokenModifier::VOLATILE,
SemanticTokenModifier::READONLY,
+ CONSTANT,
MUTABLE,
UNSAFE,
CONTROL,
],
"semanticTokenTypes": [
{
- "id": "attribute"
+ "id": "attribute",
+ "description": "Style for attributes"
},
{
- "id": "constant"
+ "id": "builtinType",
+ "description": "Style for builtin types"
+ },
+ {
+ "id": "lifetime",
+ "description": "Style for lifetimes"
+ },
+ {
+ "id": "typeAlias",
+ "description": "Style for type aliases"
+ },
+ {
+ "id": "union",
+ "description": "Style for C-style untagged unions"
}
],
"semanticTokenModifiers": [
{
- "id": "mutable"
+ "id": "constant",
+ "description": "Style for compile-time constants"
},
{
- "id": "unsafe"
+ "id": "control",
+ "description": "Style for control flow keywords"
},
{
- "id": "control"
+ "id": "mutable",
+ "description": "Style for mutable bindings"
+ },
+ {
+ "id": "unsafe",
+ "description": "Style for unsafe operations"
}
],
"semanticTokenStyleDefaults": [
]
},
{
- "selector": "*.mutable",
- "light": {
- "fontStyle": "underline"
- },
- "dark": {
- "fontStyle": "underline"
- },
- "highContrast": {
- "fontStyle": "underline"
- }
+ "selector": "builtinType",
+ "scope": [
+ "support.type.primitive"
+ ]
},
{
- "selector": "constant",
+ "selector": "lifetime",
"scope": [
- "entity.name.constant"
+ "entity.name.lifetime.rust"
+ ]
+ },
+ {
+ "selector": "typeAlias",
+ "scope": [
+ "entity.name.type",
+ "entity.name.typeAlias"
+ ]
+ },
+ {
+ "selector": "union",
+ "scope": [
+ "entity.name.type",
+ "entity.name.union"
]
},
{
"scope": [
"keyword.other.unsafe"
]
+ },
+ {
+ "selector": "keyword.control",
+ "scope": [
+ "keyword.control"
+ ]
+ },
+ {
+ "selector": "variable.constant",
+ "scope": [
+ "entity.name.constant"
+ ]
+ },
+ {
+ "selector": "*.mutable",
+ "light": {
+ "fontStyle": "underline"
+ },
+ "dark": {
+ "fontStyle": "underline"
+ },
+ "highContrast": {
+ "fontStyle": "underline"
+ }
}
]
}