@@ -10,14 +10,15 @@ import {
1010 CompletionItemKind ,
1111 TextDocumentPositionParams ,
1212 TextDocumentSyncKind ,
13- InitializeResult
13+ InitializeResult ,
14+ Location
1415} from 'vscode-languageserver/node' ;
1516
1617import { test_compile } from '../mipsy_vscode/pkg/mipsy_vscode' ;
1718
1819import {
1920 Position ,
20- TextDocument
21+ TextDocument ,
2122} from 'vscode-languageserver-textdocument' ;
2223
2324import { 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 - z A - z . 0 - 9 ] * $ / . exec ( before ) || [ '' ] ) [ 0 ] || '' ;
287+ const beforeWord = ( / \$ ? [ a - z A - Z . 0 - 9 ] * $ / . exec ( before ) || [ '' ] ) [ 0 ] || '' ;
286288 const beforeWithLabelsRemoved = before . replace ( / [ A - Z a - z _ ] [ A - Z a - 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 - z A - Z . 0 - 9 ] * $ / . exec ( before ) || [ '' ] ) [ 0 ] || '' ;
426+ const afterWord = ( / ^ \$ ? [ a - z A - 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
415464documents . listen ( connection ) ;
416465
0 commit comments