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", "name": "aqua-ls-server",
"version": "0.0.1", "version": "0.0.1",
"dependencies": { "dependencies": {
"@fluencelabs/aqua-language-server-api": "0.7.2-314", "@fluencelabs/aqua-language-server-api": "0.7.3-315",
"global-dirs": "^3.0.0", "global-dirs": "^3.0.0",
"vscode-languageserver": "^7.0.0", "vscode-languageserver": "^7.0.0",
"vscode-languageserver-textdocument": "^1.0.4" "vscode-languageserver-textdocument": "^1.0.4"
@ -17,6 +17,9 @@
"node": "*" "node": "*"
} }
}, },
"../../../../../aqua/language-server-npm": {
"extraneous": true
},
"../../aqua/language-server": { "../../aqua/language-server": {
"extraneous": true "extraneous": true
}, },
@ -27,9 +30,9 @@
"license": "Apache-2.0" "license": "Apache-2.0"
}, },
"node_modules/@fluencelabs/aqua-language-server-api": { "node_modules/@fluencelabs/aqua-language-server-api": {
"version": "0.7.2-314", "version": "0.7.3-315",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.2-314.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.3-315.tgz",
"integrity": "sha512-wKKPvdYfmqOQ7HafCXwXIi4z5QYrla54PdvXNA1HYFzEJZssxdr07tSeV+U+Kfq8t+R8EU93OATuWTlxdTKVng==" "integrity": "sha512-QvXEoXGah5T0JGU0eg5g4GZJhG9U+NqZyDzLLFSQ8yhYdp7ipeSGE9uRAvlMTdVOZQ6jG9Y2Sd3UGFkSN/nMww=="
}, },
"node_modules/global-dirs": { "node_modules/global-dirs": {
"version": "3.0.0", "version": "3.0.0",
@ -94,9 +97,9 @@
}, },
"dependencies": { "dependencies": {
"@fluencelabs/aqua-language-server-api": { "@fluencelabs/aqua-language-server-api": {
"version": "0.7.2-314", "version": "0.7.3-315",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.2-314.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.7.3-315.tgz",
"integrity": "sha512-wKKPvdYfmqOQ7HafCXwXIi4z5QYrla54PdvXNA1HYFzEJZssxdr07tSeV+U+Kfq8t+R8EU93OATuWTlxdTKVng==" "integrity": "sha512-QvXEoXGah5T0JGU0eg5g4GZJhG9U+NqZyDzLLFSQ8yhYdp7ipeSGE9uRAvlMTdVOZQ6jG9Y2Sd3UGFkSN/nMww=="
}, },
"global-dirs": { "global-dirs": {
"version": "3.0.0", "version": "3.0.0",

View File

@ -11,7 +11,7 @@
"url": "https://github.com/fluencelabs/aqua" "url": "https://github.com/fluencelabs/aqua"
}, },
"dependencies": { "dependencies": {
"@fluencelabs/aqua-language-server-api": "0.7.2-314", "@fluencelabs/aqua-language-server-api": "0.7.3-315",
"global-dirs": "^3.0.0", "global-dirs": "^3.0.0",
"vscode-languageserver": "^7.0.0", "vscode-languageserver": "^7.0.0",
"vscode-languageserver-textdocument": "^1.0.4" "vscode-languageserver-textdocument": "^1.0.4"

View File

@ -9,7 +9,7 @@ import {
import type { WorkspaceFolder } from 'vscode-languageserver-protocol'; 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 { compileAqua } from './validation';
import type { DefinitionParams, Location } from 'vscode-languageserver'; import type { DefinitionParams, Location } from 'vscode-languageserver';
import type { TokenLink } from '@fluencelabs/aqua-language-server-api/aqua-lsp-api'; import type { TokenLink } from '@fluencelabs/aqua-language-server-api/aqua-lsp-api';
@ -29,9 +29,15 @@ export interface Settings {
imports: string[]; 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 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 // Cache the settings of all open documents
const documentSettings: Map<string, Thenable<Settings>> = new Map(); 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[]> { async function onDefinition({ textDocument, position }: DefinitionParams): Promise<Location[]> {
connection.console.log('onDefinition event');
const doc = documents.get(textDocument.uri); const doc = documents.get(textDocument.uri);
if (doc) { if (doc) {
const offset = doc.offsetAt(position); const currentLocations = allLocations.get(textDocument.uri);
const token = searchDefinition(offset, doc.uri.replace('file://', ''), currentLocations); if (currentLocations) {
connection.console.log('find token: ' + JSON.stringify(token)); const token = searchDefinition(position, doc.uri.replace('file://', ''), currentLocations);
if (token) { connection.console.log('find token: ' + JSON.stringify(token));
const definition = token.definition; if (token) {
const defDoc = documents.get('file://' + definition.name); const definition = token.definition;
if (defDoc) {
return [ return [
{ {
uri: defDoc.uri, uri: 'file://' + definition.name,
range: { range: {
start: defDoc.positionAt(definition.start), start: {
end: defDoc.positionAt(definition.end), 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.onInitialize((params: InitializeParams) => {
connection.console.log('onInitialize event');
const capabilities = params.capabilities; const capabilities = params.capabilities;
hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration); hasConfigurationCapability = !!(capabilities.workspace && !!capabilities.workspace.configuration);
@ -131,6 +146,7 @@ connection.onInitialize((params: InitializeParams) => {
}); });
connection.onInitialized(() => { connection.onInitialized(() => {
connection.console.log('onInitialized event');
connection.workspace.onDidChangeWorkspaceFolders((event) => { connection.workspace.onDidChangeWorkspaceFolders((event) => {
folders = folders.concat(event.added); folders = folders.concat(event.added);
folders = folders.filter((f) => !event.removed.includes(f)); folders = folders.filter((f) => !event.removed.includes(f));
@ -138,10 +154,12 @@ connection.onInitialized(() => {
}); });
documents.onDidSave(async (change) => { documents.onDidSave(async (change) => {
connection.console.log('onDidSave event');
await validateDocument(change.document); await validateDocument(change.document);
}); });
documents.onDidOpen(async (change) => { documents.onDidOpen(async (change) => {
connection.console.log('onDidOpen event');
await validateDocument(change.document); await validateDocument(change.document);
}); });
@ -150,7 +168,7 @@ async function validateDocument(textDocument: TextDocument): Promise<void> {
const [diagnostics, locations] = await compileAqua(settings, textDocument, folders); const [diagnostics, locations] = await compileAqua(settings, textDocument, folders);
currentLocations = locations; allLocations.set(textDocument.uri, locations);
// Send the computed diagnostics to VSCode. // Send the computed diagnostics to VSCode.
connection.sendDiagnostics({ uri: textDocument.uri, diagnostics }); connection.sendDiagnostics({ uri: textDocument.uri, diagnostics });