diff --git a/server/internal/lsp/search/search_completion_list.go b/server/internal/lsp/search/search_completion_list.go index 711e0bc..d862194 100644 --- a/server/internal/lsp/search/search_completion_list.go +++ b/server/internal/lsp/search/search_completion_list.go @@ -142,6 +142,15 @@ func GetCompletableDocComment(s symbols.Indexable) any { } } +func GetCompletionDetail(s symbols.Indexable) *string { + detail := s.GetCompletionDetail() + if detail == "" { + return nil + } else { + return &detail + } +} + // Returns: []CompletionItem | CompletionList | nil func (s *Search) BuildCompletionList( ctx context.CursorContext, @@ -240,6 +249,8 @@ func (s *Search) BuildCompletionList( // At this moment, struct members cannot receive documentation Documentation: nil, + + Detail: GetCompletionDetail(member), }) } } @@ -271,6 +282,7 @@ func (s *Search) BuildCompletionList( Range: replacementRange, }, Documentation: GetCompletableDocComment(fn), + Detail: GetCompletionDetail(fn), }) } @@ -284,6 +296,8 @@ func (s *Search) BuildCompletionList( // No documentation for enumerators at this time Documentation: nil, + + Detail: GetCompletionDetail(enumerator), }) } } @@ -298,6 +312,8 @@ func (s *Search) BuildCompletionList( // No documentation for fault constants at this time Documentation: nil, + + Detail: GetCompletionDetail(constant), }) } } @@ -328,20 +344,21 @@ func (s *Search) BuildCompletionList( editRange := symbolInPosition.FullTextRange().ToLSP() items = append(items, protocol.CompletionItem{ - Label: storedIdentifier.GetName(), - Kind: cast.ToPtr(storedIdentifier.GetKind()), - Detail: cast.ToPtr("Module"), + Label: storedIdentifier.GetName(), + Kind: cast.ToPtr(storedIdentifier.GetKind()), TextEdit: protocol.TextEdit{ NewText: storedIdentifier.GetName(), Range: editRange, }, Documentation: GetCompletableDocComment(storedIdentifier), + Detail: GetCompletionDetail(storedIdentifier), }) } else { items = append(items, protocol.CompletionItem{ Label: storedIdentifier.GetName(), Kind: cast.ToPtr(storedIdentifier.GetKind()), Documentation: GetCompletableDocComment(storedIdentifier), + Detail: GetCompletionDetail(storedIdentifier), }) } } diff --git a/server/internal/lsp/search/search_completion_list_test.go b/server/internal/lsp/search/search_completion_list_test.go index 77d91d4..9867a15 100644 --- a/server/internal/lsp/search/search_completion_list_test.go +++ b/server/internal/lsp/search/search_completion_list_test.go @@ -346,10 +346,10 @@ func TestBuildCompletionList(t *testing.T) { t.Run("Should suggest variable names defined in module", func(t *testing.T) { source := ` - int variable = 3; - int xanadu = 10; + int! variable = 3; + float xanadu = 10.0; <* doc *> - int documented = 50; + float* documented = &xanadu; <* const doc *> const int MY_CONST = 100;` expectedVarKind := protocol.CompletionItemKindVariable @@ -358,11 +358,11 @@ func TestBuildCompletionList(t *testing.T) { input string expected protocol.CompletionItem }{ - {"v", protocol.CompletionItem{Label: "variable", Kind: &expectedVarKind}}, - {"va", protocol.CompletionItem{Label: "variable", Kind: &expectedVarKind}}, - {"x", protocol.CompletionItem{Label: "xanadu", Kind: &expectedVarKind}}, - {"docu", protocol.CompletionItem{Label: "documented", Kind: &expectedVarKind, Documentation: asMarkdown("doc")}}, - {"MY_C", protocol.CompletionItem{Label: "MY_CONST", Kind: &expectedConstKind, Documentation: asMarkdown("const doc")}}, + {"v", protocol.CompletionItem{Label: "variable", Kind: &expectedVarKind, Detail: cast.ToPtr("int!")}}, + {"va", protocol.CompletionItem{Label: "variable", Kind: &expectedVarKind, Detail: cast.ToPtr("int!")}}, + {"x", protocol.CompletionItem{Label: "xanadu", Kind: &expectedVarKind, Detail: cast.ToPtr("float")}}, + {"docu", protocol.CompletionItem{Label: "documented", Kind: &expectedVarKind, Detail: cast.ToPtr("float*"), Documentation: asMarkdown("doc")}}, + {"MY_C", protocol.CompletionItem{Label: "MY_CONST", Kind: &expectedConstKind, Detail: cast.ToPtr("int"), Documentation: asMarkdown("const doc")}}, } for n, tt := range cases { @@ -400,11 +400,11 @@ func TestBuildCompletionList(t *testing.T) { expected []protocol.CompletionItem }{ {"v", []protocol.CompletionItem{ - {Label: "value", Kind: &expectedKind}, - {Label: "variable", Kind: &expectedKind}, + {Label: "value", Kind: &expectedKind, Detail: cast.ToPtr("int")}, + {Label: "variable", Kind: &expectedKind, Detail: cast.ToPtr("int")}, }}, {"val", []protocol.CompletionItem{ - {Label: "value", Kind: &expectedKind}, + {Label: "value", Kind: &expectedKind, Detail: cast.ToPtr("int")}, }}, } @@ -444,10 +444,10 @@ func TestBuildCompletionList(t *testing.T) { expected []protocol.CompletionItem }{ {"p", []protocol.CompletionItem{ - {Label: "process", Kind: &expectedKind, Documentation: nil}, + {Label: "process", Kind: &expectedKind, Detail: cast.ToPtr("fn void()"), Documentation: nil}, }}, {"proc", []protocol.CompletionItem{ - {Label: "process", Kind: &expectedKind, Documentation: nil}, + {Label: "process", Kind: &expectedKind, Detail: cast.ToPtr("fn void()"), Documentation: nil}, }}, } @@ -486,10 +486,10 @@ func TestBuildCompletionList(t *testing.T) { expected []protocol.CompletionItem }{ {"p", []protocol.CompletionItem{ - {Label: "process", Kind: &expectedKind, Documentation: asMarkdown("abc")}, + {Label: "process", Kind: &expectedKind, Detail: cast.ToPtr("fn void()"), Documentation: asMarkdown("abc")}, }}, {"proc", []protocol.CompletionItem{ - {Label: "process", Kind: &expectedKind, Documentation: asMarkdown("abc")}, + {Label: "process", Kind: &expectedKind, Detail: cast.ToPtr("fn void()"), Documentation: asMarkdown("abc")}, }}, } @@ -537,10 +537,10 @@ func TestBuildCompletionList(t *testing.T) { expected []protocol.CompletionItem }{ {"p", []protocol.CompletionItem{ - {Label: "process", Kind: &expectedKind, Documentation: expectedDoc}, + {Label: "process", Kind: &expectedKind, Detail: cast.ToPtr("fn int(int a)"), Documentation: expectedDoc}, }}, {"proc", []protocol.CompletionItem{ - {Label: "process", Kind: &expectedKind, Documentation: expectedDoc}, + {Label: "process", Kind: &expectedKind, Detail: cast.ToPtr("fn int(int a)"), Documentation: expectedDoc}, }}, } @@ -580,11 +580,11 @@ func TestBuildCompletionList_struct_type(t *testing.T) { expected []protocol.CompletionItem }{ {"Co", []protocol.CompletionItem{ - CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindStruct, "doc"), - CreateCompletionItem("Cough", protocol.CompletionItemKindStruct), + CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindStruct, "Type", "doc"), + CreateCompletionItem("Cough", protocol.CompletionItemKindStruct, "Type"), }}, {"Col", []protocol.CompletionItem{ - CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindStruct, "doc"), + CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindStruct, "Type", "doc"), }}, } @@ -637,8 +637,8 @@ func TestBuildCompletionList_struct_suggest_all_its_members(t *testing.T) { assert.Equal(t, 4, len(completionList)) assert.Equal(t, []protocol.CompletionItem{ - {Label: "color", Kind: &expectedKind}, - {Label: "height", Kind: &expectedKind}, + {Label: "color", Kind: &expectedKind, Detail: cast.ToPtr("Color")}, + {Label: "height", Kind: &expectedKind, Detail: cast.ToPtr("int")}, { Label: "Square.toCircle", Kind: cast.ToPtr(protocol.CompletionItemKindMethod), @@ -646,9 +646,10 @@ func TestBuildCompletionList_struct_suggest_all_its_members(t *testing.T) { NewText: "toCircle", Range: protocol_utils.NewLSPRange(6, 7, 6, 8), }, + Detail: cast.ToPtr("fn void()"), Documentation: asMarkdown("member doc"), }, - {Label: "width", Kind: &expectedKind}, + {Label: "width", Kind: &expectedKind, Detail: cast.ToPtr("int")}, }, completionList) } @@ -680,7 +681,7 @@ func TestBuildCompletionList_struct_suggest_members_starting_with_prefix(t *test assert.Equal(t, 1, len(filteredCompletionList)) assert.Equal(t, []protocol.CompletionItem{ - {Label: "width", Kind: &expectedKind}, + {Label: "width", Kind: &expectedKind, Detail: cast.ToPtr("int")}, }, filteredCompletionList) } @@ -693,7 +694,7 @@ func TestBuildCompletionList_struct_suggest_members_of_substruct(t *testing.T) { source := ` struct Color { int red; int green; int blue; } struct Square { int width; int height; Color color; } - fn uint Color.toHex() {} + fn uint Color.toHex(Color* color) {} fn void main() { Square inst; inst.color. @@ -713,7 +714,7 @@ func TestBuildCompletionList_struct_suggest_members_of_substruct(t *testing.T) { assert.Equal(t, 4, len(completionList)) assert.Equal(t, []protocol.CompletionItem{ - {Label: "blue", Kind: &expectedKind}, + {Label: "blue", Kind: &expectedKind, Detail: cast.ToPtr("int")}, { Label: "Color.toHex", Kind: cast.ToPtr(protocol.CompletionItemKindMethod), @@ -721,9 +722,10 @@ func TestBuildCompletionList_struct_suggest_members_of_substruct(t *testing.T) { NewText: "toHex", Range: protocol_utils.NewLSPRange(6, 13, 6, 14), }, + Detail: cast.ToPtr("fn uint(Color* color)"), }, - {Label: "green", Kind: &expectedKind}, - {Label: "red", Kind: &expectedKind}, + {Label: "green", Kind: &expectedKind, Detail: cast.ToPtr("int")}, + {Label: "red", Kind: &expectedKind, Detail: cast.ToPtr("int")}, }, completionList) } @@ -758,7 +760,7 @@ func TestBuildCompletionList_struct_suggest_members_with_prefix_of_substruct(t * assert.Equal(t, 1, len(filteredCompletionList)) assert.Equal(t, []protocol.CompletionItem{ - {Label: "red", Kind: &expectedKind}, + {Label: "red", Kind: &expectedKind, Detail: cast.ToPtr("int")}, }, filteredCompletionList) } @@ -797,6 +799,7 @@ func TestBuildCompletionList_struct_suggest_method_with_prefix_of_substruct(t *t NewText: "toHex", Range: protocol_utils.NewLSPRange(6, 13, 6, 14), }, + Detail: cast.ToPtr("fn uint()"), }, }, filteredCompletionList) @@ -816,11 +819,11 @@ func TestBuildCompletionList_enums(t *testing.T) { expected []protocol.CompletionItem }{ {"Co", []protocol.CompletionItem{ - CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindEnum, "doc"), - CreateCompletionItem("Cough", protocol.CompletionItemKindEnum), + CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindEnum, "Enum", "doc"), + CreateCompletionItem("Cough", protocol.CompletionItemKindEnum, "Enum"), }}, {"Col", []protocol.CompletionItem{ - CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindEnum, "doc"), + CreateCompletionItemWithDoc("Color", protocol.CompletionItemKindEnum, "Enum", "doc"), }}, } @@ -860,26 +863,26 @@ func TestBuildCompletionList_enums(t *testing.T) { "Find enumerables starting with string", "CO", []protocol.CompletionItem{ - CreateCompletionItem("COBALT", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COUGH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COUGHCOUGH", protocol.CompletionItemKindEnumMember), + CreateCompletionItem("COBALT", protocol.CompletionItemKindEnumMember, "Enumerator"), + CreateCompletionItem("COH", protocol.CompletionItemKindEnumMember, "Enumerator"), + CreateCompletionItem("COUGH", protocol.CompletionItemKindEnumMember, "Enumerator"), + CreateCompletionItem("COUGHCOUGH", protocol.CompletionItemKindEnumMember, "Enumerator"), }}, { "Find all enum enumerables when prefixed with enum name", "Color.", []protocol.CompletionItem{ - CreateCompletionItem("BLUE", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COBALT", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("GREEN", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("RED", protocol.CompletionItemKindEnumMember), + CreateCompletionItem("BLUE", protocol.CompletionItemKindEnumMember, "Enumerator"), + CreateCompletionItem("COBALT", protocol.CompletionItemKindEnumMember, "Enumerator"), + CreateCompletionItem("GREEN", protocol.CompletionItemKindEnumMember, "Enumerator"), + CreateCompletionItem("RED", protocol.CompletionItemKindEnumMember, "Enumerator"), }}, { "Find matching enum enumerables", "Color.COB", []protocol.CompletionItem{ - CreateCompletionItem("COBALT", protocol.CompletionItemKindEnumMember), + CreateCompletionItem("COBALT", protocol.CompletionItemKindEnumMember, "Enumerator"), }, }, } @@ -917,11 +920,11 @@ func TestBuildCompletionList_faults(t *testing.T) { expected []protocol.CompletionItem }{ {"Wind", []protocol.CompletionItem{ - CreateCompletionItem("WindowError", protocol.CompletionItemKindEnum), - CreateCompletionItemWithDoc("WindowFileError", protocol.CompletionItemKindEnum, "doc"), + CreateCompletionItem("WindowError", protocol.CompletionItemKindEnum, "Fault"), + CreateCompletionItemWithDoc("WindowFileError", protocol.CompletionItemKindEnum, "Fault", "doc"), }}, {"WindowFile", []protocol.CompletionItem{ - CreateCompletionItemWithDoc("WindowFileError", protocol.CompletionItemKindEnum, "doc"), + CreateCompletionItemWithDoc("WindowFileError", protocol.CompletionItemKindEnum, "Fault", "doc"), }}, } @@ -960,25 +963,25 @@ func TestBuildCompletionList_faults(t *testing.T) { "Find constants starting with string", "CO", []protocol.CompletionItem{ - CreateCompletionItem("COH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COUGH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COUGHCOUGH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COULD_NOT_CREATE", protocol.CompletionItemKindEnumMember), + CreateCompletionItem("COH", protocol.CompletionItemKindEnumMember, "Fault Constant"), + CreateCompletionItem("COUGH", protocol.CompletionItemKindEnumMember, "Fault Constant"), + CreateCompletionItem("COUGHCOUGH", protocol.CompletionItemKindEnumMember, "Fault Constant"), + CreateCompletionItem("COULD_NOT_CREATE", protocol.CompletionItemKindEnumMember, "Fault Constant"), }}, { "Find all fault constants when prefixed with fault name", "WindowError.", []protocol.CompletionItem{ - CreateCompletionItem("COH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COUGH", protocol.CompletionItemKindEnumMember), - CreateCompletionItem("COUGHCOUGH", protocol.CompletionItemKindEnumMember), + CreateCompletionItem("COH", protocol.CompletionItemKindEnumMember, "Fault Constant"), + CreateCompletionItem("COUGH", protocol.CompletionItemKindEnumMember, "Fault Constant"), + CreateCompletionItem("COUGHCOUGH", protocol.CompletionItemKindEnumMember, "Fault Constant"), }}, { "Find matching fault constants", "WindowFileError.NOT", []protocol.CompletionItem{ - CreateCompletionItem("NOT_FOUND", protocol.CompletionItemKindEnumMember), + CreateCompletionItem("NOT_FOUND", protocol.CompletionItemKindEnumMember, "Fault Constant"), }, }, } @@ -1057,7 +1060,7 @@ func TestBuildCompletionList_modules(t *testing.T) { }, }, }, - CreateCompletionItem("version", protocol.CompletionItemKindVariable), + CreateCompletionItem("version", protocol.CompletionItemKindVariable, "int"), }, false, }, @@ -1175,7 +1178,7 @@ func TestBuildCompletionList_modules(t *testing.T) { Range: protocol_utils.NewLSPRange(5, 4, 5, 9), }, }, - CreateCompletionItem("version", protocol.CompletionItemKindVariable), + CreateCompletionItem("version", protocol.CompletionItemKindVariable, "int"), }, false, }, @@ -1238,6 +1241,7 @@ func TestBuildCompletionList_interfaces(t *testing.T) { { Label: "EmulatorConsole", Kind: cast.ToPtr(protocol.CompletionItemKindInterface), + Detail: cast.ToPtr("Interface"), Documentation: asMarkdown("doc"), }, }, @@ -1246,12 +1250,12 @@ func TestBuildCompletionList_interfaces(t *testing.T) { }) } -func CreateCompletionItem(label string, kind protocol.CompletionItemKind) protocol.CompletionItem { - return protocol.CompletionItem{Label: label, Kind: &kind, Documentation: nil} +func CreateCompletionItem(label string, kind protocol.CompletionItemKind, detail string) protocol.CompletionItem { + return protocol.CompletionItem{Label: label, Kind: &kind, Detail: &detail, Documentation: nil} } -func CreateCompletionItemWithDoc(label string, kind protocol.CompletionItemKind, doc string) protocol.CompletionItem { - return protocol.CompletionItem{Label: label, Kind: &kind, Documentation: asMarkdown(doc)} +func CreateCompletionItemWithDoc(label string, kind protocol.CompletionItemKind, detail string, doc string) protocol.CompletionItem { + return protocol.CompletionItem{Label: label, Kind: &kind, Detail: &detail, Documentation: asMarkdown(doc)} } func TestBuildCompletionList_should_resolve_(t *testing.T) { @@ -1290,8 +1294,9 @@ func TestBuildCompletionList_should_resolve_(t *testing.T) { t, []protocol.CompletionItem{ { - Label: "suggestion", - Kind: cast.ToPtr(protocol.CompletionItemKindVariable), + Label: "suggestion", + Kind: cast.ToPtr(protocol.CompletionItemKindVariable), + Detail: cast.ToPtr("int"), }, }, completionList, diff --git a/server/pkg/symbols/bitstruct.go b/server/pkg/symbols/bitstruct.go index aacf9e0..8696083 100644 --- a/server/pkg/symbols/bitstruct.go +++ b/server/pkg/symbols/bitstruct.go @@ -42,3 +42,8 @@ func (b Bitstruct) Members() []*StructMember { func (b Bitstruct) GetHoverInfo() string { return b.name } + +func (b Bitstruct) GetCompletionDetail() string { + // Same rationale as for struct + return "Type" +} diff --git a/server/pkg/symbols/def.go b/server/pkg/symbols/def.go index 66e1622..5da0347 100644 --- a/server/pkg/symbols/def.go +++ b/server/pkg/symbols/def.go @@ -65,6 +65,18 @@ func (d Def) GetHoverInfo() string { return fmt.Sprintf("def %s = %s", d.name, resolvesTo) } +func (d Def) GetCompletionDetail() string { + if d.resolvesToType.IsSome() { + return "Type" + } else if strings.HasPrefix(d.name, "@") { + return "Macro Alias" + } else { + // No semantic information + // TODO: Resolve the identifier and display it? + return "Alias" + } +} + func (d Def) ResolvesToType() bool { return d.resolvesToType.IsSome() } diff --git a/server/pkg/symbols/enum.go b/server/pkg/symbols/enum.go index 4b1641a..d89411a 100644 --- a/server/pkg/symbols/enum.go +++ b/server/pkg/symbols/enum.go @@ -72,3 +72,10 @@ func (e Enum) GetEnumerators() []*Enumerator { func (e Enum) GetHoverInfo() string { return e.name } + +func (e Enum) GetCompletionDetail() string { + // While we could specify 'Type' here like in struct, + // enums behave quite differently overall, especially + // regarding instantiation + return "Enum" +} diff --git a/server/pkg/symbols/enumerator.go b/server/pkg/symbols/enumerator.go index 0064a99..00df244 100644 --- a/server/pkg/symbols/enumerator.go +++ b/server/pkg/symbols/enumerator.go @@ -36,3 +36,7 @@ func NewEnumerator(name string, value string, associatedValues []Variable, modul func (e Enumerator) GetHoverInfo() string { return fmt.Sprintf("%s: %s", e.name, e.value) } + +func (e Enumerator) GetCompletionDetail() string { + return "Enumerator" +} diff --git a/server/pkg/symbols/fault.go b/server/pkg/symbols/fault.go index c81b228..3a9adab 100644 --- a/server/pkg/symbols/fault.go +++ b/server/pkg/symbols/fault.go @@ -83,6 +83,10 @@ func (e Fault) GetHoverInfo() string { return e.name } +func (e Fault) GetCompletionDetail() string { + return "Fault" +} + type FaultConstant struct { BaseIndexable } @@ -91,6 +95,10 @@ func (e FaultConstant) GetHoverInfo() string { return e.name } +func (e FaultConstant) GetCompletionDetail() string { + return "Fault Constant" +} + func NewFaultConstant(name string, idRange Range) *FaultConstant { return &FaultConstant{ BaseIndexable: BaseIndexable{ diff --git a/server/pkg/symbols/function.go b/server/pkg/symbols/function.go index cf2ac29..142e636 100644 --- a/server/pkg/symbols/function.go +++ b/server/pkg/symbols/function.go @@ -163,3 +163,15 @@ func (f Function) GetHoverInfo() string { return source } + +func (f Function) GetCompletionDetail() string { + + args := []string{} + for _, arg := range f.argumentIds { + args = append(args, f.Variables[arg].Type.String()+" "+f.Variables[arg].name) + } + + source := fmt.Sprintf("%s %s(%s)", f.GetDeclKeyword(), f.GetReturnType(), strings.Join(args, ", ")) + + return source +} diff --git a/server/pkg/symbols/generic_parameter.go b/server/pkg/symbols/generic_parameter.go index f0449aa..a408686 100644 --- a/server/pkg/symbols/generic_parameter.go +++ b/server/pkg/symbols/generic_parameter.go @@ -22,3 +22,7 @@ func NewGenericParameter(name string, module string, docId string, idRange Range func (g GenericParameter) GetHoverInfo() string { return g.GetName() } + +func (g GenericParameter) GetCompletionDetail() string { + return "Type Parameter" +} diff --git a/server/pkg/symbols/indexable.go b/server/pkg/symbols/indexable.go index da20627..729fafd 100644 --- a/server/pkg/symbols/indexable.go +++ b/server/pkg/symbols/indexable.go @@ -35,6 +35,7 @@ type Indexable interface { GetDocComment() *DocComment GetHoverInfo() string + GetCompletionDetail() string HasSourceCode() bool // This will return false for that code that is not accesible either because it belongs to the stdlib, or inside a .c3lib library. This results in disabling "Go to definition" / "Go to declaration" on these symbols Children() []Indexable diff --git a/server/pkg/symbols/interface.go b/server/pkg/symbols/interface.go index b393cb3..da185c7 100644 --- a/server/pkg/symbols/interface.go +++ b/server/pkg/symbols/interface.go @@ -39,3 +39,7 @@ func (i *Interface) AddMethods(methods []*Function) { func (i Interface) GetHoverInfo() string { return fmt.Sprintf("%s", i.name) } + +func (i Interface) GetCompletionDetail() string { + return "Interface" +} diff --git a/server/pkg/symbols/module.go b/server/pkg/symbols/module.go index 8bfd8c6..51f61a4 100644 --- a/server/pkg/symbols/module.go +++ b/server/pkg/symbols/module.go @@ -139,6 +139,10 @@ func (m *Module) GetHoverInfo() string { return m.name } +func (m *Module) GetCompletionDetail() string { + return "Module" +} + func (m *Module) GetChildrenFunctionByName(name string) option.Option[*Function] { for _, fun := range m.ChildrenFunctions { if fun.GetFullName() == name { diff --git a/server/pkg/symbols/struct.go b/server/pkg/symbols/struct.go index ea81760..5d20a31 100644 --- a/server/pkg/symbols/struct.go +++ b/server/pkg/symbols/struct.go @@ -73,6 +73,11 @@ func (s Struct) GetHoverInfo() string { return fmt.Sprintf("%s", s.name) } +func (s Struct) GetCompletionDetail() string { + // More information on completion probably isn't needed + return "Type" +} + func (s *Struct) InheritMembersFrom(inlinedMemberName string, otherStruct *Struct) { for _, member := range s.GetMembers() { if member.GetType().GetName() == inlinedMemberName { @@ -124,6 +129,15 @@ func (s StructMember) GetHoverInfo() string { return fmt.Sprintf("%s %s", s.baseType, s.name) } +func (s StructMember) GetCompletionDetail() string { + if s.isStruct { + // Anonymous substruct, not much to say + return fmt.Sprintf("Struct member '%s'", s.subStruct.Get().name) + } else { + return s.GetType().String() + } +} + func NewStructMember(name string, fieldType Type, bitRanges option.Option[[2]uint], module string, docId string, idRange Range) StructMember { return StructMember{ baseType: fieldType, diff --git a/server/pkg/symbols/variable.go b/server/pkg/symbols/variable.go index 08e8412..9e9af1e 100644 --- a/server/pkg/symbols/variable.go +++ b/server/pkg/symbols/variable.go @@ -50,3 +50,7 @@ func (v Variable) IsConstant() bool { func (v Variable) GetHoverInfo() string { return fmt.Sprintf("%s %s", v.GetType(), v.GetName()) } + +func (v Variable) GetCompletionDetail() string { + return v.GetType().String() +}