Skip to content

Commit e4a901b

Browse files
committed
Merge branch 'update' into merge
2 parents 9640163 + 30d16f4 commit e4a901b

File tree

4 files changed

+66
-4
lines changed

4 files changed

+66
-4
lines changed

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -470,4 +470,30 @@ mod tests {
470470
"#
471471
));
472472
}
473+
474+
#[test]
475+
fn test_generic_type_1() {
476+
let mut ws = VirtualWorkspace::new();
477+
ws.def(
478+
r#"
479+
---@class Range: Observable<integer>
480+
---@class Observable<T>
481+
482+
---@return Range
483+
function newRange()
484+
end
485+
"#,
486+
);
487+
assert!(ws.check_code_for(
488+
DiagnosticCode::ReturnTypeMismatch,
489+
r#"
490+
491+
---@return Observable<integer>
492+
function range()
493+
return newRange()
494+
end
495+
496+
"#
497+
));
498+
}
473499
}

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

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

88
use super::{
9-
check_general_type_compact, type_check_fail_reason::TypeCheckFailReason,
10-
type_check_guard::TypeCheckGuard, TypeCheckResult,
9+
check_general_type_compact, check_ref_type_compact,
10+
type_check_fail_reason::TypeCheckFailReason, type_check_guard::TypeCheckGuard, TypeCheckResult,
1111
};
1212

1313
pub fn check_generic_type_compact(
@@ -53,6 +53,12 @@ pub fn check_generic_type_compact(
5353
LuaMemberOwner::Element(range.clone()),
5454
check_guard.next_level()?,
5555
),
56+
LuaType::Ref(_) | LuaType::Def(_) => check_ref_type_compact(
57+
db,
58+
&source_generic.get_base_type_id(),
59+
compact_type,
60+
check_guard.next_level()?,
61+
),
5662
_ => Err(TypeCheckFailReason::TypeNotMatch),
5763
}
5864
}

crates/emmylua_ls/src/handlers/hover/function_humanize.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,14 +259,13 @@ fn hover_doc_function_type(
259259
} else {
260260
func_name.to_string()
261261
};
262-
263262
let params = lua_func
264263
.get_params()
265264
.iter()
266265
.enumerate()
267266
.map(|(index, param)| {
268267
let name = param.0.clone();
269-
if index == 0 && is_method {
268+
if index == 0 && is_method && !lua_func.is_colon_define() {
270269
"".to_string()
271270
} else if let Some(ty) = &param.1 {
272271
format!("{}: {}", name, humanize_type(db, ty, RenderLevel::Normal))

crates/emmylua_ls/src/handlers/test/hover_function_test.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,4 +395,35 @@ mod tests {
395395
},
396396
));
397397
}
398+
399+
#[test]
400+
fn test_generic_function() {
401+
let mut ws = ProviderVirtualWorkspace::new();
402+
ws.def_file(
403+
"test.lua",
404+
r#"
405+
---@class Observable<T>
406+
local Observable
407+
408+
---@generic R
409+
---@param selector fun(value: T, index?: integer): R
410+
function Observable:select(selector)
411+
end
412+
413+
---@type Observable<integer>
414+
source = {}
415+
416+
"#,
417+
);
418+
assert!(ws.check_hover(
419+
r#"
420+
source:sel<??>ect(function(value)
421+
return value
422+
end)
423+
"#,
424+
VirtualHoverResult {
425+
value: "```lua\n(method) Observable:select(selector: fun(value: integer, index: integer?) -> R)\n```".to_string(),
426+
},
427+
));
428+
}
398429
}

0 commit comments

Comments
 (0)