From 95fe2adfc90825b51b425c46bb55c600d9263214 Mon Sep 17 00:00:00 2001
From: Dima <dmitry.shakhtarin@fluence.ai>
Date: Thu, 2 Jun 2022 14:42:48 +0400
Subject: [PATCH] Definitions between files (#16)

---
 server/package-lock.json | 17 ++++++++------
 server/package.json      |  2 +-
 server/src/server.ts     | 48 +++++++++++++++++++++++++++-------------
 3 files changed, 44 insertions(+), 23 deletions(-)

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<string, Thenable<Settings>> = new Map();
 
-let currentLocations: TokenLink[] = [];
+const allLocations: Map<string, TokenLink[]> = new Map();
 
 async function onDefinition({ textDocument, position }: DefinitionParams): Promise<Location[]> {
+    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<void> {
 
     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 });