diff --git a/src/server/semantic_tokens.odin b/src/server/semantic_tokens.odin index 80cc6440..d4d7c177 100644 --- a/src/server/semantic_tokens.odin +++ b/src/server/semantic_tokens.odin @@ -421,6 +421,8 @@ visit_proc_type :: proc(node: ^ast.Proc_Type, builder: ^SemanticTokenBuilder) { for name in param.names { if ident, ok := name.derived.(^ast.Ident); ok { write_semantic_node(builder, name, .Parameter) + } else if poly, ok := name.derived.(^ast.Poly_Type); ok { + write_semantic_node(builder, poly.type, .Parameter) } } @@ -563,7 +565,11 @@ visit_ident :: proc( } if .PolyType in symbol.flags { - write_semantic_node(builder, ident, .TypeParameter, modifiers) + if is_type_parameter(symbol) { + write_semantic_node(builder, ident, .TypeParameter, modifiers) + } else { + write_semantic_node(builder, ident, .Parameter, modifiers) + } return } @@ -632,3 +638,15 @@ visit_ident :: proc( } } } + +is_type_parameter :: proc(symbol: Symbol) -> bool { + if basic, ok := symbol.value.(SymbolBasicValue); ok { + return basic.ident != nil && basic.ident.name == "typeid" + } + + if _, ok := symbol.value.(SymbolPolyTypeValue); ok { + return true + } + + return false +} diff --git a/tests/semantic_tokens_test.odin b/tests/semantic_tokens_test.odin index a9449f21..152f1fc9 100644 --- a/tests/semantic_tokens_test.odin +++ b/tests/semantic_tokens_test.odin @@ -454,3 +454,21 @@ semantic_tokens_alias_from_poly_struct :: proc(t: ^testing.T) { {0, 4, 3, .Type, {.ReadOnly}}, // [4] int }) } + +@(test) +semantic_tokens_poly_proc_value_param :: proc(t: ^testing.T) { + src := test.Source { + main = `package test + generic_proc :: proc($FOO: int) { + FOO + } + ` + } + + test.expect_semantic_tokens(t, &src, { + {1, 2, 12, .Function, {.ReadOnly}}, // [0] generic_proc + {0, 22, 3, .Parameter, {}}, // [1] FOO + {0, 5, 3, .Type, {.ReadOnly}}, // [2] int + {1, 3, 3, .Parameter, {}}, // [3] FOO + }) +}