aboutsummaryrefslogtreecommitdiff
path: root/src/server/hover.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/hover.odin')
-rw-r--r--src/server/hover.odin72
1 files changed, 64 insertions, 8 deletions
diff --git a/src/server/hover.odin b/src/server/hover.odin
index 52663a8..4965621 100644
--- a/src/server/hover.odin
+++ b/src/server/hover.odin
@@ -112,12 +112,54 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
}
}
- if position_context.struct_type != nil {
- for field in position_context.struct_type.fields.list {
- for name in field.names {
- if position_in_node(name, position_context.position) {
- if identifier, ok := name.derived.(^ast.Ident); ok && field.type != nil {
- if position_context.value_decl != nil && len(position_context.value_decl.names) != 0 {
+ if position_context.value_decl != nil && len(position_context.value_decl.names) != 0 {
+ if position_context.enum_type != nil {
+ if enum_symbol, ok := resolve_type_expression(&ast_context, position_context.value_decl.names[0]); ok {
+ if v, ok := enum_symbol.value.(SymbolEnumValue); ok {
+ for field in position_context.enum_type.fields {
+ if ident, ok := field.derived.(^ast.Ident); ok {
+ if position_in_node(ident, position_context.position) {
+ for name, i in v.names {
+ if name == ident.name {
+ symbol := Symbol {
+ pkg = ast_context.current_package,
+ name = enum_symbol.name,
+ range = common.get_token_range(ident, ast_context.file.src),
+ signature = get_enum_field_signature(v, i),
+ }
+ hover.contents = write_hover_content(&ast_context, symbol)
+ return hover, true, true
+ }
+ }
+ }
+ } else if value, ok := field.derived.(^ast.Field_Value); ok {
+ if position_in_node(value.field, position_context.position) {
+ if ident, ok := value.field.derived.(^ast.Ident); ok {
+ for name, i in v.names {
+ if name == ident.name {
+ symbol := Symbol {
+ pkg = ast_context.current_package,
+ range = common.get_token_range(value.field, ast_context.file.src),
+ name = enum_symbol.name,
+ signature = get_enum_field_signature(v, i),
+ }
+ hover.contents = write_hover_content(&ast_context, symbol)
+ }
+ }
+ }
+ return hover, true, true
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if position_context.struct_type != nil {
+ for field in position_context.struct_type.fields.list {
+ for name in field.names {
+ if position_in_node(name, position_context.position) {
+ if identifier, ok := name.derived.(^ast.Ident); ok && field.type != nil {
if symbol, ok := resolve_type_expression(&ast_context, field.type); ok {
if struct_symbol, ok := resolve_type_expression(
&ast_context,
@@ -139,7 +181,9 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
break
}
}
- if index != -1 && value.comments[index] != nil && len(value.comments[index].list) > 0 {
+ if index != -1 &&
+ value.comments[index] != nil &&
+ len(value.comments[index].list) > 0 {
symbol.comment = value.comments[index].list[0].text
}
}
@@ -301,6 +345,18 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
}
}
}
+ case SymbolEnumValue:
+ for name, i in v.names {
+ if name == field {
+ symbol := Symbol {
+ name = selector.name,
+ pkg = selector.pkg,
+ signature = get_enum_field_signature(v, i),
+ }
+ hover.contents = write_hover_content(&ast_context, symbol)
+ return hover, true, true
+ }
+ }
}
} else if position_context.implicit_selector_expr != nil {
implicit_selector := position_context.implicit_selector_expr
@@ -309,7 +365,7 @@ get_hover_information :: proc(document: ^Document, position: common.Position) ->
case SymbolEnumValue:
for name, i in v.names {
if strings.compare(name, implicit_selector.field.name) == 0 {
- symbol.signature = fmt.tprintf(".%s", name)
+ symbol.signature = get_enum_field_signature(v, i)
hover.contents = write_hover_content(&ast_context, symbol)
return hover, true, true
}