diff --git a/internal/handler/completion.go b/internal/handler/completion.go index 2a7104c..93eb4e8 100644 --- a/internal/handler/completion.go +++ b/internal/handler/completion.go @@ -13,6 +13,7 @@ import ( func (h *langHandler) Completion(ctx context.Context, params *lsp.CompletionParams) (result *lsp.CompletionList, err error) { logger.Debug("Running completion with params", params) + genericDocumentUseCase, err := h.NewGenericDocumentUseCase(params.TextDocumentPositionParams, lsplocal.NestedNodeAtPositionForCompletion) if err != nil { return nil, err diff --git a/internal/handler/definition.go b/internal/handler/definition.go index c62560d..7cd2259 100644 --- a/internal/handler/definition.go +++ b/internal/handler/definition.go @@ -13,11 +13,12 @@ func (h *langHandler) Definition(_ context.Context, params *lsp.DefinitionParams if err != nil { return nil, err } + usecases := []languagefeatures.DefinitionUseCase{ languagefeatures.NewBuiltInObjectsFeature(genericDocumentUseCase), // has to be before template context + languagefeatures.NewVariablesFeature(genericDocumentUseCase), languagefeatures.NewTemplateContextFeature(genericDocumentUseCase), languagefeatures.NewIncludesCallFeature(genericDocumentUseCase), - languagefeatures.NewVariablesFeature(genericDocumentUseCase), } for _, usecase := range usecases { diff --git a/internal/handler/definition_test.go b/internal/handler/definition_test.go index ac441a8..3a52f7f 100644 --- a/internal/handler/definition_test.go +++ b/internal/handler/definition_test.go @@ -3,6 +3,7 @@ package handler import ( "context" "reflect" + "strings" "testing" "github.com/mrjosh/helm-ls/internal/adapter/yamlls" @@ -10,6 +11,7 @@ import ( lsplocal "github.com/mrjosh/helm-ls/internal/lsp" "github.com/mrjosh/helm-ls/internal/util" "github.com/stretchr/testify/assert" + "go.lsp.dev/protocol" lsp "go.lsp.dev/protocol" "go.lsp.dev/uri" yamlv3 "gopkg.in/yaml.v3" @@ -329,3 +331,70 @@ func TestDefinitionValueFileMulitpleValues(t *testing.T) { }, }, nil) } + +func TestDefinitionSingleLine(t *testing.T) { + testCases := []struct { + // defines a definition test where ^ is the position where the defintion is triggered + // and §result§ marks the range of the result + templateWithMarks string + }{ + {"{{ §$test := 1§ }} {{ $te^st }}"}, + {"{{ §$test := .Values.test§ }} {{ $te^st.with.selectorexpression }}"}, + {"{{ §$test := $.Values.test§ }} {{ $te^st.with.selectorexpression. }}"}, + {"{{ §$test := .Values.test§ }} {{ $te^st }}"}, + {"{{ range §$test := .Values.test§ }} {{ $te^st }} {{ end }}"}, + {"{{ range §$test := $.Values.test§ }} {{ $te^st.something }} {{ end }}"}, + {"{{ range §$test := $.Values.test§ }} {{ $te^st. }} {{ end }}"}, + {"{{ range §$test := $.Values.test§ }} {{ if not $te^st }} y {{ else }} n {{ end }}"}, + } + for _, tc := range testCases { + t.Run(tc.templateWithMarks, func(t *testing.T) { + col := strings.Index(tc.templateWithMarks, "^") + buf := strings.Replace(tc.templateWithMarks, "^", "", 1) + pos := protocol.Position{Line: 0, Character: uint32(col - 3)} + expectedColStart := strings.Index(buf, "§") + buf = strings.Replace(buf, "§", "", 1) + expectedColEnd := strings.Index(buf, "§") + buf = strings.Replace(buf, "§", "", 1) + + documents := lsplocal.NewDocumentStore() + fileURI := testDocumentTemplateURI + rootUri := uri.File("/") + + d := lsp.DidOpenTextDocumentParams{ + TextDocument: lsp.TextDocumentItem{ + URI: fileURI, + Text: buf, + }, + } + documents.DidOpen(&d, util.DefaultConfig) + h := &langHandler{ + chartStore: charts.NewChartStore(rootUri, charts.NewChart), + documents: documents, + } + + locations, err := h.Definition(context.TODO(), &lsp.DefinitionParams{ + TextDocumentPositionParams: lsp.TextDocumentPositionParams{ + TextDocument: lsp.TextDocumentIdentifier{URI: fileURI}, + Position: pos, + }, + }) + + assert.NoError(t, err) + + assert.Contains(t, locations, lsp.Location{ + URI: testDocumentTemplateURI, + Range: lsp.Range{ + Start: lsp.Position{ + Line: 0, + Character: uint32(expectedColStart), + }, + End: lsp.Position{ + Line: 0, + Character: uint32(expectedColEnd), + }, + }, + }) + }) + } +}