Skip to content

Commit ab6c23b

Browse files
committed
add definition provider
1 parent 7c8406c commit ab6c23b

File tree

1 file changed

+53
-4
lines changed

1 file changed

+53
-4
lines changed

src/server.ts

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,15 @@ import {
1010
CompletionItemKind,
1111
TextDocumentPositionParams,
1212
TextDocumentSyncKind,
13-
InitializeResult
13+
InitializeResult,
14+
Location
1415
} from 'vscode-languageserver/node';
1516

1617
import { test_compile } from '../mipsy_vscode/pkg/mipsy_vscode';
1718

1819
import {
1920
Position,
20-
TextDocument
21+
TextDocument,
2122
} from 'vscode-languageserver-textdocument';
2223

2324
import { suggestions as staticSuggestions } from './lsp_data.json';
@@ -54,7 +55,8 @@ connection.onInitialize((params: InitializeParams) => {
5455
labelDetailsSupport: true
5556
},
5657
// resolveProvider: true
57-
}
58+
},
59+
definitionProvider: {}
5860
}
5961
};
6062

@@ -282,7 +284,7 @@ connection.onCompletion((textDocumentPosition: TextDocumentPositionParams): Comp
282284
return [];
283285
}
284286

285-
const beforeWord = (/\$?[a-zA-z.0-9]*$/.exec(before) || [''])[0] || '';
287+
const beforeWord = (/\$?[a-zA-Z.0-9]*$/.exec(before) || [''])[0] || '';
286288
const beforeWithLabelsRemoved = before.replace(/[A-Za-z_][A-Za-z_0-9.]*[ \t]*:/g, '');
287289

288290
const isStartOfLine = /^[ \t]*$/.test(
@@ -411,6 +413,53 @@ connection.onCompletion((textDocumentPosition: TextDocumentPositionParams): Comp
411413
return result;
412414
});
413415

416+
function getWordAtPosition(params: TextDocumentPositionParams) {
417+
const lineNum = params.position.line;
418+
const colNum = params.position.character;
419+
const uri = params.textDocument.uri;
420+
const line = (splitSources[uri] || [])[lineNum] || '';
421+
422+
const before = line.slice(0, colNum);
423+
const after = line.slice(colNum);
424+
425+
const beforeWord = (/\$?[a-zA-Z.0-9]*$/.exec(before) || [''])[0] || '';
426+
const afterWord = (/^\$?[a-zA-Z.0-9]*/.exec(after) || [''])[0] || '';
427+
428+
// console.log({beforeWord, afterWord});
429+
430+
return beforeWord + afterWord;
431+
}
432+
433+
connection.onDefinition(params => {
434+
const uri = params.textDocument.uri;
435+
const definitions = getDefinitions(uri);
436+
const word = getWordAtPosition(params);
437+
438+
const result: Location[] = [];
439+
440+
for (let definition of definitions) {
441+
if (definition.identifier === word) {
442+
const line = definition.line;
443+
444+
result.push({
445+
range: {
446+
start: {
447+
line,
448+
character: 0
449+
},
450+
end: {
451+
line,
452+
character: Number.MAX_SAFE_INTEGER
453+
}
454+
},
455+
uri
456+
});
457+
}
458+
}
459+
// console.log({result});
460+
return result;
461+
});
462+
414463

415464
documents.listen(connection);
416465

0 commit comments

Comments
 (0)