diff --git a/server/package-lock.json b/server/package-lock.json index 1710b53..c0573f8 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -8,7 +8,7 @@ "name": "aqua-ls-server", "version": "0.0.1", "dependencies": { - "@fluencelabs/aqua-language-server-api": "0.7.2-314", + "@fluencelabs/aqua-language-server-api": "0.7.3-315", "global-dirs": "^3.0.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.4" @@ -17,6 +17,9 @@ "node": "*" } }, + "../../../../../aqua/language-server-npm": { + "extraneous": true + }, "../../aqua/language-server": { "extraneous": true }, @@ -27,9 +30,9 @@ "license": "Apache-2.0" }, "node_modules/@fluencelabs/aqua-language-server-api": { - "version": "0.7.2-314", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.2-314.tgz", - "integrity": "sha512-wKKPvdYfmqOQ7HafCXwXIi4z5QYrla54PdvXNA1HYFzEJZssxdr07tSeV+U+Kfq8t+R8EU93OATuWTlxdTKVng==" + "version": "0.7.3-315", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.3-315.tgz", + "integrity": "sha512-QvXEoXGah5T0JGU0eg5g4GZJhG9U+NqZyDzLLFSQ8yhYdp7ipeSGE9uRAvlMTdVOZQ6jG9Y2Sd3UGFkSN/nMww==" }, "node_modules/global-dirs": { "version": "3.0.0", @@ -94,9 +97,9 @@ }, "dependencies": { "@fluencelabs/aqua-language-server-api": { - "version": "0.7.2-314", - "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.2-314.tgz", - "integrity": "sha512-wKKPvdYfmqOQ7HafCXwXIi4z5QYrla54PdvXNA1HYFzEJZssxdr07tSeV+U+Kfq8t+R8EU93OATuWTlxdTKVng==" + "version": "0.7.3-315", + "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.3-315.tgz", + "integrity": "sha512-QvXEoXGah5T0JGU0eg5g4GZJhG9U+NqZyDzLLFSQ8yhYdp7ipeSGE9uRAvlMTdVOZQ6jG9Y2Sd3UGFkSN/nMww==" }, "global-dirs": { "version": "3.0.0", diff --git a/server/package.json b/server/package.json index 1d2d01b..f6d1199 100644 --- a/server/package.json +++ b/server/package.json @@ -11,7 +11,7 @@ "url": "https://github.com/fluencelabs/aqua" }, "dependencies": { - "@fluencelabs/aqua-language-server-api": "0.7.2-314", + "@fluencelabs/aqua-language-server-api": "0.7.3-315", "global-dirs": "^3.0.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.4" diff --git a/server/src/server.ts b/server/src/server.ts index 519022a..34e9bb7 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -9,7 +9,7 @@ import { import type { WorkspaceFolder } from 'vscode-languageserver-protocol'; -import { TextDocument } from 'vscode-languageserver-textdocument'; +import { Position, TextDocument } from 'vscode-languageserver-textdocument'; import { compileAqua } from './validation'; import type { DefinitionParams, Location } from 'vscode-languageserver'; import type { TokenLink } from '@fluencelabs/aqua-language-server-api/aqua-lsp-api'; @@ -29,9 +29,15 @@ export interface Settings { imports: string[]; } -function searchDefinition(offset: number, name: string, locations: TokenLink[]): TokenLink | undefined { +function searchDefinition(position: Position, name: string, locations: TokenLink[]): TokenLink | undefined { return locations.find((token) => { - return token.current.name == name && token.current.start <= offset && token.current.end >= offset; + return ( + token.current.name == name && + token.current.startLine <= position.line && + token.current.startCol <= position.character && + token.current.endLine >= position.line && + token.current.endCol >= position.character + ); }); } @@ -44,24 +50,32 @@ let globalSettings: Settings = defaultSettings; // Cache the settings of all open documents const documentSettings: Map> = new Map(); -let currentLocations: TokenLink[] = []; +const allLocations: Map = new Map(); async function onDefinition({ textDocument, position }: DefinitionParams): Promise { + connection.console.log('onDefinition event'); const doc = documents.get(textDocument.uri); + if (doc) { - const offset = doc.offsetAt(position); - const token = searchDefinition(offset, doc.uri.replace('file://', ''), currentLocations); - connection.console.log('find token: ' + JSON.stringify(token)); - if (token) { - const definition = token.definition; - const defDoc = documents.get('file://' + definition.name); - if (defDoc) { + const currentLocations = allLocations.get(textDocument.uri); + if (currentLocations) { + const token = searchDefinition(position, doc.uri.replace('file://', ''), currentLocations); + connection.console.log('find token: ' + JSON.stringify(token)); + if (token) { + const definition = token.definition; + return [ { - uri: defDoc.uri, + uri: 'file://' + definition.name, range: { - start: defDoc.positionAt(definition.start), - end: defDoc.positionAt(definition.end), + start: { + line: definition.startLine, + character: definition.startCol, + }, + end: { + line: definition.endLine, + character: definition.endCol, + }, }, }, ]; @@ -104,6 +118,7 @@ documents.onDidClose((e) => { }); connection.onInitialize((params: InitializeParams) => { + connection.console.log('onInitialize event'); const capabilities = params.capabilities; hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration); @@ -131,6 +146,7 @@ connection.onInitialize((params: InitializeParams) => { }); connection.onInitialized(() => { + connection.console.log('onInitialized event'); connection.workspace.onDidChangeWorkspaceFolders((event) => { folders = folders.concat(event.added); folders = folders.filter((f) => !event.removed.includes(f)); @@ -138,10 +154,12 @@ connection.onInitialized(() => { }); documents.onDidSave(async (change) => { + connection.console.log('onDidSave event'); await validateDocument(change.document); }); documents.onDidOpen(async (change) => { + connection.console.log('onDidOpen event'); await validateDocument(change.document); }); @@ -150,7 +168,7 @@ async function validateDocument(textDocument: TextDocument): Promise { const [diagnostics, locations] = await compileAqua(settings, textDocument, folders); - currentLocations = locations; + allLocations.set(textDocument.uri, locations); // Send the computed diagnostics to VSCode. connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });