Skip to content

Commit 10a4548

Browse files
committed
update semantic_tokens
1 parent a6ffe9c commit 10a4548

File tree

3 files changed

+44
-28
lines changed

3 files changed

+44
-28
lines changed

crates/emmylua_code_analysis/src/compilation/analyzer/doc/infer_type.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ pub fn infer_type(analyzer: &mut DocAnalyzer, node: LuaDocType) -> LuaType {
115115
return infer_conditional_type(analyzer, cond_type);
116116
}
117117
LuaDocType::Infer(infer_type) => {
118-
if let Some(name) = infer_type.get_name_text() {
118+
if let Some(name) = infer_type.get_generic_decl_name_text() {
119119
return LuaType::ConditionalInfer(ArcIntern::new(SmolStr::new(&name)));
120120
}
121121
}
@@ -691,7 +691,7 @@ fn collect_cond_infer_params(doc_type: &LuaDocType) -> Vec<GenericParam> {
691691
let mut params = Vec::new();
692692
let doc_infer_types = doc_type.descendants::<LuaDocInferType>();
693693
for infer_type in doc_infer_types {
694-
if let Some(name) = infer_type.get_name_text() {
694+
if let Some(name) = infer_type.get_generic_decl_name_text() {
695695
params.push(GenericParam::new(SmolStr::new(&name), None));
696696
}
697697
}

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

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ use emmylua_code_analysis::{
1212
};
1313
use emmylua_parser::{
1414
LuaAst, LuaAstNode, LuaAstToken, LuaCallArgList, LuaCallExpr, LuaComment, LuaDocFieldKey,
15-
LuaDocObjectFieldKey, LuaExpr, LuaGeneralToken, LuaKind, LuaLiteralToken, LuaNameToken,
16-
LuaSyntaxKind, LuaSyntaxNode, LuaSyntaxToken, LuaTokenKind, LuaVarExpr,
15+
LuaDocGenericDecl, LuaDocGenericDeclList, LuaDocObjectFieldKey, LuaExpr, LuaGeneralToken,
16+
LuaKind, LuaLiteralToken, LuaNameToken, LuaSyntaxKind, LuaSyntaxNode, LuaSyntaxToken,
17+
LuaTokenKind, LuaVarExpr,
1718
};
1819
use emmylua_parser_desc::{CodeBlockHighlightKind, DescItem, DescItemKind};
1920
use lsp_types::{SemanticToken, SemanticTokenModifier, SemanticTokenType};
@@ -313,15 +314,7 @@ fn build_node_semantic_token(
313314
}
314315
}
315316
if let Some(generic_list) = doc_class.get_generic_decl() {
316-
for generic_decl in generic_list.get_generic_decl() {
317-
if let Some(name) = generic_decl.get_name_token() {
318-
builder.push_with_modifier(
319-
name.syntax(),
320-
SemanticTokenType::CLASS,
321-
SemanticTokenModifier::DECLARATION,
322-
);
323-
}
324-
}
317+
render_type_parameter_list(builder, &generic_list);
325318
}
326319
}
327320
LuaAst::LuaDocTagEnum(doc_enum) => {
@@ -344,6 +337,9 @@ fn build_node_semantic_token(
344337
SemanticTokenType::TYPE,
345338
SemanticTokenModifier::DECLARATION,
346339
);
340+
if let Some(generic_decl_list) = doc_alias.get_generic_decl_list() {
341+
render_type_parameter_list(builder, &generic_decl_list);
342+
}
347343
}
348344
LuaAst::LuaDocTagField(doc_field) => {
349345
if let Some(LuaDocFieldKey::Name(name)) = doc_field.get_field_key() {
@@ -416,15 +412,7 @@ fn build_node_semantic_token(
416412
}
417413
LuaAst::LuaDocTagGeneric(doc_generic) => {
418414
let type_parameter_list = doc_generic.get_generic_decl_list()?;
419-
for type_decl in type_parameter_list.get_generic_decl() {
420-
if let Some(name) = type_decl.get_name_token() {
421-
builder.push_with_modifier(
422-
name.syntax(),
423-
SemanticTokenType::TYPE,
424-
SemanticTokenModifier::DECLARATION,
425-
);
426-
}
427-
}
415+
render_type_parameter_list(builder, &type_parameter_list);
428416
}
429417
LuaAst::LuaDocTagNamespace(doc_namespace) => {
430418
let name = doc_namespace.get_name_token()?;
@@ -784,6 +772,18 @@ fn build_node_semantic_token(
784772
fun_string_highlight(builder, semantic_model, call_expr, &string_token);
785773
}
786774
}
775+
LuaAst::LuaDocInferType(infer_type) => {
776+
// 推断出的泛型定义
777+
if let Some(gen_decl) = infer_type.get_generic_decl() {
778+
render_type_parameter(builder, &gen_decl);
779+
}
780+
if let Some(name) = infer_type.token::<LuaNameToken>() {
781+
// 应该单独设置颜色
782+
if name.get_name_text() == "infer" {
783+
builder.push(name.syntax(), SemanticTokenType::COMMENT);
784+
}
785+
}
786+
}
787787
_ => {}
788788
}
789789

@@ -1159,3 +1159,22 @@ fn check_require_decl(semantic_model: &SemanticModel, decl: &LuaDecl) -> Option<
11591159
}
11601160
None
11611161
}
1162+
1163+
fn render_type_parameter_list(
1164+
builder: &mut SemanticBuilder,
1165+
type_parameter_list: &LuaDocGenericDeclList,
1166+
) {
1167+
for type_decl in type_parameter_list.get_generic_decl() {
1168+
render_type_parameter(builder, &type_decl);
1169+
}
1170+
}
1171+
1172+
fn render_type_parameter(builder: &mut SemanticBuilder, type_decl: &LuaDocGenericDecl) {
1173+
if let Some(name) = type_decl.get_name_token() {
1174+
builder.push_with_modifier(
1175+
name.syntax(),
1176+
SemanticTokenType::TYPE,
1177+
SemanticTokenModifier::DECLARATION,
1178+
);
1179+
}
1180+
}

crates/emmylua_parser/src/syntax/node/doc/types.rs

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -199,12 +199,9 @@ impl LuaDocInferType {
199199
self.child()
200200
}
201201

202-
pub fn get_name_token(&self) -> Option<LuaNameToken> {
203-
self.get_generic_decl()?.get_name_token()
204-
}
205-
206-
pub fn get_name_text(&self) -> Option<String> {
207-
self.get_name_token()
202+
pub fn get_generic_decl_name_text(&self) -> Option<String> {
203+
self.get_generic_decl()?
204+
.get_name_token()
208205
.map(|it| it.get_name_text().to_string())
209206
}
210207
}

0 commit comments

Comments
 (0)