@@ -2,7 +2,7 @@ use emmylua_parser::{LuaAstNode, LuaCallExpr, LuaExpr, LuaIndexKey};
22
33use crate :: {
44 infer_expr, semantic:: infer:: InferResult , DbIndex , InFiled , InferFailReason , LuaInferCache ,
5- LuaInstanceType , LuaType ,
5+ LuaType ,
66} ;
77
88pub fn infer_setmetatable_call (
@@ -20,19 +20,17 @@ pub fn infer_setmetatable_call(
2020 let basic_table = args[ 0 ] . clone ( ) ;
2121 let metatable = args[ 1 ] . clone ( ) ;
2222
23- let meta_type = infer_metatable_type ( db, cache, metatable) ?;
23+ let ( meta_type, is_index ) = infer_metatable_index_type ( db, cache, metatable) ?;
2424 match & basic_table {
2525 LuaExpr :: TableExpr ( table_expr) => {
26- if table_expr. is_empty ( ) {
26+ if table_expr. is_empty ( ) && is_index {
2727 return Ok ( meta_type) ;
28- } else {
29- let file_id = cache. get_file_id ( ) ;
30- let inst = LuaType :: Instance (
31- LuaInstanceType :: new ( meta_type, InFiled :: new ( file_id, basic_table. get_range ( ) ) )
32- . into ( ) ,
33- ) ;
34- return Ok ( inst) ;
3528 }
29+
30+ return Ok ( LuaType :: TableConst ( InFiled :: new (
31+ cache. get_file_id ( ) ,
32+ table_expr. get_range ( ) ,
33+ ) ) ) ;
3634 }
3735 _ => {
3836 if meta_type. is_unknown ( ) {
@@ -44,11 +42,11 @@ pub fn infer_setmetatable_call(
4442 }
4543}
4644
47- fn infer_metatable_type (
45+ fn infer_metatable_index_type (
4846 db : & DbIndex ,
4947 cache : & mut LuaInferCache ,
5048 metatable : LuaExpr ,
51- ) -> InferResult {
49+ ) -> Result < ( LuaType , bool /*__index type*/ ) , InferFailReason > {
5250 match & metatable {
5351 LuaExpr :: TableExpr ( table) => {
5452 let fields = table. get_fields ( ) ;
@@ -71,13 +69,15 @@ fn infer_metatable_type(
7169 | LuaExpr :: IndexExpr ( _)
7270 | LuaExpr :: NameExpr ( _)
7371 ) {
74- return infer_expr ( db, cache, field_value) ;
72+ let meta_type = infer_expr ( db, cache, field_value) ?;
73+ return Ok ( ( meta_type, true ) ) ;
7574 }
7675 }
7776 }
7877 }
7978 _ => { }
8079 } ;
8180
82- return infer_expr ( db, cache, metatable) ;
81+ let meta_type = infer_expr ( db, cache, metatable) ?;
82+ Ok ( ( meta_type, false ) )
8383}
0 commit comments