Skip to content

Commit d6d5f94

Browse files
committed
Show generic type constructor hovers
1 parent 4d81283 commit d6d5f94

3 files changed

Lines changed: 46 additions & 1 deletion

File tree

‎src/database/queries.rs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -598,6 +598,16 @@ impl CompilerDatabase {
598598
StdlibSymbolId::Type(ty.id),
599599
)));
600600
}
601+
if let TokenKind::Ident(name) = &token.kind
602+
&& let Some(constructor) = self
603+
.context
604+
.standard_library()
605+
.type_constructor_by_name(name)
606+
{
607+
return Ok(Some(DefinitionTarget::StandardLibrarySymbol(
608+
StdlibSymbolId::TypeConstructor(constructor.id),
609+
)));
610+
}
601611
let language = LanguageCatalog::new();
602612
let item = match &token.kind {
603613
TokenKind::Ident(name) => language.item_for_source_token(name),

‎src/insight.rs‎

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,28 @@ fn render_stdlib_symbol_hover(library: StandardLibrary, symbol: StdlibSymbolId)
615615
}
616616
StdlibSymbolId::TypeConstructor(id) => {
617617
let declaration = library.type_constructor(id);
618-
(declaration.name.to_owned(), &declaration.documentation)
618+
let mut form = declaration.name.to_owned();
619+
if !declaration.parameters.is_empty() {
620+
form.push('<');
621+
for (index, parameter) in declaration.parameters.iter().enumerate() {
622+
if index != 0 {
623+
form.push_str(", ");
624+
}
625+
form.push_str(parameter.name);
626+
let constraints = library.minimal_capabilities(parameter.constraints);
627+
if !constraints.is_empty() {
628+
form.push_str(": ");
629+
for (constraint_index, constraint) in constraints.iter().enumerate() {
630+
if constraint_index != 0 {
631+
form.push_str(" + ");
632+
}
633+
form.push_str(library.capability(*constraint).name);
634+
}
635+
}
636+
}
637+
form.push('>');
638+
}
639+
(form, &declaration.documentation)
619640
}
620641
StdlibSymbolId::Type(id) => {
621642
let declaration = library.type_decl(id);

‎tests/compiler/sets.rs‎

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,20 @@ fn set_types_and_methods_are_available_to_editor_queries() {
137137
&& set_offset < highlight.span.end
138138
&& highlight.kind == SemanticTokenKind::Type
139139
}));
140+
let set_hover = database
141+
.hover(set_offset + 1)
142+
.unwrap()
143+
.expect("type-constructor hover");
144+
assert!(
145+
set_hover
146+
.markdown
147+
.contains("```splitscript\nSet<T: Equatable>\n```")
148+
);
149+
assert!(
150+
set_hover
151+
.markdown
152+
.contains("Stores a growable collection of unique values")
153+
);
140154

141155
let static_source = r#"
142156
state "game.exe" {}

0 commit comments

Comments
 (0)