@@ -6,155 +6,46 @@ import (
6
6
"github.com/docker/docker-language-server/internal/pkg/document"
7
7
"github.com/docker/docker-language-server/internal/tliron/glsp/protocol"
8
8
"github.com/docker/docker-language-server/internal/types"
9
- "github.com/goccy/go-yaml/ast"
10
- "github.com/goccy/go-yaml/token"
11
9
)
12
10
13
- func findSequenceDependencyToken (attributeNode * ast.MappingValueNode , attributeName string , line , column int ) (string , * token.Token ) {
14
- if dependencies , ok := attributeNode .Value .(* ast.SequenceNode ); ok {
15
- for _ , dependency := range dependencies .Values {
16
- dependencyToken := dependency .GetToken ()
17
- if dependencyToken .Position .Line == line && dependencyToken .Position .Column <= column && column <= dependencyToken .Position .Column + len (dependencyToken .Value ) {
18
- return attributeName , dependencyToken
19
- }
20
- }
21
- }
22
- return "" , nil
11
+ func insideRange (rng protocol.Range , line , character protocol.UInteger ) bool {
12
+ return rng .Start .Line == line && rng .Start .Character <= character && character <= rng .End .Character
23
13
}
24
14
25
- func findDependencyToken (attributeNode * ast.MappingValueNode , attributeName string , line , column int ) (string , * token.Token ) {
26
- if attributeNode .Key .GetToken ().Value == attributeName {
27
- return findSequenceDependencyToken (attributeNode , attributeName , line , column )
15
+ func Definition (ctx context.Context , definitionLinkSupport bool , doc document.ComposeDocument , params * protocol.DefinitionParams ) (any , error ) {
16
+ highlights , err := DocumentHighlight (doc , params .Position )
17
+ if err != nil {
18
+ return nil , err
28
19
}
29
- return "" , nil
30
- }
31
-
32
- func lookupReference (serviceNode * ast.MappingValueNode , line , column int ) (string , * token.Token ) {
33
- if serviceAttributes , ok := serviceNode .Value .(* ast.MappingNode ); ok {
34
- for _ , attributeNode := range serviceAttributes .Values {
35
- if attributeNode .Key .GetToken ().Value == "depends_on" {
36
- if _ , ok := attributeNode .Value .(* ast.SequenceNode ); ok {
37
- reference , dependency := findSequenceDependencyToken (attributeNode , "services" , line , column )
38
- if dependency != nil {
39
- return reference , dependency
40
- }
41
- } else if serviceAttributes , ok := attributeNode .Value .(* ast.MappingNode ); ok {
42
- for _ , dependency := range serviceAttributes .Values {
43
- dependencyToken := dependency .Key .GetToken ()
44
- if dependencyToken .Position .Line == line && dependencyToken .Position .Column <= column && column <= dependencyToken .Position .Column + len (dependencyToken .Value ) {
45
- return "services" , dependencyToken
46
- }
47
- }
48
- }
49
- }
50
20
51
- reference , dependency := findDependencyToken (attributeNode , "configs" , line , column )
52
- if dependency != nil {
53
- return reference , dependency
54
- }
55
- reference , dependency = findDependencyToken (attributeNode , "networks" , line , column )
56
- if dependency != nil {
57
- return reference , dependency
58
- }
59
- reference , dependency = findDependencyToken (attributeNode , "secrets" , line , column )
60
- if dependency != nil {
61
- return reference , dependency
21
+ var sourceRange * protocol.Range
22
+ var definitionRange * protocol.Range
23
+ for _ , highlight := range highlights {
24
+ if * highlight .Kind == protocol .DocumentHighlightKindWrite {
25
+ definitionRange = & highlight .Range
26
+ if insideRange (highlight .Range , params .Position .Line , params .Position .Character ) {
27
+ sourceRange = & highlight .Range
28
+ break
62
29
}
63
30
}
64
31
}
65
- return "" , nil
66
- }
67
32
68
- func lookupDependency (node * ast.MappingValueNode , line , column int ) (string , * token.Token ) {
69
- if s , ok := node .Key .(* ast.StringNode ); ok && s .Value == "services" {
70
- if servicesNode , ok := node .Value .(* ast.MappingNode ); ok {
71
- for _ , serviceNode := range servicesNode .Values {
72
- reference , dependency := lookupReference (serviceNode , line , column )
73
- if dependency != nil {
74
- return reference , dependency
75
- }
33
+ for _ , highlight := range highlights {
34
+ if * highlight .Kind == protocol .DocumentHighlightKindRead {
35
+ if insideRange (highlight .Range , params .Position .Line , params .Position .Character ) {
36
+ sourceRange = & highlight .Range
37
+ break
76
38
}
77
- } else if valueNode , ok := node .Value .(* ast.MappingValueNode ); ok {
78
- return lookupReference (valueNode , line , column )
79
39
}
80
40
}
81
- return "" , nil
82
- }
83
41
84
- func findDefinition (node * ast.MappingValueNode , referenceType , referenceName string ) * token.Token {
85
- if s , ok := node .Key .(* ast.StringNode ); ok && s .Value == referenceType {
86
- if servicesNode , ok := node .Value .(* ast.MappingNode ); ok {
87
- for _ , serviceNode := range servicesNode .Values {
88
- if serviceNode .Key .GetToken ().Value == referenceName {
89
- return serviceNode .Key .GetToken ()
90
- }
91
- }
92
- } else if networks , ok := node .Value .(* ast.MappingValueNode ); ok {
93
- if networks .Key .GetToken ().Value == referenceName {
94
- return networks .Key .GetToken ()
95
- }
96
- }
97
- }
98
- return nil
99
- }
100
-
101
- func Definition (ctx context.Context , definitionLinkSupport bool , doc document.ComposeDocument , params * protocol.DefinitionParams ) (any , error ) {
102
- line := int (params .Position .Line ) + 1
103
- character := int (params .Position .Character ) + 1
104
-
105
- file := doc .File ()
106
- if file == nil || len (file .Docs ) == 0 {
107
- return nil , nil
108
- }
109
-
110
- if mappingNode , ok := file .Docs [0 ].Body .(* ast.MappingNode ); ok {
111
- for _ , node := range mappingNode .Values {
112
- reference , dependency := lookupDependency (node , line , character )
113
- if dependency != nil {
114
- for _ , node := range mappingNode .Values {
115
- referenced := findDefinition (node , reference , dependency .Value )
116
- if referenced != nil {
117
- return dependencyLink (definitionLinkSupport , params , referenced , dependency ), nil
118
- }
119
- }
120
- return nil , nil
121
- }
122
- }
123
- } else if mappingNodeValue , ok := file .Docs [0 ].Body .(* ast.MappingValueNode ); ok {
124
- reference , dependency := lookupDependency (mappingNodeValue , line , character )
125
- if dependency != nil {
126
- referenced := findDefinition (mappingNodeValue , reference , dependency .Value )
127
- if referenced != nil {
128
- return dependencyLink (definitionLinkSupport , params , referenced , dependency ), nil
129
- }
130
- }
42
+ if definitionRange != nil {
43
+ return types .CreateDefinitionResult (
44
+ definitionLinkSupport ,
45
+ * definitionRange ,
46
+ sourceRange ,
47
+ params .TextDocument .URI ,
48
+ ), nil
131
49
}
132
50
return nil , nil
133
51
}
134
-
135
- func dependencyLink (definitionLinkSupport bool , params * protocol.DefinitionParams , referenced , dependency * token.Token ) any {
136
- return types .CreateDefinitionResult (
137
- definitionLinkSupport ,
138
- protocol.Range {
139
- Start : protocol.Position {
140
- Line : protocol .UInteger (referenced .Position .Line - 1 ),
141
- Character : protocol .UInteger (referenced .Position .Column - 1 ),
142
- },
143
- End : protocol.Position {
144
- Line : protocol .UInteger (referenced .Position .Line - 1 ),
145
- Character : protocol .UInteger (referenced .Position .Column + len (referenced .Value ) - 1 ),
146
- },
147
- },
148
- & protocol.Range {
149
- Start : protocol.Position {
150
- Line : params .Position .Line ,
151
- Character : protocol .UInteger (dependency .Position .Column - 1 ),
152
- },
153
- End : protocol.Position {
154
- Line : params .Position .Line ,
155
- Character : protocol .UInteger (dependency .Position .Column + len (dependency .Value ) - 1 ),
156
- },
157
- },
158
- params .TextDocument .URI ,
159
- )
160
- }
0 commit comments