aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-08-04 20:44:50 -0400
committerBrad Lewis <22850972+BradLewis@users.noreply.github.com>2025-08-04 20:44:50 -0400
commit23219e126f8fc31dafb8dc6b5d9f7212483d803d (patch)
tree8fe20390e67ee507f9d1804fe31d3408be97a2fd /src/server
parentb7ff730cc0225297f5cd8f854972a372a27e2e28 (diff)
Resolve poly type variables
Diffstat (limited to 'src/server')
-rw-r--r--src/server/analysis.odin16
-rw-r--r--src/server/documentation.odin5
-rw-r--r--src/server/semantic_tokens.odin3
-rw-r--r--src/server/symbol.odin7
4 files changed, 30 insertions, 1 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin
index ab2efd7..47722e8 100644
--- a/src/server/analysis.odin
+++ b/src/server/analysis.odin
@@ -1168,6 +1168,8 @@ internal_resolve_type_expression :: proc(ast_context: ^AstContext, node: ^ast.Ex
if v.specialization != nil {
return internal_resolve_type_expression(ast_context, v.specialization, out)
}
+ out^ = make_symbol_poly_type_from_ast(ast_context, v.type)
+ return true
case:
log.warnf("default node kind, internal_resolve_type_expression: %v", v)
@@ -3096,6 +3098,20 @@ make_symbol_basic_type_from_ast :: proc(ast_context: ^AstContext, n: ^ast.Ident)
return symbol
}
+make_symbol_poly_type_from_ast :: proc(ast_context: ^AstContext, n: ^ast.Ident) -> Symbol {
+ symbol := Symbol {
+ range = common.get_token_range(n^, ast_context.file.src),
+ type = .Variable,
+ pkg = get_package_from_node(n^),
+ }
+
+ symbol.value = SymbolPolyTypeValue {
+ ident = n,
+ }
+
+ return symbol
+}
+
make_symbol_union_from_ast :: proc(
ast_context: ^AstContext,
v: ast.Union_Type,
diff --git a/src/server/documentation.odin b/src/server/documentation.odin
index c22bbb4..d7c3295 100644
--- a/src/server/documentation.odin
+++ b/src/server/documentation.odin
@@ -312,6 +312,11 @@ get_short_signature :: proc(ast_context: ^AstContext, symbol: Symbol) -> string
build_string_node(v.ident, &sb, false)
}
return strings.to_string(sb)
+ case SymbolPolyTypeValue:
+ sb := strings.builder_make(ast_context.allocator)
+ fmt.sbprintf(&sb, "%s$", pointer_prefix)
+ build_string_node(v.ident, &sb, false)
+ return strings.to_string(sb)
case SymbolBitSetValue:
sb := strings.builder_make(ast_context.allocator)
fmt.sbprintf(&sb, "%sbit_set[", pointer_prefix)
diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin
index 1a5fcb6..7210ccf 100644
--- a/src/server/semantic_tokens.odin
+++ b/src/server/semantic_tokens.odin
@@ -611,7 +611,8 @@ visit_ident :: proc(
SymbolSliceValue,
SymbolMapValue,
SymbolMultiPointerValue,
- SymbolBasicValue:
+ SymbolBasicValue,
+ SymbolPolyTypeValue:
write_semantic_node(builder, ident, .Type, modifiers)
case SymbolUntypedValue:
// handled by static syntax highlighting
diff --git a/src/server/symbol.odin b/src/server/symbol.odin
index 7352425..a41a310 100644
--- a/src/server/symbol.odin
+++ b/src/server/symbol.odin
@@ -135,6 +135,10 @@ SymbolMatrixValue :: struct {
expr: ^ast.Expr,
}
+SymbolPolyTypeValue :: struct {
+ ident: ^ast.Ident,
+}
+
/*
Generic symbol that is used by the indexer for any variable type(constants, defined global variables, etc),
*/
@@ -161,6 +165,7 @@ SymbolValue :: union {
SymbolUntypedValue,
SymbolMatrixValue,
SymbolBitFieldValue,
+ SymbolPolyTypeValue,
}
SymbolFlag :: enum {
@@ -641,6 +646,8 @@ free_symbol :: proc(symbol: Symbol, allocator: mem.Allocator) {
free_ast(v.expr, allocator)
case SymbolBasicValue:
free_ast(v.ident, allocator)
+ case SymbolPolyTypeValue:
+ free_ast(v.ident, allocator)
case SymbolAggregateValue:
for symbol in v.symbols {
free_symbol(symbol, allocator)