Skip to content

Commit 627ebeb

Browse files
committed
refactor type check
1 parent 3b92779 commit 627ebeb

File tree

9 files changed

+53
-18
lines changed

9 files changed

+53
-18
lines changed

crates/emmylua_code_analysis/src/diagnostic/checker/assign_type_mismatch.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ fn check_assign_type_mismatch(
391391
_ => {}
392392
}
393393

394-
let result = semantic_model.type_check(&source_type, &value_type);
394+
let result = semantic_model.type_check_detail(&source_type, &value_type);
395395
if !result.is_ok() {
396396
add_type_check_diagnostic(
397397
context,

crates/emmylua_code_analysis/src/diagnostic/checker/cast_type_mismatch.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ fn cast_type_check(
200200
}
201201
}
202202

203-
semantic_model.type_check(target_type, origin_type)
203+
semantic_model.type_check_detail(target_type, origin_type)
204204
}
205205
}
206206
}

crates/emmylua_code_analysis/src/diagnostic/checker/generic/generic_constraint_mismatch.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ fn check_doc_tag_type(
5454
.get_generic_params(&generic_type.get_base_type_id())?;
5555
for (i, param_type) in generic_type.get_params().iter().enumerate() {
5656
let extend_type = generic_params.get(i)?.type_constraint.clone()?;
57-
let result = semantic_model.type_check(&extend_type, &param_type);
57+
let result = semantic_model.type_check_detail(&extend_type, &param_type);
5858
if !result.is_ok() {
5959
add_type_check_diagnostic(
6060
context,
@@ -261,7 +261,7 @@ fn check_str_tpl_ref(
261261
if let Some(type_decl) = founded_type_decl {
262262
let type_id = type_decl.get_id();
263263
let ref_type = LuaType::Ref(type_id);
264-
let result = semantic_model.type_check(&extend_type, &ref_type);
264+
let result = semantic_model.type_check_detail(&extend_type, &ref_type);
265265
if result.is_err() {
266266
add_type_check_diagnostic(
267267
context,
@@ -296,7 +296,7 @@ fn check_tpl_ref(
296296
) -> Option<()> {
297297
let extend_type = extend_type.clone()?;
298298
let arg_info = arg_info?;
299-
let result = semantic_model.type_check(&extend_type, &arg_info.0);
299+
let result = semantic_model.type_check_detail(&extend_type, &arg_info.0);
300300
if !result.is_ok() {
301301
add_type_check_diagnostic(
302302
context,

crates/emmylua_code_analysis/src/diagnostic/checker/param_type_check.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ fn check_call_expr(
8787
check_type = result;
8888
}
8989
}
90-
let result = semantic_model.type_check(&check_type, arg_type);
90+
let result = semantic_model.type_check_detail(&check_type, arg_type);
9191
if !result.is_ok() {
9292
// 这里执行了`AssignTypeMismatch`的检查
9393
if arg_type.is_table() {
@@ -141,7 +141,7 @@ fn check_variadic_param_match_args(
141141
arg_ranges: &[TextRange],
142142
) {
143143
for (arg_type, arg_range) in arg_types.iter().zip(arg_ranges.iter()) {
144-
let result = semantic_model.type_check(variadic_type, arg_type);
144+
let result = semantic_model.type_check_detail(variadic_type, arg_type);
145145
if !result.is_ok() {
146146
try_add_diagnostic(
147147
context,

crates/emmylua_code_analysis/src/diagnostic/checker/return_type_mismatch.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ fn check_return_stat(
8989
}
9090
}
9191

92-
let result = semantic_model.type_check(check_type, return_expr_type);
92+
let result = semantic_model.type_check_detail(check_type, return_expr_type);
9393
if !result.is_ok() {
9494
if return_expr_type.is_table() {
9595
if let Some(return_expr) = return_exprs.get(index) {
@@ -126,7 +126,7 @@ fn check_return_stat(
126126
}
127127
let return_expr_type = &return_expr_types[0];
128128
let return_expr_range = return_expr_ranges[0];
129-
let result = semantic_model.type_check(check_type, &return_expr_type);
129+
let result = semantic_model.type_check_detail(check_type, &return_expr_type);
130130
if !result.is_ok() {
131131
if return_expr_type.is_table() {
132132
if let Some(return_expr) = return_exprs.get(0) {

crates/emmylua_code_analysis/src/semantic/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub use visibility::check_export_visibility;
4040
use visibility::check_visibility;
4141

4242
use crate::semantic::member::find_members_with_key;
43+
use crate::semantic::type_check::check_type_compact_detail;
4344
use crate::{Emmyrc, LuaDocument, LuaSemanticDeclId, ModuleInfo, db_index::LuaTypeDeclId};
4445
use crate::{
4546
FileId,
@@ -148,6 +149,10 @@ impl<'a> SemanticModel<'a> {
148149
check_type_compact(self.db, source, compact_type)
149150
}
150151

152+
pub fn type_check_detail(&self, source: &LuaType, compact_type: &LuaType) -> TypeCheckResult {
153+
check_type_compact_detail(self.db, source, compact_type)
154+
}
155+
151156
pub fn infer_call_expr_func(
152157
&self,
153158
call_expr: LuaCallExpr,

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,16 @@ fn check_generic_type_compact_table(
146146
.unwrap_or(&LuaTypeCache::InferType(LuaType::Any))
147147
.as_type();
148148

149-
if let Err(TypeCheckFailReason::TypeNotMatch) = check_general_type_compact(
149+
if let Err(err) = check_general_type_compact(
150150
context,
151151
&source_member_type,
152152
&table_member_type,
153153
next_guard,
154-
) {
154+
) && err.is_type_not_match()
155+
{
156+
if !context.detail {
157+
return Err(TypeCheckFailReason::TypeNotMatch);
158+
}
155159
return Err(TypeCheckFailReason::TypeNotMatchWithReason(
156160
t!(
157161
"member %{name} type not match, expect %{expect}, got %{got}",
@@ -166,6 +170,10 @@ fn check_generic_type_compact_table(
166170
}
167171
}
168172
None if !source_member_type.is_optional() => {
173+
if !context.detail {
174+
return Err(TypeCheckFailReason::TypeNotMatch);
175+
}
176+
169177
return Err(TypeCheckFailReason::TypeNotMatchWithReason(
170178
t!("missing member %{name}, in table", name = key.to_path()).to_string(),
171179
));

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub fn check_type_compact(
3333
check_general_type_compact(&context, source, compact_type, TypeCheckGuard::new())
3434
}
3535

36+
#[allow(unused)]
3637
pub fn check_type_compact_detail(
3738
db: &DbIndex,
3839
source: &LuaType,

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

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,13 @@ pub fn check_ref_type_compact(
2222
.get_type_index()
2323
.get_type_decl(source_id)
2424
// unreachable!
25-
.ok_or(TypeCheckFailReason::TypeNotMatchWithReason(
26-
t!("type `%{name}` not found.", name = source_id.get_name()).to_string(),
27-
))?;
25+
.ok_or(if context.detail {
26+
TypeCheckFailReason::TypeNotMatchWithReason(
27+
t!("type `%{name}` not found.", name = source_id.get_name()).to_string(),
28+
)
29+
} else {
30+
TypeCheckFailReason::TypeNotMatch
31+
})?;
2832

2933
if type_decl.is_alias() {
3034
if let Some(origin_type) = type_decl.get_alias_origin(context.db, None) {
@@ -263,12 +267,17 @@ fn check_ref_type_compact_table(
263267
.unwrap_or(&LuaTypeCache::InferType(LuaType::Any))
264268
.as_type();
265269

266-
if let Err(TypeCheckFailReason::TypeNotMatch) = check_general_type_compact(
270+
if let Err(err) = check_general_type_compact(
267271
context,
268272
&source_member_type,
269273
&table_member_type,
270274
check_guard.next_level()?,
271-
) {
275+
) && err.is_type_not_match()
276+
{
277+
if !context.detail {
278+
return Err(TypeCheckFailReason::TypeNotMatch);
279+
}
280+
272281
return Err(TypeCheckFailReason::TypeNotMatchWithReason(
273282
t!(
274283
"member %{name} type not match, expect %{expect}, got %{got}",
@@ -283,6 +292,10 @@ fn check_ref_type_compact_table(
283292
}
284293
}
285294
None if !source_member_type.is_optional() => {
295+
if !context.detail {
296+
return Err(TypeCheckFailReason::TypeNotMatch);
297+
}
298+
286299
return Err(TypeCheckFailReason::TypeNotMatchWithReason(
287300
t!("missing member %{name}, in table", name = key.to_path()).to_string(),
288301
));
@@ -330,12 +343,17 @@ fn check_ref_type_compact_object(
330343

331344
match get_object_field_type(object_type, &key) {
332345
Some(field_type) => {
333-
if let Err(TypeCheckFailReason::TypeNotMatch) = check_general_type_compact(
346+
if let Err(err) = check_general_type_compact(
334347
context,
335348
&source_member_type,
336349
field_type,
337350
check_guard.next_level()?,
338-
) {
351+
) && err.is_type_not_match()
352+
{
353+
if !context.detail {
354+
return Err(TypeCheckFailReason::TypeNotMatch);
355+
}
356+
339357
return Err(TypeCheckFailReason::TypeNotMatchWithReason(
340358
t!(
341359
"member %{name} type not match, expect %{expect}, got %{got}",
@@ -349,6 +367,9 @@ fn check_ref_type_compact_object(
349367
}
350368
}
351369
None if !source_member_type.is_optional() => {
370+
if !context.detail {
371+
return Err(TypeCheckFailReason::TypeNotMatch);
372+
}
352373
return Err(TypeCheckFailReason::TypeNotMatchWithReason(
353374
t!("missing member %{name}, in table", name = key.to_path()).to_string(),
354375
));

0 commit comments

Comments
 (0)