Skip to content

Commit

Permalink
feat: add getVariableDefinition
Browse files Browse the repository at this point in the history
  • Loading branch information
qvalentin committed May 29, 2024
1 parent 552c020 commit 12b7f34
Show file tree
Hide file tree
Showing 7 changed files with 295 additions and 91 deletions.
4 changes: 0 additions & 4 deletions internal/lsp/symbol_table.go
Original file line number Diff line number Diff line change
Expand Up @@ -100,10 +100,6 @@ func (s *SymbolTable) GetIncludeReference(symbol string) []sitter.Range {
return append(result, definitions...)
}

func (s *SymbolTable) AddVariableDefinition(symbol string, variableDefinition VariableDefinition) {
s.variableDefinitions[symbol] = append(s.variableDefinitions[symbol], variableDefinition)
}

func (s *SymbolTable) parseTree(ast *sitter.Tree, content []byte) {
rootNode := ast.RootNode()
v := Visitors{
Expand Down
87 changes: 87 additions & 0 deletions internal/lsp/symbol_table_variable_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package lsp

import (
"fmt"
"testing"

sitter "github.com/smacker/go-tree-sitter"
"github.com/stretchr/testify/assert"
)

func TestGetVariableDefinition(t *testing.T) {
testCases := []struct {
template string
variableName string
accessRange sitter.Range // the range must currently only contain the bytes
expectedValue string
expectedError error
}{
{
template: `{{ $x := "hello" }} {{ $x }}`,
variableName: "$x",
accessRange: sitter.Range{
StartByte: 20,
EndByte: 21,
},
expectedValue: `"hello"`,
expectedError: nil,
},
{
template: `
{{ if true }}
{{ $x := "hello" }} {{ $x }}
{{ end }}
{{ if false }}
{{ $x := "goodby" }} {{ $x }}
{{ end }}
`,
variableName: "$x",
accessRange: sitter.Range{
StartByte: 46,
EndByte: 47,
},
expectedValue: `"hello"`,
expectedError: nil,
},
{
template: `
{{ if true }}
{{ $x := "hello" }} {{ $x }}
{{ end }}
{{ if false }}
{{ $x := "goodby" }} {{ $x }}
{{ end }}
`,
variableName: "$x",
accessRange: sitter.Range{
StartByte: 110,
EndByte: 111,
},
expectedValue: `"goodby"`,
expectedError: nil,
},
{
template: `
{{ if true }}
{{ $x := "hello" }} {{ $x }}
{{ end }}
`,
variableName: "$x",
accessRange: sitter.Range{
StartByte: 67,
EndByte: 68,
},
expectedValue: ``,
expectedError: fmt.Errorf("variable $x not found"),
},
}
for _, tC := range testCases {
t.Run(tC.template, func(t *testing.T) {
ast := ParseAst(nil, tC.template)
symbolTable := NewSymbolTable(ast, []byte(tC.template))
result, err := symbolTable.getVariableDefinition(tC.variableName, tC.accessRange)
assert.Equal(t, tC.expectedError, err)
assert.Equal(t, tC.expectedValue, result.Value)
})
}
}
47 changes: 47 additions & 0 deletions internal/lsp/symbol_table_variables.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package lsp

import (
"fmt"

"github.com/mrjosh/helm-ls/internal/util"
sitter "github.com/smacker/go-tree-sitter"
)

type VariableType int64

const (
VariableTypeAssigment VariableType = iota
VariableTypeRangeKeyOrIndex
VariableTypeRangeValue
)

type VariableDefinition struct {
Value string
VariableType VariableType
Scope sitter.Range
Range sitter.Range
}

func (s *SymbolTable) AddVariableDefinition(symbol string, variableDefinition VariableDefinition) {
s.variableDefinitions[symbol] = append(s.variableDefinitions[symbol], variableDefinition)
}

func (s *SymbolTable) getVariableDefinition(name string, accessRange sitter.Range) (VariableDefinition, error) {
definitions, ok := s.variableDefinitions[name]
if !ok || len(definitions) == 0 {
return VariableDefinition{}, fmt.Errorf("variable %s not found", name)
}
for _, definition := range definitions {
if util.RangeContainsRange(definition.Scope, accessRange) {
return definition, nil
}
}
return VariableDefinition{}, fmt.Errorf("variable %s not found", name)
}

func (s *SymbolTable) GetVariableDefinitionForNode(node *sitter.Node) (VariableDefinition, error) {
if node == nil {
return VariableDefinition{}, fmt.Errorf("Cannot get variable definition for node")
}
return VariableDefinition{}, fmt.Errorf("Cannot get variable definition for node")
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,17 @@ func TestSymbolTableForVariableDefinitions(t *testing.T) {
{
Value: ".",
VariableType: VariableTypeAssigment,
Range: sitter.Range{
// TODO: fill this with the correct result
Scope: sitter.Range{
StartPoint: sitter.Point{
Row: 0,
Column: 14,
},
EndPoint: sitter.Point{
Row: 0,
Column: 19,
},
StartByte: 14,
EndByte: 19,
},
},
},
Expand All @@ -40,17 +49,35 @@ func TestSymbolTableForVariableDefinitions(t *testing.T) {
{
Value: "$root.Values.deployments",
VariableType: VariableTypeRangeKeyOrIndex,
Range: sitter.Range{
// TODO: fill this with the correct result
Scope: sitter.Range{
StartPoint: sitter.Point{
Row: 1,
Column: 60,
},
EndPoint: sitter.Point{
Row: 3,
Column: 15,
},
StartByte: 61,
EndByte: 101,
},
},
},
"$config": {
{
Value: "$root.Values.deployments",
VariableType: VariableTypeRangeValue,
Range: sitter.Range{
// TODO: fill this with the correct result
Scope: sitter.Range{
StartPoint: sitter.Point{
Row: 1,
Column: 60,
},
EndPoint: sitter.Point{
Row: 3,
Column: 15,
},
StartByte: 61,
EndByte: 101,
},
},
},
Expand All @@ -63,8 +90,17 @@ func TestSymbolTableForVariableDefinitions(t *testing.T) {
{
Value: ".Values",
VariableType: VariableTypeAssigment,
Range: sitter.Range{
// TODO: fill this with the correct result
Scope: sitter.Range{
StartPoint: sitter.Point{
Row: 0,
Column: 16,
},
EndPoint: sitter.Point{
Row: 0,
Column: 50,
},
StartByte: 16,
EndByte: 50,
},
},
},
Expand Down
79 changes: 0 additions & 79 deletions internal/lsp/symobol_table_variables.go

This file was deleted.

Loading

0 comments on commit 12b7f34

Please sign in to comment.