Skip to content

Commit 8e3901f

Browse files
committed
fix(semantic-token): highlight mapped alias type parameters
1 parent 675eef4 commit 8e3901f

2 files changed

Lines changed: 35 additions & 3 deletions

File tree

crates/emmylua_ls/src/handlers/semantic_token/build_semantic_tokens.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use emmylua_code_analysis::{
1111
};
1212
use emmylua_parser::{
1313
LuaAst, LuaAstNode, LuaAstToken, LuaCallArgList, LuaCallExpr, LuaComment, LuaDocFieldKey,
14-
LuaDocGenericDecl, LuaDocGenericDeclList, LuaDocObjectFieldKey, LuaExpr, LuaGeneralToken,
15-
LuaKind, LuaLiteralToken, LuaNameToken, LuaSyntaxKind, LuaSyntaxNode, LuaSyntaxToken,
16-
LuaTokenKind, LuaVarExpr,
14+
LuaDocGenericDecl, LuaDocGenericDeclList, LuaDocMappedKey, LuaDocObjectFieldKey, LuaExpr,
15+
LuaGeneralToken, LuaKind, LuaLiteralToken, LuaNameToken, LuaSyntaxKind, LuaSyntaxNode,
16+
LuaSyntaxToken, LuaTokenKind, LuaVarExpr,
1717
};
1818
use emmylua_parser_desc::{CodeBlockHighlightKind, DescItem, DescItemKind};
1919
use lsp_types::SemanticToken;
@@ -342,6 +342,17 @@ fn build_node_semantic_token(
342342
if let Some(generic_decl_list) = doc_alias.get_generic_decl_list() {
343343
render_type_parameter_list(builder, &generic_decl_list);
344344
}
345+
if let Some(alias_type) = doc_alias.get_type() {
346+
for mapped_key in alias_type
347+
.syntax()
348+
.descendants()
349+
.filter_map(LuaDocMappedKey::cast)
350+
{
351+
if let Some(type_decl) = mapped_key.child::<LuaDocGenericDecl>() {
352+
render_type_parameter(builder, &type_decl);
353+
}
354+
}
355+
}
345356
}
346357
LuaAst::LuaDocTagField(doc_field) => {
347358
if let Some(LuaDocFieldKey::Name(name)) = doc_field.get_field_key() {

crates/emmylua_ls/src/handlers/test/semantic_token_test.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,27 @@ m.foo()
105105
Ok(())
106106
}
107107

108+
#[gtest]
109+
fn test_mapped_type_parameter_is_highlighted() -> Result<()> {
110+
let mut ws = ProviderVirtualWorkspace::new();
111+
let data = ws.get_semantic_token_data(
112+
r#"---@alias Pick<T, K> {[P in K]: T[P];}
113+
"#,
114+
)?;
115+
let tokens = decode(&data);
116+
let typ = SemanticTokenTypeKind::Type.to_u32();
117+
let declaration = SemanticTokenModifierKind::DECLARATION.to_u32();
118+
119+
verify_that!(
120+
&tokens,
121+
all![
122+
contains(eq(&(0, 23, 1, typ, declaration))),
123+
contains(eq(&(0, 34, 1, typ, 0))),
124+
]
125+
)?;
126+
Ok(())
127+
}
128+
108129
#[gtest]
109130
fn test_local_function() -> Result<()> {
110131
let mut ws = ProviderVirtualWorkspace::new();

0 commit comments

Comments
 (0)