Definitions between files (#16)

This commit is contained in:
Dima 2022-06-02 14:42:48 +04:00 committed by GitHub
parent 8be467370b
commit 95fe2adfc9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 23 deletions

View File

@ -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",

View File

@ -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"

View File

@ -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);
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;
const defDoc = documents.get('file://' + definition.name);
if (defDoc) {
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 });