@@ -12,8 +12,9 @@ use emmylua_code_analysis::{
1212} ;
1313use 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} ;
1819use emmylua_parser_desc:: { CodeBlockHighlightKind , DescItem , DescItemKind } ;
1920use 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+ }
0 commit comments