Skip to content

Commit 7564280

Browse files
committed
refactor ref type check
Fix #841
1 parent a8c561d commit 7564280

File tree

13 files changed

+116
-52
lines changed

13 files changed

+116
-52
lines changed

crates/emmylua_code_analysis/src/diagnostic/test/param_type_check_test.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,4 +1334,25 @@ mod test {
13341334
"#
13351335
));
13361336
}
1337+
1338+
#[test]
1339+
fn test_issue_841() {
1340+
let mut ws = VirtualWorkspace::new();
1341+
assert!(ws.check_code_for(
1342+
DiagnosticCode::ParamTypeMismatch,
1343+
r#"
1344+
--- @class B
1345+
--- @field cmd string
1346+
1347+
--- @class A: B
1348+
--- @field cmd? string
1349+
1350+
--- @param x A
1351+
local function foo(x)
1352+
end
1353+
1354+
foo({})
1355+
"#,
1356+
));
1357+
}
13371358
}

crates/emmylua_code_analysis/src/semantic/type_check/complex_type/array_type_check.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
};
99

1010
pub fn check_array_type_compact(
11-
context: &TypeCheckContext,
11+
context: &mut TypeCheckContext,
1212
source_base: &LuaType,
1313
compact_type: &LuaType,
1414
check_guard: TypeCheckGuard,
@@ -87,7 +87,7 @@ pub fn check_array_type_compact(
8787
}
8888

8989
fn check_array_type_compact_ref_def(
90-
context: &TypeCheckContext,
90+
context: &mut TypeCheckContext,
9191
source_base: &LuaType,
9292
compact_type: &LuaType,
9393
check_guard: TypeCheckGuard,
@@ -110,7 +110,7 @@ fn check_array_type_compact_ref_def(
110110
}
111111

112112
fn check_array_type_compact_table(
113-
context: &TypeCheckContext,
113+
context: &mut TypeCheckContext,
114114
source_base: &LuaType,
115115
table_owner: LuaMemberOwner,
116116
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/complex_type/intersection_type_check.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
};
88

99
pub fn check_intersection_type_compact(
10-
context: &TypeCheckContext,
10+
context: &mut TypeCheckContext,
1111
source_intersection: &LuaIntersectionType,
1212
compact_type: &LuaType,
1313
check_guard: TypeCheckGuard,
@@ -61,7 +61,7 @@ pub fn check_intersection_type_compact(
6161
}
6262

6363
fn check_intersection_type_compact_table(
64-
context: &TypeCheckContext,
64+
context: &mut TypeCheckContext,
6565
source_intersection: &LuaIntersectionType,
6666
table_owner: LuaMemberOwner,
6767
check_guard: TypeCheckGuard,
@@ -85,7 +85,7 @@ fn check_intersection_type_compact_table(
8585
}
8686

8787
fn check_intersection_type_compact_intersection(
88-
context: &TypeCheckContext,
88+
context: &mut TypeCheckContext,
8989
source_intersection: &LuaIntersectionType,
9090
compact_intersection: &LuaIntersectionType,
9191
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/complex_type/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use super::{
1919

2020
// all is duck typing
2121
pub fn check_complex_type_compact(
22-
context: &TypeCheckContext,
22+
context: &mut TypeCheckContext,
2323
source: &LuaType,
2424
compact_type: &LuaType,
2525
check_guard: TypeCheckGuard,
@@ -131,7 +131,7 @@ pub fn check_complex_type_compact(
131131

132132
// too complex
133133
fn check_union_type_compact_union(
134-
context: &TypeCheckContext,
134+
context: &mut TypeCheckContext,
135135
source: &LuaType,
136136
compact_union: &LuaUnionType,
137137
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/complex_type/object_type_check.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
};
99

1010
pub fn check_object_type_compact(
11-
context: &TypeCheckContext,
11+
context: &mut TypeCheckContext,
1212
source_object: &LuaObjectType,
1313
compact_type: &LuaType,
1414
check_guard: TypeCheckGuard,
@@ -64,7 +64,7 @@ pub fn check_object_type_compact(
6464
}
6565

6666
fn check_object_type_compact_object_type(
67-
context: &TypeCheckContext,
67+
context: &mut TypeCheckContext,
6868
source_object: &LuaObjectType,
6969
compact_object: &LuaObjectType,
7070
check_guard: TypeCheckGuard,
@@ -95,7 +95,7 @@ fn check_object_type_compact_object_type(
9595
}
9696

9797
fn check_object_type_compact_member_owner(
98-
context: &TypeCheckContext,
98+
context: &mut TypeCheckContext,
9999
source_object: &LuaObjectType,
100100
member_owner: LuaMemberOwner,
101101
check_guard: TypeCheckGuard,
@@ -150,7 +150,7 @@ fn check_object_type_compact_member_owner(
150150
}
151151

152152
fn check_object_type_compact_tuple(
153-
context: &TypeCheckContext,
153+
context: &mut TypeCheckContext,
154154
source_object: &LuaObjectType,
155155
tuple_type: &LuaTupleType,
156156
check_guard: TypeCheckGuard,
@@ -196,7 +196,7 @@ fn check_object_type_compact_tuple(
196196
}
197197

198198
fn check_object_type_compact_array(
199-
context: &TypeCheckContext,
199+
context: &mut TypeCheckContext,
200200
source_object: &LuaObjectType,
201201
array: &LuaType,
202202
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/complex_type/table_generic_check.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::{
77
};
88

99
pub fn check_table_generic_type_compact(
10-
context: &TypeCheckContext,
10+
context: &mut TypeCheckContext,
1111
source_generic_param: &Vec<LuaType>,
1212
compact_type: &LuaType,
1313
check_guard: TypeCheckGuard,
@@ -113,7 +113,7 @@ pub fn check_table_generic_type_compact(
113113
}
114114

115115
fn check_table_generic_compact_member_owner(
116-
context: &TypeCheckContext,
116+
context: &mut TypeCheckContext,
117117
source_generic_params: &[LuaType],
118118
member_owner: LuaMemberOwner,
119119
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/complex_type/tuple_type_check.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::{
1010
};
1111

1212
pub fn check_tuple_type_compact(
13-
context: &TypeCheckContext,
13+
context: &mut TypeCheckContext,
1414
tuple: &LuaTupleType,
1515
compact_type: &LuaType,
1616
check_guard: TypeCheckGuard,
@@ -62,7 +62,7 @@ pub fn check_tuple_type_compact(
6262
}
6363

6464
fn check_tuple_type_compact_tuple(
65-
context: &TypeCheckContext,
65+
context: &mut TypeCheckContext,
6666
source_tuple: &LuaTupleType,
6767
compact_tuple: &LuaTupleType,
6868
check_guard: TypeCheckGuard,
@@ -80,7 +80,7 @@ fn check_tuple_type_compact_tuple(
8080
}
8181

8282
fn check_tuple_types_compact_tuple_types(
83-
context: &TypeCheckContext,
83+
context: &mut TypeCheckContext,
8484
source_start: usize,
8585
sources: &[LuaType],
8686
compacts: &[LuaType],
@@ -179,7 +179,7 @@ fn check_tuple_types_compact_tuple_types(
179179
}
180180

181181
fn check_tuple_type_compact_table(
182-
context: &TypeCheckContext,
182+
context: &mut TypeCheckContext,
183183
source_tuple: &LuaTupleType,
184184
table_owner: LuaMemberOwner,
185185
check_guard: TypeCheckGuard,
@@ -231,7 +231,7 @@ fn check_tuple_type_compact_table(
231231
}
232232

233233
fn check_tuple_type_compact_object_type(
234-
context: &TypeCheckContext,
234+
context: &mut TypeCheckContext,
235235
source_tuple: &LuaTupleType,
236236
object_type: &LuaObjectType,
237237
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/func_type.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use super::{
99
};
1010

1111
pub fn check_doc_func_type_compact(
12-
context: &TypeCheckContext,
12+
context: &mut TypeCheckContext,
1313
source_func: &LuaFunctionType,
1414
compact_type: &LuaType,
1515
check_guard: TypeCheckGuard,
@@ -48,7 +48,7 @@ pub fn check_doc_func_type_compact(
4848
}
4949

5050
fn check_doc_func_type_compact_for_params(
51-
context: &TypeCheckContext,
51+
context: &mut TypeCheckContext,
5252
source_func: &LuaFunctionType,
5353
compact_func: &LuaFunctionType,
5454
check_guard: TypeCheckGuard,
@@ -116,7 +116,7 @@ fn check_doc_func_type_compact_for_params(
116116
}
117117

118118
fn check_doc_func_type_compact_for_varargs(
119-
context: &TypeCheckContext,
119+
context: &mut TypeCheckContext,
120120
varargs: &Option<LuaType>,
121121
compact_params: &[(String, Option<LuaType>)],
122122
check_guard: TypeCheckGuard,
@@ -139,7 +139,7 @@ fn check_doc_func_type_compact_for_varargs(
139139
}
140140

141141
fn check_doc_func_type_compact_for_signature(
142-
context: &TypeCheckContext,
142+
context: &mut TypeCheckContext,
143143
source_func: &LuaFunctionType,
144144
signature_id: &LuaSignatureId,
145145
check_guard: TypeCheckGuard,
@@ -187,7 +187,7 @@ fn check_doc_func_type_compact_for_signature(
187187

188188
// check type is callable
189189
fn check_doc_func_type_compact_for_custom_type(
190-
context: &TypeCheckContext,
190+
context: &mut TypeCheckContext,
191191
source_func: &LuaFunctionType,
192192
custom_type_id: &LuaTypeDeclId,
193193
check_guard: TypeCheckGuard,
@@ -251,7 +251,7 @@ fn check_doc_func_type_compact_for_custom_type(
251251
}
252252

253253
pub fn check_sig_type_compact(
254-
context: &TypeCheckContext,
254+
context: &mut TypeCheckContext,
255255
sig_id: &LuaSignatureId,
256256
compact_type: &LuaType,
257257
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/generic_type.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use super::{
1212
};
1313

1414
pub fn check_generic_type_compact(
15-
context: &TypeCheckContext,
15+
context: &mut TypeCheckContext,
1616
source_generic: &LuaGenericType,
1717
compact_type: &LuaType,
1818
check_guard: TypeCheckGuard,
@@ -104,7 +104,7 @@ pub fn check_generic_type_compact(
104104
}
105105

106106
fn check_generic_type_compact_generic(
107-
context: &TypeCheckContext,
107+
context: &mut TypeCheckContext,
108108
source_generic: &LuaGenericType,
109109
compact_generic: &LuaGenericType,
110110
check_guard: TypeCheckGuard,
@@ -149,7 +149,7 @@ fn check_generic_type_compact_generic(
149149
}
150150

151151
fn check_generic_type_compact_table(
152-
context: &TypeCheckContext,
152+
context: &mut TypeCheckContext,
153153
source_generic: &LuaGenericType,
154154
table_owner: LuaMemberOwner,
155155
check_guard: TypeCheckGuard,
@@ -244,7 +244,7 @@ fn check_generic_type_compact_table(
244244
}
245245

246246
fn check_generic_type_compact_ref_type(
247-
context: &TypeCheckContext,
247+
context: &mut TypeCheckContext,
248248
source_generic: &LuaGenericType,
249249
ref_id: &LuaTypeDeclId,
250250
check_guard: TypeCheckGuard,

crates/emmylua_code_analysis/src/semantic/type_check/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@ pub fn check_type_compact(
3030
source: &LuaType,
3131
compact_type: &LuaType,
3232
) -> TypeCheckResult {
33-
let context = TypeCheckContext::new(db, false, TypeCheckCheckLevel::Normal);
34-
check_general_type_compact(&context, source, compact_type, TypeCheckGuard::new())
33+
let mut context = TypeCheckContext::new(db, false, TypeCheckCheckLevel::Normal);
34+
check_general_type_compact(&mut context, source, compact_type, TypeCheckGuard::new())
3535
}
3636

3737
#[allow(unused)]
@@ -41,8 +41,8 @@ pub fn check_type_compact_detail(
4141
compact_type: &LuaType,
4242
) -> TypeCheckResult {
4343
let guard = TypeCheckGuard::new();
44-
let context = TypeCheckContext::new(db, true, TypeCheckCheckLevel::Normal);
45-
check_general_type_compact(&context, source, compact_type, guard)
44+
let mut context = TypeCheckContext::new(db, true, TypeCheckCheckLevel::Normal);
45+
check_general_type_compact(&mut context, source, compact_type, guard)
4646
}
4747

4848
pub fn check_type_compact_with_level(
@@ -51,12 +51,12 @@ pub fn check_type_compact_with_level(
5151
compact_type: &LuaType,
5252
level: TypeCheckCheckLevel,
5353
) -> TypeCheckResult {
54-
let context = TypeCheckContext::new(db, false, level);
55-
check_general_type_compact(&context, source, compact_type, TypeCheckGuard::new())
54+
let mut context = TypeCheckContext::new(db, false, level);
55+
check_general_type_compact(&mut context, source, compact_type, TypeCheckGuard::new())
5656
}
5757

5858
fn check_general_type_compact(
59-
context: &TypeCheckContext,
59+
context: &mut TypeCheckContext,
6060
source: &LuaType,
6161
compact_type: &LuaType,
6262
check_guard: TypeCheckGuard,

0 commit comments

Comments
 (0)