|
1 | 1 | use emmylua_parser::LuaAstNode; |
2 | 2 |
|
3 | 3 | use crate::{ |
4 | | - infer_expr, DbIndex, FileId, InFiled, InferFailReason, LuaDeclExtra, LuaDeclId, |
5 | | - LuaDocParamInfo, LuaDocReturnInfo, LuaInferCache, LuaSemanticDeclId, LuaType, LuaTypeCache, |
6 | | - SignatureReturnStatus, |
| 4 | + infer_expr, DbIndex, FileId, InFiled, InferFailReason, LuaDocReturnInfo, LuaInferCache, |
| 5 | + LuaSemanticDeclId, LuaType, LuaTypeCache, SignatureReturnStatus, |
7 | 6 | }; |
8 | 7 |
|
9 | 8 | use super::{infer_manager::InferCacheManager, UnResolve}; |
@@ -44,53 +43,68 @@ pub fn check_reach_reason( |
44 | 43 | } |
45 | 44 | } |
46 | 45 |
|
47 | | -pub fn resolve_all_reason<F>( |
| 46 | +pub fn resolve_all_reason( |
48 | 47 | db: &mut DbIndex, |
49 | 48 | infer_manager: &mut InferCacheManager, |
50 | 49 | unresolves: &mut Vec<UnResolve>, |
51 | | - resolve_fn: F, |
52 | | -) where |
53 | | - F: Fn(&mut DbIndex, &mut LuaInferCache, &mut InferFailReason) -> Option<()>, |
54 | | -{ |
| 50 | +) { |
55 | 51 | for unresolve in unresolves.iter_mut() { |
56 | 52 | let file_id = unresolve.get_file_id().unwrap_or(FileId { id: 0 }); |
57 | 53 | let cache = infer_manager.get_infer_cache(file_id); |
| 54 | + let mut need_remove = Some(false); |
58 | 55 | match unresolve { |
59 | 56 | UnResolve::Decl(un_resolve_decl) => { |
60 | | - resolve_fn(db, cache, &mut un_resolve_decl.reason); |
| 57 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_decl.reason); |
61 | 58 | } |
62 | 59 | UnResolve::Member(ref mut un_resolve_member) => { |
63 | | - resolve_fn(db, cache, &mut un_resolve_member.reason); |
| 60 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_member.reason); |
64 | 61 | } |
65 | 62 | UnResolve::Module(un_resolve_module) => { |
66 | | - resolve_fn(db, cache, &mut un_resolve_module.reason); |
| 63 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_module.reason); |
67 | 64 | } |
68 | 65 | UnResolve::Return(un_resolve_return) => { |
69 | | - resolve_fn(db, cache, &mut un_resolve_return.reason); |
| 66 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_return.reason); |
70 | 67 | } |
71 | 68 | UnResolve::IterDecl(un_resolve_iter_var) => { |
72 | | - resolve_fn(db, cache, &mut un_resolve_iter_var.reason); |
| 69 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_iter_var.reason); |
73 | 70 | } |
74 | | - _ => continue, |
| 71 | + UnResolve::ClosureParams(un_resolve_call_closure_params) => { |
| 72 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_call_closure_params.reason); |
| 73 | + } |
| 74 | + UnResolve::ClosureReturn(un_resolve_closure_return) => { |
| 75 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_closure_return.reason); |
| 76 | + } |
| 77 | + UnResolve::ClosureParentParams(un_resolve_parent_closure_params) => { |
| 78 | + need_remove = |
| 79 | + resolve_as_any(db, cache, &mut un_resolve_parent_closure_params.reason); |
| 80 | + } |
| 81 | + UnResolve::ModuleRef(un_resolve_module_ref) => { |
| 82 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_module_ref.reason); |
| 83 | + } |
| 84 | + UnResolve::TableField(un_resolve_table_field) => { |
| 85 | + need_remove = resolve_as_any(db, cache, &mut un_resolve_table_field.reason); |
| 86 | + } |
| 87 | + UnResolve::None => {} |
75 | 88 | }; |
| 89 | + |
| 90 | + if need_remove.unwrap_or(false) { |
| 91 | + *unresolve = UnResolve::None; |
| 92 | + } |
76 | 93 | } |
77 | 94 | } |
78 | 95 |
|
79 | 96 | pub fn resolve_as_any( |
80 | 97 | db: &mut DbIndex, |
81 | 98 | cache: &mut LuaInferCache, |
82 | 99 | reason: &mut InferFailReason, |
83 | | -) -> Option<()> { |
| 100 | +) -> Option<bool> { |
84 | 101 | match reason { |
85 | 102 | InferFailReason::None |
86 | 103 | | InferFailReason::FieldDotFound |
87 | | - | InferFailReason::RecursiveInfer => {} |
| 104 | + | InferFailReason::RecursiveInfer => { |
| 105 | + return Some(true); |
| 106 | + } |
88 | 107 | InferFailReason::UnResolveDeclType(decl_id) => { |
89 | | - let decl = db.get_decl_index_mut().get_decl_mut(decl_id)?; |
90 | | - if decl.is_param() { |
91 | | - return set_param_decl_type(db, decl_id, LuaType::Any); |
92 | | - } |
93 | | - |
94 | 108 | db.get_type_index_mut().bind_type( |
95 | 109 | decl_id.clone().into(), |
96 | 110 | LuaTypeCache::InferType(LuaType::Any), |
@@ -128,33 +142,33 @@ pub fn resolve_as_any( |
128 | 142 | } |
129 | 143 |
|
130 | 144 | *reason = InferFailReason::None; |
131 | | - Some(()) |
| 145 | + Some(false) |
132 | 146 | } |
133 | 147 |
|
134 | | -fn set_param_decl_type(db: &mut DbIndex, decl_id: &LuaDeclId, typ: LuaType) -> Option<()> { |
135 | | - let decl = db.get_decl_index_mut().get_decl_mut(decl_id)?; |
| 148 | +// fn set_param_decl_type(db: &mut DbIndex, decl_id: &LuaDeclId, typ: LuaType) -> Option<()> { |
| 149 | +// let decl = db.get_decl_index_mut().get_decl_mut(decl_id)?; |
136 | 150 |
|
137 | | - let (param_idx, signature_id) = match &decl.extra { |
138 | | - LuaDeclExtra::Param { |
139 | | - idx, signature_id, .. |
140 | | - } => (*idx, *signature_id), |
141 | | - _ => unreachable!(), |
142 | | - }; |
| 151 | +// let (param_idx, signature_id) = match &decl.extra { |
| 152 | +// LuaDeclExtra::Param { |
| 153 | +// idx, signature_id, .. |
| 154 | +// } => (*idx, *signature_id), |
| 155 | +// _ => unreachable!(), |
| 156 | +// }; |
143 | 157 |
|
144 | | - // find local annotation |
145 | | - if let Some(signature) = db.get_signature_index_mut().get_mut(&signature_id) { |
146 | | - if signature.param_docs.get(¶m_idx).is_none() { |
147 | | - let name = signature.params.get(param_idx)?; |
148 | | - signature.param_docs.insert( |
149 | | - param_idx, |
150 | | - LuaDocParamInfo { |
151 | | - name: name.clone(), |
152 | | - type_ref: typ, |
153 | | - description: None, |
154 | | - nullable: false, |
155 | | - }, |
156 | | - ); |
157 | | - } |
158 | | - } |
159 | | - Some(()) |
160 | | -} |
| 158 | +// // find local annotation |
| 159 | +// if let Some(signature) = db.get_signature_index_mut().get_mut(&signature_id) { |
| 160 | +// if signature.param_docs.get(¶m_idx).is_none() { |
| 161 | +// let name = signature.params.get(param_idx)?; |
| 162 | +// signature.param_docs.insert( |
| 163 | +// param_idx, |
| 164 | +// LuaDocParamInfo { |
| 165 | +// name: name.clone(), |
| 166 | +// type_ref: typ, |
| 167 | +// description: None, |
| 168 | +// nullable: false, |
| 169 | +// }, |
| 170 | +// ); |
| 171 | +// } |
| 172 | +// } |
| 173 | +// Some(()) |
| 174 | +// } |
0 commit comments