@@ -39,22 +39,41 @@ export class YaraDefinitionProvider implements vscode.DefinitionProvider {
39
39
export class YaraReferenceProvider implements vscode . ReferenceProvider {
40
40
public provideReferences ( doc : vscode . TextDocument , pos : vscode . Position , options : { includeDeclaration : boolean } , token : vscode . CancellationToken ) : Thenable < vscode . Location [ ] > {
41
41
return new Promise ( ( resolve , reject ) => {
42
- let references : vscode . Location [ ] = new Array < vscode . Location > ( ) ;
42
+ const varFirstChar = new Set ( [ "$" , "#" , "@" , "!" ] ) ;
43
43
const fileUri : vscode . Uri = vscode . Uri . file ( doc . fileName ) ;
44
44
const range : vscode . Range = doc . getWordRangeAtPosition ( pos ) ;
45
- const symbol : string = doc . getText ( range ) ;
46
- // console.log(`Providing references for symbol '${symbol}'`);
47
45
let lines : string [ ] = doc . getText ( ) . split ( "\n" ) ;
48
- let lineNo = 0 ;
49
- lines . forEach ( line => {
50
- let character : number = line . indexOf ( symbol ) ;
51
- if ( character != - 1 ) {
52
- // console.log(`Found ${symbol} on line ${lineNo} at character ${character}`);
53
- let refPosition : vscode . Position = new vscode . Position ( lineNo , character ) ;
54
- references . push ( new vscode . Location ( fileUri , refPosition ) ) ;
55
- }
56
- lineNo ++ ;
57
- } ) ;
46
+ let references : vscode . Location [ ] = new Array < vscode . Location > ( ) ;
47
+ let symbol : string = doc . getText ( range ) ;
48
+ // console.log(`Providing references for symbol '${symbol}'`);
49
+ let possibleVarStart : vscode . Position = new vscode . Position ( range . start . line , range . start . character - 1 ) ;
50
+ let possibleVarRange : vscode . Range = new vscode . Range ( possibleVarStart , range . end ) ;
51
+ let possibleVar : string = doc . getText ( possibleVarRange ) ;
52
+ if ( varFirstChar . has ( possibleVar . charAt ( 0 ) ) ) {
53
+ // console.log(`Identified symbol as a variable: ${symbol}`);
54
+ let lineNo = 0 ;
55
+ lines . forEach ( line => {
56
+ let character : number = line . search ( `[\$#@!]${ symbol } [^a-zA-Z0-9_]` ) ;
57
+ if ( character != - 1 ) {
58
+ // console.log(`Found ${symbol} on line ${lineNo} at character ${character}`);
59
+ let refPosition : vscode . Position = new vscode . Position ( lineNo , character ) ;
60
+ references . push ( new vscode . Location ( fileUri , refPosition ) ) ;
61
+ }
62
+ lineNo ++ ;
63
+ } ) ;
64
+ }
65
+ else {
66
+ let lineNo = 0 ;
67
+ lines . forEach ( line => {
68
+ let character : number = line . indexOf ( symbol ) ;
69
+ if ( character != - 1 ) {
70
+ // console.log(`Found ${symbol} on line ${lineNo} at character ${character}`);
71
+ let refPosition : vscode . Position = new vscode . Position ( lineNo , character ) ;
72
+ references . push ( new vscode . Location ( fileUri , refPosition ) ) ;
73
+ }
74
+ lineNo ++ ;
75
+ } ) ;
76
+ }
58
77
if ( references != null ) {
59
78
resolve ( references ) ;
60
79
}
0 commit comments