11use std:: sync:: Arc ;
22
33use emmylua_parser:: {
4- LuaAst , LuaAstNode , LuaClosureExpr , LuaComment , LuaDocBinaryType , LuaDocConditionalType ,
4+ LuaAst , LuaAstNode , LuaComment , LuaDocBinaryType , LuaDocConditionalType ,
55 LuaDocDescriptionOwner , LuaDocFuncType , LuaDocGenericDecl , LuaDocGenericDeclList ,
66 LuaDocGenericType , LuaDocIndexAccessType , LuaDocMappedType , LuaDocMultiLineUnionType ,
77 LuaDocObjectFieldKey , LuaDocObjectType , LuaDocStrTplType , LuaDocType , LuaDocUnaryType ,
@@ -13,8 +13,8 @@ use smol_str::SmolStr;
1313
1414use crate :: {
1515 AsyncState , DiagnosticCode , FileId , GenericParam , GenericTpl , InFiled , LuaAliasCallKind ,
16- LuaArrayLen , LuaArrayType , LuaMultiLineUnion , LuaSignatureId , LuaTupleStatus , LuaTypeDeclId ,
17- TypeOps , VariadicType , complete_type_generic_args,
16+ LuaArrayLen , LuaArrayType , LuaMultiLineUnion , LuaTupleStatus , LuaTypeDeclId , TypeOps ,
17+ VariadicType , complete_type_generic_args,
1818 db_index:: {
1919 AnalyzeError , DbIndex , LuaAliasCallType , LuaConditionalType , LuaFunctionType ,
2020 LuaGenericType , LuaIndexAccessKey , LuaIntersectionType , LuaMappedType , LuaObjectType ,
@@ -23,15 +23,15 @@ use crate::{
2323} ;
2424
2525use super :: {
26- file_generic_index:: { ConditionalInferIndex , GenericIndex } ,
26+ file_generic_index:: { ConditionalInferIndex , FileGenericIndex } ,
2727 preprocess_description,
2828} ;
2929
3030#[ derive( Debug ) ]
3131pub struct DocTypeAnalyzeContext < ' a > {
3232 pub db : & ' a mut DbIndex ,
3333 pub file_id : FileId ,
34- pub generic_index : & ' a mut dyn GenericIndex ,
34+ pub generic_index : & ' a mut FileGenericIndex ,
3535 pub workspace_id : WorkspaceId ,
3636 comment : Option < LuaComment > ,
3737 options : DocTypeAnalyzeOptions ,
@@ -70,7 +70,7 @@ impl<'a> DocTypeAnalyzeContext<'a> {
7070 pub fn new (
7171 db : & ' a mut DbIndex ,
7272 file_id : FileId ,
73- generic_index : & ' a mut dyn GenericIndex ,
73+ generic_index : & ' a mut FileGenericIndex ,
7474 workspace_id : WorkspaceId ,
7575 ) -> Self {
7676 Self {
@@ -109,70 +109,6 @@ impl<'a> DocTypeAnalyzeContext<'a> {
109109 . add_type_reference ( self . file_id , type_id, range) ;
110110 }
111111 }
112-
113- // TODO: 为`std.ConstTpl`实现的兼容性代码, 应在下一版本中移除
114- fn mark_generic_const ( & mut self , tpl : & GenericTpl ) -> GenericTpl {
115- let tpl_id = tpl. get_tpl_id ( ) ;
116- let param = self
117- . generic_index
118- . mark_generic_const ( tpl_id)
119- . unwrap_or_else ( || {
120- let mut param = tpl. get_param ( ) . clone ( ) ;
121- param. is_const = true ;
122- param
123- } ) ;
124-
125- if tpl_id. is_func ( )
126- && let Some ( signature_id) = self . current_signature_id ( )
127- && let Some ( signature) = self . db . get_signature_index_mut ( ) . get_mut ( & signature_id)
128- {
129- if let Some ( signature_param) = signature. generic_params . get_mut ( tpl_id. get_idx ( ) ) {
130- signature_param. is_const = true ;
131- }
132-
133- for overload in & mut signature. overloads {
134- let mut generic_params = overload. get_generic_params ( ) . to_vec ( ) ;
135- let mut changed = false ;
136- for generic_param in & mut generic_params {
137- if generic_param. get_tpl_id ( ) == tpl_id && !generic_param. is_const ( ) {
138- * generic_param = generic_param. with_const ( true ) ;
139- changed = true ;
140- }
141- }
142-
143- if changed {
144- * overload = Arc :: new ( LuaFunctionType :: new (
145- overload. get_async_state ( ) ,
146- overload. is_colon_define ( ) ,
147- overload. is_variadic ( ) ,
148- overload. get_params ( ) . to_vec ( ) ,
149- overload. get_ret ( ) . clone ( ) ,
150- Some ( generic_params) ,
151- ) ) ;
152- }
153- }
154- }
155-
156- GenericTpl :: new (
157- tpl_id,
158- param. name ,
159- param. constraint ,
160- param. default ,
161- true ,
162- param. attributes ,
163- )
164- }
165-
166- fn current_signature_id ( & self ) -> Option < LuaSignatureId > {
167- let owner = self . comment . as_ref ( ) ?. get_owner ( ) ?;
168- let closure = match owner {
169- LuaAst :: LuaFuncStat ( func) => func. get_closure ( ) ,
170- LuaAst :: LuaLocalFuncStat ( local_func) => local_func. get_closure ( ) ,
171- owner => owner. descendants :: < LuaClosureExpr > ( ) . next ( ) ,
172- } ?;
173-
174- Some ( LuaSignatureId :: from_closure ( self . file_id , & closure) )
175- }
176112}
177113
178114pub fn infer_type ( analyzer : & mut DocTypeAnalyzeContext < ' _ > , node : LuaDocType ) -> LuaType {
@@ -541,14 +477,6 @@ fn infer_special_generic_type(
541477
542478 return Some ( LuaType :: TypeGuard ( first_param. into ( ) ) ) ;
543479 }
544- "std.ConstTpl" => {
545- let first_doc_param_type = generic_type. get_generic_types ( ) ?. get_types ( ) . next ( ) ?;
546- let first_param = infer_type ( analyzer, first_doc_param_type) ;
547- if let LuaType :: TplRef ( tpl) = first_param {
548- let const_tpl = analyzer. mark_generic_const ( & tpl) ;
549- return Some ( LuaType :: TplRef ( Arc :: new ( const_tpl) ) ) ;
550- }
551- }
552480 "Language" => {
553481 let first_doc_param_type = generic_type. get_generic_types ( ) ?. get_types ( ) . next ( ) ?;
554482 let first_param = infer_type ( analyzer, first_doc_param_type) ;
@@ -790,35 +718,52 @@ fn register_inline_func_generics(
790718 . generic_index
791719 . add_generic_scope ( vec ! [ func. get_range( ) ] , true ) ;
792720 let mut generic_params = Vec :: new ( ) ;
793- for param in generic_list. get_generic_decl ( ) {
794- let Some ( name_token) = param. get_name_token ( ) else {
721+ let mut declared_params = Vec :: new ( ) ;
722+ for generic_decl in generic_list. get_generic_decl ( ) {
723+ let Some ( name_token) = generic_decl. get_name_token ( ) else {
795724 continue ;
796725 } ;
797726
798- let constraint = param
727+ let placeholder = GenericParam :: new (
728+ SmolStr :: new ( name_token. get_name_text ( ) ) ,
729+ None ,
730+ None ,
731+ generic_decl. has_const_modifier ( ) ,
732+ None ,
733+ ) ;
734+ if let Some ( tpl_id) = analyzer
735+ . generic_index
736+ . append_generic_param ( scope_id, placeholder. clone ( ) )
737+ {
738+ declared_params. push ( ( tpl_id, generic_decl, placeholder. name ) ) ;
739+ }
740+ }
741+
742+ for ( tpl_id, generic_decl, name) in declared_params {
743+ let constraint = generic_decl
799744 . get_constraint_type ( )
800745 . map ( |ty| infer_type ( analyzer, ty) ) ;
801- let default_type = param. get_default_type ( ) . map ( |ty| infer_type ( analyzer, ty) ) ;
746+ let default_type = generic_decl
747+ . get_default_type ( )
748+ . map ( |ty| infer_type ( analyzer, ty) ) ;
802749 let generic_param = GenericParam :: new (
803- SmolStr :: new ( name_token . get_name_text ( ) ) ,
750+ name ,
804751 constraint,
805752 default_type,
806- param . has_const_modifier ( ) ,
753+ generic_decl . has_const_modifier ( ) ,
807754 None ,
808755 ) ;
809- if let Some ( tpl_id ) = analyzer
756+ let _ = analyzer
810757 . generic_index
811- . append_generic_param ( scope_id, generic_param. clone ( ) )
812- {
813- generic_params. push ( GenericTpl :: new (
814- tpl_id,
815- generic_param. name ,
816- generic_param. constraint ,
817- generic_param. default ,
818- generic_param. is_const ,
819- generic_param. attributes ,
820- ) ) ;
821- }
758+ . update_generic_param ( tpl_id, generic_param. clone ( ) ) ;
759+ generic_params. push ( GenericTpl :: new (
760+ tpl_id,
761+ generic_param. name ,
762+ generic_param. constraint ,
763+ generic_param. default ,
764+ generic_param. is_const ,
765+ generic_param. attributes ,
766+ ) ) ;
822767 }
823768 generic_params
824769}
0 commit comments