diff options
| author | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-04 20:44:50 -0400 |
|---|---|---|
| committer | Brad Lewis <22850972+BradLewis@users.noreply.github.com> | 2025-08-04 20:44:50 -0400 |
| commit | 23219e126f8fc31dafb8dc6b5d9f7212483d803d (patch) | |
| tree | 8fe20390e67ee507f9d1804fe31d3408be97a2fd /src/server | |
| parent | b7ff730cc0225297f5cd8f854972a372a27e2e28 (diff) | |
Resolve poly type variables
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 16 | ||||
| -rw-r--r-- | src/server/documentation.odin | 5 | ||||
| -rw-r--r-- | src/server/semantic_tokens.odin | 3 | ||||
| -rw-r--r-- | src/server/symbol.odin | 7 |
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) |