Skip to content

Commit 751180f

Browse files
fix: Fix definition
1 parent db8733f commit 751180f

File tree

3 files changed

+70
-12
lines changed

3 files changed

+70
-12
lines changed

internal/handler/definition.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func definition(url, text string, params lsp.DefinitionParams, dbCache *database
5252
return nil, nil
5353
}
5454

55-
aliases := parseutil.ExtractAliasedIdentifer(parsed)
55+
aliases := parseutil.ExtractAliased(parsed)
5656
if len(aliases) == 0 {
5757
return nil, nil
5858
}
@@ -62,9 +62,14 @@ func definition(url, text string, params lsp.DefinitionParams, dbCache *database
6262
alias, _ := v.(*ast.Aliased)
6363
if alias.AliasedName.String() == currentVariable.String() {
6464
define = alias.AliasedName
65+
break
6566
}
6667
}
6768

69+
if define == nil {
70+
return nil, nil
71+
}
72+
6873
res := []lsp.Location{
6974
{
7075
URI: url,

internal/handler/definition_test.go

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,79 @@ import (
1010
)
1111

1212
var definitionTestCases = []struct {
13-
name string
14-
input string
15-
output lsp.Definition
16-
pos lsp.Position
13+
name string
14+
input string
15+
pos lsp.Position
16+
want lsp.Definition
1717
}{
1818
{
19-
name: "",
20-
input: "SELECT ci.ID, ci.Name FROM city as ci",
21-
output: []lsp.Location{
19+
name: "subquery",
20+
input: "SELECT it.ID, it.Name FROM (SELECT ci.ID, ci.Name, ci.CountryCode, ci.District, ci.Population FROM city AS ci) as it",
21+
pos: lsp.Position{
22+
Line: 0,
23+
Character: 8,
24+
},
25+
want: []lsp.Location{
2226
{
2327
URI: testFileURI,
2428
Range: lsp.Range{
2529
Start: lsp.Position{
2630
Line: 0,
27-
Character: 35,
31+
Character: 114,
2832
},
2933
End: lsp.Position{
3034
Line: 0,
31-
Character: 37,
35+
Character: 116,
3236
},
3337
},
3438
},
3539
},
40+
},
41+
{
42+
name: "inner subquery",
43+
input: "SELECT it.ID, it.Name FROM (SELECT ci.ID, ci.Name, ci.CountryCode, ci.District, ci.Population FROM city AS ci) as it",
44+
pos: lsp.Position{
45+
Line: 0,
46+
Character: 36,
47+
},
48+
want: []lsp.Location{
49+
{
50+
URI: testFileURI,
51+
Range: lsp.Range{
52+
Start: lsp.Position{
53+
Line: 0,
54+
Character: 107,
55+
},
56+
End: lsp.Position{
57+
Line: 0,
58+
Character: 109,
59+
},
60+
},
61+
},
62+
},
63+
},
64+
{
65+
name: "alias",
66+
input: "SELECT ci.ID, ci.Name FROM city as ci",
3667
pos: lsp.Position{
3768
Line: 0,
3869
Character: 8,
3970
},
71+
want: []lsp.Location{
72+
{
73+
URI: testFileURI,
74+
Range: lsp.Range{
75+
Start: lsp.Position{
76+
Line: 0,
77+
Character: 35,
78+
},
79+
End: lsp.Position{
80+
Line: 0,
81+
Character: 37,
82+
},
83+
},
84+
},
85+
},
4086
},
4187
}
4288

@@ -71,7 +117,7 @@ func TestDefinition(t *testing.T) {
71117
return
72118
}
73119

74-
if diff := cmp.Diff(tt.output, got); diff != "" {
120+
if diff := cmp.Diff(tt.want, got); diff != "" {
75121
t.Errorf("unmatch hover contents (- want, + got):\n%s", diff)
76122
}
77123
})
@@ -109,7 +155,7 @@ func TestTypeDefinition(t *testing.T) {
109155
return
110156
}
111157

112-
if diff := cmp.Diff(tt.output, got); diff != "" {
158+
if diff := cmp.Diff(tt.want, got); diff != "" {
113159
t.Errorf("unmatch hover contents (- want, + got):\n%s", diff)
114160
}
115161
})

parser/parseutil/extract.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ func ExtractWhereCondition(parsed ast.TokenList) []ast.Node {
119119
return filterPrefixGroup(astutil.NewNodeReader(parsed), prefixMatcher, peekMatcher)
120120
}
121121

122+
func ExtractAliased(parsed ast.TokenList) []ast.Node {
123+
reader := astutil.NewNodeReader(parsed)
124+
matcher := astutil.NodeMatcher{NodeTypes: []ast.NodeType{ast.TypeAliased}}
125+
aliases := reader.FindRecursive(matcher)
126+
return aliases
127+
}
128+
122129
func ExtractAliasedIdentifer(parsed ast.TokenList) []ast.Node {
123130
reader := astutil.NewNodeReader(parsed)
124131
matcher := astutil.NodeMatcher{NodeTypes: []ast.NodeType{ast.TypeAliased}}

0 commit comments

Comments
 (0)