@@ -13,6 +13,11 @@ export class ObjectScriptDefinitionProvider implements vscode.DefinitionProvider
13
13
let lineText = document . lineAt ( position . line ) . text ;
14
14
let file = currentFile ( ) ;
15
15
16
+ let fromClassRef = this . classRef ( document , position ) ;
17
+ if ( fromClassRef ) {
18
+ return fromClassRef ;
19
+ }
20
+
16
21
let selfRef = document . getWordRangeAtPosition ( position , / \. \. % ? [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + (?: \. [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + ) * / ) ;
17
22
if ( selfRef ) {
18
23
let selfEntity = document . getText ( selfRef ) . substr ( 2 ) ;
@@ -39,24 +44,8 @@ export class ObjectScriptDefinitionProvider implements vscode.DefinitionProvider
39
44
if ( part . match ( asClass ) ) {
40
45
let [ keyword , name ] = part . split ( ' ' ) ;
41
46
let start = pos + keyword . length + 1 ;
42
- let end = pos + part . length ;
43
- if ( this . isValid ( position , start , end ) ) {
44
- return [ this . makeClassDefinition ( position , start , end , this . normalizeClassName ( document , name ) ) ] ;
45
- }
46
- }
47
- pos += part . length ;
48
- }
49
-
50
- let classRef = / ( # # c l a s s \( [ ^ ) ] + \) ) / i;
51
- parts = lineText . split ( classRef ) ;
52
- pos = 0 ;
53
- for ( let part of parts ) {
54
- if ( part . match ( classRef ) ) {
55
- let [ , name ] = / # # c l a s s \( ( [ ^ ) ] + ) \) / i. exec ( part ) ;
56
- let start = pos + 8 ;
57
- let end = pos + part . length - 1 ;
58
- if ( this . isValid ( position , start , end ) ) {
59
- return [ this . makeClassDefinition ( position , start , end , this . normalizeClassName ( document , name ) ) ] ;
47
+ if ( this . isValid ( position , start , name . length ) ) {
48
+ return [ this . makeClassDefinition ( position , start , name . length , this . normalizeClassName ( document , name ) ) ] ;
60
49
}
61
50
}
62
51
pos += part . length ;
@@ -67,25 +56,27 @@ export class ObjectScriptDefinitionProvider implements vscode.DefinitionProvider
67
56
pos = 0 ;
68
57
for ( let part of parts ) {
69
58
if ( part . match ( asClassList ) ) {
70
- let listClasses = / \( ( [ ^ ) ] + ) \) / . exec ( part ) [ 1 ] . split ( ',' ) ;
71
- for ( let name of listClasses ) {
72
- name = name . trim ( ) ;
73
- let start = pos + part . indexOf ( name ) ;
74
- let end = start + name . length ;
75
- if ( this . isValid ( position , start , end ) ) {
76
- return [ this . makeClassDefinition ( position , start , end , this . normalizeClassName ( document , name ) ) ] ;
77
- }
78
- }
59
+ let listClasses = / \( ( [ ^ ) ] + ) \) / . exec ( part ) [ 1 ] . split ( / \s * , \s * / ) ;
60
+ return listClasses
61
+ . map ( name => {
62
+ name = name . trim ( ) ;
63
+ let start = pos + part . indexOf ( name ) ;
64
+ if ( this . isValid ( position , start , name . length ) ) {
65
+ return this . makeClassDefinition ( position , start , name . length , this . normalizeClassName ( document , name ) ) ;
66
+ }
67
+ } )
68
+ . filter ( el => el != null ) ;
79
69
}
80
70
pos += part . length ;
81
71
}
82
72
83
73
if ( lineText . match ( / ^ # ? (?: I n c l u d e | I n c l u d e G e n e r a t o r ) % ? \b [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + (?: \. [ a - z A - Z ] [ a - z A - Z 0 - 9 ] + ) * \b / i) ) {
84
74
let [ , name ] = lineText . split ( ' ' ) ;
85
75
let start = lineText . indexOf ( ' ' ) + 1 ;
86
- let end = start + name . length ;
87
- if ( this . isValid ( position , start , end ) ) {
88
- return [ this . makeRoutineDefinition ( position , start , end , this . normalizeRoutineName ( document , name , 'inc' ) ) ] ;
76
+ if ( this . isValid ( position , start , name . length ) ) {
77
+ return [
78
+ this . makeRoutineDefinition ( position , start , name . length , this . normalizeRoutineName ( document , name , 'inc' ) )
79
+ ] ;
89
80
}
90
81
}
91
82
@@ -98,9 +89,10 @@ export class ObjectScriptDefinitionProvider implements vscode.DefinitionProvider
98
89
for ( let name of listRoutines ) {
99
90
name = name . trim ( ) ;
100
91
let start = pos + part . indexOf ( name ) ;
101
- let end = start + name . length ;
102
- if ( this . isValid ( position , start , end ) ) {
103
- return [ this . makeRoutineDefinition ( position , start , end , this . normalizeRoutineName ( document , name , 'inc' ) ) ] ;
92
+ if ( this . isValid ( position , start , name . length ) ) {
93
+ return [
94
+ this . makeRoutineDefinition ( position , start , name . length , this . normalizeRoutineName ( document , name , 'inc' ) )
95
+ ] ;
104
96
}
105
97
}
106
98
}
@@ -110,8 +102,30 @@ export class ObjectScriptDefinitionProvider implements vscode.DefinitionProvider
110
102
return [ ] ;
111
103
}
112
104
113
- isValid ( position : vscode . Position , start : number , end : number ) : boolean {
114
- return position . character >= start && position . character <= end ;
105
+ classRef (
106
+ document : vscode . TextDocument ,
107
+ position : vscode . Position
108
+ ) : vscode . ProviderResult < vscode . Location | vscode . Location [ ] | vscode . DefinitionLink [ ] > {
109
+ let classRef = / # # c l a s s \( ( [ ^ ) ] + ) \) (?: \\ $ t h i s ) ? \. ( # ? % ? [ a - z A - Z ] [ a - z A - Z 0 - 9 ] * ) / i;
110
+ let classRefRange = document . getWordRangeAtPosition ( position , classRef ) ;
111
+ if ( classRefRange ) {
112
+ let [ , className , entity ] = document . getText ( classRefRange ) . match ( classRef ) ;
113
+ let start = classRefRange . start . character + 8 ;
114
+ if ( this . isValid ( position , start , className . length ) ) {
115
+ return [
116
+ this . makeClassDefinition ( position , start , className . length , this . normalizeClassName ( document , className ) )
117
+ ] ;
118
+ } else {
119
+ let classDefinition = new ClassDefinition ( className ) ;
120
+ return classDefinition . getPosition ( entity ) ;
121
+ }
122
+ }
123
+
124
+ return null ;
125
+ }
126
+
127
+ isValid ( position : vscode . Position , start : number , length : number ) : boolean {
128
+ return position . character >= start && position . character <= start + length ;
115
129
}
116
130
117
131
normalizeClassName ( document : vscode . TextDocument , name : string ) : string {
@@ -149,24 +163,24 @@ export class ObjectScriptDefinitionProvider implements vscode.DefinitionProvider
149
163
return '' ;
150
164
}
151
165
152
- makeClassDefinition ( position : vscode . Position , start : number , end : number , name : string ) : vscode . DefinitionLink {
166
+ makeClassDefinition ( position : vscode . Position , start : number , length : number , name : string ) : vscode . DefinitionLink {
153
167
let firstLinePos = new vscode . Position ( 0 , 0 ) ;
154
168
return {
155
169
originSelectionRange : new vscode . Range (
156
170
new vscode . Position ( position . line , start ) ,
157
- new vscode . Position ( position . line , end )
171
+ new vscode . Position ( position . line , start + length )
158
172
) ,
159
173
targetRange : new vscode . Range ( firstLinePos , firstLinePos ) ,
160
174
targetUri : DocumentContentProvider . getUri ( name )
161
175
} ;
162
176
}
163
177
164
- makeRoutineDefinition ( position : vscode . Position , start : number , end : number , name : string ) : vscode . DefinitionLink {
178
+ makeRoutineDefinition ( position : vscode . Position , start : number , length : number , name : string ) : vscode . DefinitionLink {
165
179
let firstLinePos = new vscode . Position ( 0 , 0 ) ;
166
180
return {
167
181
originSelectionRange : new vscode . Range (
168
182
new vscode . Position ( position . line , start ) ,
169
- new vscode . Position ( position . line , end )
183
+ new vscode . Position ( position . line , start + length )
170
184
) ,
171
185
targetRange : new vscode . Range ( firstLinePos , firstLinePos ) ,
172
186
targetUri : DocumentContentProvider . getUri ( name )
0 commit comments