11use std:: collections:: HashSet ;
22
33use emmylua_parser:: { LuaAst , LuaAstNode , LuaIndexExpr , LuaIndexKey , LuaVarExpr } ;
4- use internment:: ArcIntern ;
54
65use crate :: { DiagnosticCode , InferFailReason , LuaMemberKey , LuaType , SemanticModel } ;
76
@@ -142,9 +141,18 @@ fn is_valid_member(
142141 return Some ( ( ) ) ;
143142 }
144143
145- // 获取并验证 key_type
146- let key_type = match index_key {
147- LuaIndexKey :: Expr ( expr) => match semantic_model. infer_expr ( expr. clone ( ) ) {
144+ match prefix_typ {
145+ LuaType :: Global => return Some ( ( ) ) ,
146+ LuaType :: Array ( typ) => {
147+ if typ. is_unknown ( ) {
148+ return Some ( ( ) ) ;
149+ }
150+ }
151+ _ => { }
152+ }
153+
154+ let key_type = if let LuaIndexKey :: Expr ( expr) = index_key {
155+ match semantic_model. infer_expr ( expr. clone ( ) ) {
148156 Ok (
149157 LuaType :: Any
150158 | LuaType :: Unknown
@@ -162,24 +170,14 @@ fn is_valid_member(
162170 Err ( _) => {
163171 return None ;
164172 }
165- } ,
166- LuaIndexKey :: String ( name) => LuaType :: StringConst ( ArcIntern :: new ( name. get_value ( ) . into ( ) ) ) ,
167- LuaIndexKey :: Integer ( i) => LuaType :: IntegerConst ( i. get_int_value ( ) ) ,
168- LuaIndexKey :: Name ( name) => {
169- LuaType :: StringConst ( ArcIntern :: new ( name. get_name_text ( ) . into ( ) ) )
170173 }
171- LuaIndexKey :: Idx ( i) => LuaType :: IntegerConst ( i. clone ( ) as i64 ) ,
174+ } else {
175+ return None ;
172176 } ;
173177
174178 // 允许特定类型组合通过
175179 match ( prefix_typ, & key_type) {
176- ( LuaType :: Global , _) => return Some ( ( ) ) ,
177180 ( LuaType :: Tuple ( _) , LuaType :: Integer | LuaType :: IntegerConst ( _) ) => return Some ( ( ) ) ,
178- ( LuaType :: Array ( typ) , _) => {
179- if typ. is_unknown ( ) {
180- return Some ( ( ) ) ;
181- }
182- }
183181 ( LuaType :: Def ( id) , _) => {
184182 if let Some ( decl) = semantic_model. get_db ( ) . get_type_index ( ) . get_type_decl ( id) {
185183 if decl. is_class ( ) {
0 commit comments