feat: add useOnlyImportsFromSettings flag (#41)

This commit is contained in:
Dima 2023-08-16 03:25:14 +02:00 committed by GitHub
parent 4d26bfe686
commit 6b73358330
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 29 deletions

View File

@ -62,11 +62,19 @@
"type": "object", "type": "object",
"title": "Aqua", "title": "Aqua",
"properties": { "properties": {
"aquaSettings.imports": { "aquaSettings": {
"scope": "resource", "imports": {
"type": "array", "scope": "resource",
"default": [], "type": "array",
"description": "Adds imports for aqua file or project" "default": [],
"description": "Adds imports for aqua file or project"
},
"enableLegacyAutoImportSearch": {
"scope": "resource",
"type": "boolean",
"default": false,
"description": "Do not look for extra imports"
}
} }
} }
} }

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.11.0", "@fluencelabs/aqua-language-server-api": "0.11.7",
"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"
@ -30,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.11.0", "version": "0.11.7",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.11.0.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.11.7.tgz",
"integrity": "sha512-DVgbh3rmgA6COfNXCnkjRcvw3uNLtnuZhs2wM+m2RfShE9OI6gJzqPij6DgQIP/RQEFGql47EcpQ95t0WoMvRQ==" "integrity": "sha512-Ik+DWWVOe2tsZ7IwHvCpKVggkpbNp66yKc6LRc3m1xV3Rpjoe+u4HJAab4Uj3TbZNn33lOY+DUj0J+QbPj5EMA=="
}, },
"node_modules/global-dirs": { "node_modules/global-dirs": {
"version": "3.0.0", "version": "3.0.0",
@ -97,9 +97,9 @@
}, },
"dependencies": { "dependencies": {
"@fluencelabs/aqua-language-server-api": { "@fluencelabs/aqua-language-server-api": {
"version": "0.11.0", "version": "0.11.7",
"resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.11.0.tgz", "resolved": "https://registry.npmjs.org/@fluencelabs/aqua-language-server-api/-/aqua-language-server-api-0.11.7.tgz",
"integrity": "sha512-DVgbh3rmgA6COfNXCnkjRcvw3uNLtnuZhs2wM+m2RfShE9OI6gJzqPij6DgQIP/RQEFGql47EcpQ95t0WoMvRQ==" "integrity": "sha512-Ik+DWWVOe2tsZ7IwHvCpKVggkpbNp66yKc6LRc3m1xV3Rpjoe+u4HJAab4Uj3TbZNn33lOY+DUj0J+QbPj5EMA=="
}, },
"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.11.0", "@fluencelabs/aqua-language-server-api": "0.11.7",
"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

@ -27,6 +27,7 @@ let folders: WorkspaceFolder[] = [];
export interface Settings { export interface Settings {
imports: string[]; imports: string[];
enableLegacyAutoImportSearch: boolean;
} }
function searchDefinition(position: Position, name: string, locations: TokenLink[]): TokenLink | undefined { function searchDefinition(position: Position, name: string, locations: TokenLink[]): TokenLink | undefined {
@ -44,7 +45,7 @@ function searchDefinition(position: Position, name: string, locations: TokenLink
// The global settings, used when the `workspace/configuration` request is not supported by the client. // The global settings, used when the `workspace/configuration` request is not supported by the client.
// Please note that this is not the case when using this server with the client provided in this example // Please note that this is not the case when using this server with the client provided in this example
// but could happen with other clients. // but could happen with other clients.
const defaultSettings: Settings = { imports: [] }; const defaultSettings: Settings = { imports: [], enableLegacyAutoImportSearch: false };
let globalSettings: Settings = defaultSettings; let globalSettings: Settings = defaultSettings;
// Cache the settings of all open documents // Cache the settings of all open documents

View File

@ -40,20 +40,21 @@ function notEmpty<TValue>(value: TValue | null | undefined): value is TValue {
return value !== null && value !== undefined; return value !== null && value !== undefined;
} }
export async function compileAqua( function getImports(
settings: Settings, settings: Settings,
textDocument: TextDocument, textDocument: TextDocument,
folders: WorkspaceFolder[], folders: WorkspaceFolder[],
console: RemoteConsole, console: RemoteConsole,
): Promise<[Diagnostic[], TokenLink[]]> { ) {
const uri = textDocument.uri.replace('file://', '');
let imports: string[] = []; let imports: string[] = [];
const assumeImports = settings.enableLegacyAutoImportSearch;
const openFolders = folders.map((f) => f.uri.replace('file://', '')); const openFolders = folders.map((f) => f.uri.replace('file://', ''));
// add all workspace folders to imports // add all workspace folders to imports
// 1. open folders // 1. open folders
imports = imports.concat(openFolders); if (assumeImports) imports = imports.concat(openFolders);
// 2. imports from settings // 2. imports from settings
if (settings.imports && Array.isArray(settings.imports)) { if (settings.imports && Array.isArray(settings.imports)) {
@ -79,22 +80,40 @@ export async function compileAqua(
.flat(); .flat();
imports = imports.concat(relativeImports); imports = imports.concat(relativeImports);
imports = imports.concat(relativeImports.map((s) => Path.join(s, '/node_modules')));
imports = imports.concat(absoluteImports); imports = imports.concat(absoluteImports);
imports = imports.concat(absoluteImports.map((s) => Path.join(s, '/node_modules')));
if (assumeImports) {
imports = imports.concat(relativeImports.map((s) => Path.join(s, '/node_modules')));
imports = imports.concat(absoluteImports.map((s) => Path.join(s, '/node_modules')));
}
} }
// 3. node_modules in open folders if (assumeImports) {
imports = imports.concat(openFolders.map((f) => Path.join(f, '/node_modules'))); // 3. node_modules in open folders
imports = imports.concat(openFolders.map((f) => Path.join(f, '/node_modules')));
// 4. path to aqua library // 4. path to aqua library
if (require.main) { if (require.main) {
imports = imports.concat(require.main.paths); imports = imports.concat(require.main.paths);
}
// 5. node_modules from root to open folders
const nodeModulesPaths = folders.map((f) => findNearestNodeModules(textDocument.uri, f.uri)).filter(notEmpty);
imports = imports.concat(nodeModulesPaths);
} }
// 5. node_modules from root to open folders return imports;
const nodeModulesPaths = folders.map((f) => findNearestNodeModules(textDocument.uri, f.uri)).filter(notEmpty); }
imports = imports.concat(nodeModulesPaths);
export async function compileAqua(
settings: Settings,
textDocument: TextDocument,
folders: WorkspaceFolder[],
console: RemoteConsole,
): Promise<[Diagnostic[], TokenLink[]]> {
const uri = textDocument.uri.replace('file://', '');
const imports = getImports(settings, textDocument, folders, console);
// compile aqua and get possible errors // compile aqua and get possible errors
const result = await AquaLSP.compile(uri, imports); const result = await AquaLSP.compile(uri, imports);