@@ -109,31 +109,96 @@ function symbolKindDesc(kind) {
109109
110110exports . symbolKindDesc = symbolKindDesc ;
111111
112- const backwardRegex = / [ a - z A - Z 0 - 9 _ . : ] / ; // parse all the bases
113- const forwardRegex = / [ a - z A - Z 0 - 9 _ ] / ; // parse only the name
114- function extendTextRange ( content , from , options ) {
115- let range = { start : from , end : from } ;
112+ function isalpha ( c ) {
113+ return ( c >= 'a' && c <= 'z' ) || ( c >= 'A' && c <= 'Z' ) ;
114+ }
116115
117- let offset = from ;
118- if ( options . backward ) {
119- while ( offset -- >= 0 ) {
120- if ( ! backwardRegex . test ( content . charAt ( offset ) ) ) {
121- range . start = offset + 1 ;
116+ function isdigit ( c ) {
117+ return c >= '0' && c <= '9' ;
118+ }
119+
120+ function skip ( pattern , content , offset , step ) {
121+ while ( pattern . test ( content . charAt ( offset ) ) ) {
122+ offset += step ;
123+ }
124+ return offset ;
125+ }
126+
127+ function backward ( content , offset , collection ) {
128+ let bracketDepth = 0 ;
129+ while ( true ) {
130+ let c = content . charAt ( offset ) ;
131+ if ( c === '.' || c === ':' ) {
132+ if ( bracketDepth === 0 ) {
133+ collection . push ( c ) ;
134+ }
135+ offset -- ;
136+ offset = skip ( / \s / , content , offset , - 1 ) ;
137+ continue ;
138+ }
139+
140+ if ( c === ')' ) {
141+ bracketDepth ++ ;
142+ offset -- ;
143+ continue ;
144+ }
145+
146+ if ( c === '(' ) {
147+ bracketDepth -- ;
148+ if ( bracketDepth < 0 ) {
149+ break ;
150+ }
151+ offset -- ;
152+ continue ;
153+ }
154+
155+ if ( isalpha ( c ) || isdigit ( c ) || c === '_' ) {
156+ offset -- ;
157+ if ( bracketDepth === 0 ) {
158+ collection . push ( c ) ;
159+ }
160+ continue ;
161+ }
162+
163+ if ( c === ' ' || c === ',' ) {
164+ if ( bracketDepth === 0 ) {
122165 break ;
123166 }
167+ offset -- ;
168+ continue ;
124169 }
170+
171+ break ;
172+ }
173+
174+ collection . reverse ( ) ;
175+ return offset + 1 ;
176+ }
177+
178+ const forwardRegex = / [ a - z A - Z 0 - 9 _ ] / ; // parse only the name
179+ function extendTextRange ( content , from , options ) {
180+ let range = { start : from , end : from , text : '' } ;
181+ let offset = from ;
182+ let collection = [ ] ;
183+ if ( options . backward ) {
184+ offset = backward ( content , offset , collection ) ;
185+ range . start = offset ;
125186 }
126187
127188 if ( options . forward ) {
128189 offset = from ;
129190 while ( offset ++ <= content . length ) {
130- if ( ! forwardRegex . test ( content . charAt ( offset ) ) ) {
191+ let c = content . charAt ( offset ) ;
192+ if ( ! forwardRegex . test ( c ) ) {
131193 range . end = offset ;
132194 break ;
133195 }
196+ collection . push ( c ) ;
134197 }
135198 }
136199
200+ range . text = collection . join ( '' ) ;
201+
137202 return range ;
138203}
139204
@@ -168,10 +233,7 @@ function symbolAtPosition(position, doc, options) {
168233 return undefined ;
169234 }
170235
171- // let ref = parseContext(text.substring(range.start, range.end));
172- let ref = { name : text . substring ( range . start , range . end ) , range : [ range . start , range . end ] } ;
173- // ref.location = { start: position, end: position }; // used for scope filter
174-
236+ let ref = { name : range . text , range : [ range . start , range . end ] } ;
175237 return ref ;
176238}
177239
@@ -190,7 +252,11 @@ function symbolSignature(symbol, override) {
190252 return details . join ( '' ) ;
191253 }
192254
193- let returns = ( override !== undefined ) ? type . variants [ override ] . returns : type . returns ;
255+ let returns = type . returns ;
256+ if ( ! returns && override !== undefined ) {
257+ returns = type . variants [ override ] . returns ;
258+ }
259+ returns = returns || [ ] ;
194260 let ret = returns . map ( item => {
195261 let typeName = engine . typeOf ( item ) . typeName ;
196262 typeName = typeName . startsWith ( '@' ) ? 'any' : typeName ;
0 commit comments