[code]: be able to disable code intelligence according to config (#28054)

This commit is contained in:
Fuyao Zhao 2019-01-04 10:28:48 -05:00 committed by GitHub
parent b5755f6ade
commit 3c6690a4db
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 79 additions and 11 deletions

View file

@ -10,3 +10,4 @@ export const ServerNotInitialized: number = ErrorCodes.ServerNotInitialized;
export const UnknownErrorCode: number = ErrorCodes.UnknownErrorCode;
export const UnknownFileLanguage: number = -42404;
export const LanguageServerNotInstalled: number = -42403;
export const LanguageDisabled: number = -42402;

View file

@ -24,6 +24,7 @@ import {
IndexWorker,
UpdateWorker,
} from './server/queue';
import { RepositoryConfigController } from './server/repository_config_controller';
import { RepositoryServiceFactory } from './server/repository_service_factory';
import { fileRoute } from './server/routes/file';
import { installRoute } from './server/routes/install';
@ -110,13 +111,15 @@ export const code = (kibana: any) =>
// @ts-ignore
const esClient: EsClient = adminCluster.getClient();
const repoConfigController = new RepositoryConfigController(esClient);
const installManager = new InstallManager(serverOptions);
const lspService = new LspService(
'127.0.0.1',
serverOptions,
esClient,
installManager,
new ServerLoggerFactory(server)
new ServerLoggerFactory(server),
repoConfigController
);
// Initialize indexing factories.
const lspIndexerFactory = new LspIndexerFactory(lspService, serverOptions, esClient, log);
@ -180,7 +183,8 @@ export const code = (kibana: any) =>
cloneWorker,
deleteWorker,
indexWorker,
repoIndexInitializerFactory
repoIndexInitializerFactory,
repoConfigController
);
repositorySearchRoute(server, log);
documentSearchRoute(server, log);

View file

@ -16,6 +16,7 @@ import { AnyObject, EsClient } from '../lib/esqueue';
import { Log } from '../log';
import { InstallManager } from '../lsp/install_manager';
import { LspService } from '../lsp/lsp_service';
import { RepositoryConfigController } from '../repository_config_controller';
import { ServerOptions } from '../server_options';
import { ConsoleLoggerFactory } from '../utils/console_logger_factory';
@ -187,7 +188,8 @@ describe('lsp_indexer', () => {
serverOptions,
esClient as EsClient,
{} as InstallManager,
new ConsoleLoggerFactory()
new ConsoleLoggerFactory(),
new RepositoryConfigController(esClient as EsClient)
);
lspservice.sendRequest = setupLsServiceSendRequestSpy();
@ -238,7 +240,8 @@ describe('lsp_indexer', () => {
serverOptions,
esClient as EsClient,
{} as InstallManager,
new ConsoleLoggerFactory()
new ConsoleLoggerFactory(),
new RepositoryConfigController(esClient as EsClient)
);
lspservice.sendRequest = setupLsServiceSendRequestSpy();

View file

@ -19,6 +19,7 @@ import { RepositoryGitStatusReservedField, RepositoryTypeName } from '../indexer
import { InstallManager } from "../lsp/install_manager";
import * as os from "os";
import assert from 'assert';
import { RepositoryConfigController } from '../repository_config_controller';
@ -108,7 +109,7 @@ describe('lsp_service tests', () => {
let esClient = mockEsClient();
const revision = 'master';
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory());
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory(), new RepositoryConfigController(esClient));
try {
const params = {
textDocument: {
@ -154,7 +155,7 @@ describe('lsp_service tests', () => {
it("unload a workspace", async () => {
let esClient = mockEsClient();
const revision = 'master';
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory());
const lspservice = new LspService('127.0.0.1', serverOptions, esClient, installManager, new ConsoleLoggerFactory(), new RepositoryConfigController(esClient));
try {
const params = {
textDocument: {

View file

@ -8,12 +8,14 @@ import { ResponseError } from 'vscode-jsonrpc';
import { ResponseMessage } from 'vscode-jsonrpc/lib/messages';
import { LanguageServerStatus } from '../../common/language_server';
import {
LanguageDisabled,
LanguageServerNotInstalled,
UnknownErrorCode,
UnknownFileLanguage,
} from '../../common/lsp_error_codes';
import { LspRequest } from '../../model';
import { Logger } from '../log';
import { RepositoryConfigController } from '../repository_config_controller';
import { ServerOptions } from '../server_options';
import { detectLanguage } from '../utils/detect_language';
import { LoggerFactory } from '../utils/log_factory';
@ -51,7 +53,8 @@ export class LanguageServerController implements ILanguageServerHandler {
readonly options: ServerOptions,
readonly targetHost: string,
readonly installManager: InstallManager,
readonly loggerFactory: LoggerFactory
readonly loggerFactory: LoggerFactory,
readonly repoConfigController: RepositoryConfigController
) {
this.log = loggerFactory.getLogger([]);
this.languageServers = LanguageServers.map(def => ({
@ -76,6 +79,11 @@ export class LanguageServerController implements ILanguageServerHandler {
if (file) {
// #todo add test for this
const lang = await detectLanguage(file.replace('file://', ''));
if (await this.repoConfigController.isLanguageDisabled(request.documentUri!, lang)) {
return Promise.reject(
new ResponseError(LanguageDisabled, `language disabled for the file`)
);
}
return this.dispatchRequest(lang, request);
} else {
return Promise.reject(

View file

@ -8,6 +8,7 @@ import { ResponseMessage } from 'vscode-jsonrpc/lib/messages';
import { LanguageServerStatus } from '../../common/language_server';
import { EsClient } from '../lib/esqueue';
import { RepositoryConfigController } from '../repository_config_controller';
import { ServerOptions } from '../server_options';
import { LoggerFactory } from '../utils/log_factory';
import { LanguageServerController } from './controller';
@ -22,7 +23,8 @@ export class LspService {
serverOptions: ServerOptions,
client: EsClient,
installManager: InstallManager,
loggerFactory: LoggerFactory
loggerFactory: LoggerFactory,
repoConfigController: RepositoryConfigController
) {
this.workspaceHandler = new WorkspaceHandler(
serverOptions.repoPath,
@ -34,7 +36,8 @@ export class LspService {
serverOptions,
targetHost,
installManager,
loggerFactory
loggerFactory,
repoConfigController
);
}

View file

@ -120,6 +120,7 @@ export class WorkspaceHandler {
params.textDocument.uri
);
if (filePath) {
request.documentUri = payload.textDocument.uri;
payload.textDocument.uri = request.resolvedFilePath = filePath;
request.workspacePath = workspacePath;
request.workspaceRevision = workspaceRevision;

View file

@ -0,0 +1,44 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/
import { parseLspUrl } from '../common/uri_util';
import { RepositoryConfig } from '../model';
import { EsClient } from '../server/lib/esqueue';
import { RepositoryObjectClient } from './search';
export class RepositoryConfigController {
private repositoryConfigCache: { [repoUri: string]: RepositoryConfig } = {};
private repoObjectClient: RepositoryObjectClient;
constructor(readonly esClient: EsClient) {
this.repoObjectClient = new RepositoryObjectClient(esClient);
}
public async isLanguageDisabled(uri: string, lang: string): Promise<boolean> {
const { repoUri } = parseLspUrl(uri)!;
let repoConfig = this.repositoryConfigCache[repoUri];
if (!repoConfig) {
try {
repoConfig = await this.repoObjectClient.getRepositoryConfig(repoUri);
} catch (err) {
return false;
}
}
if (lang === 'java' && repoConfig.disableJava === true) {
return true;
}
if (lang === 'typescript' && repoConfig.disableTypescript === true) {
return true;
}
return false;
}
public async resetConfigCache(repoUri: string) {
delete this.repositoryConfigCache[repoUri];
}
}

View file

@ -13,6 +13,7 @@ import { RepositoryConfig } from '../../model';
import { RepositoryIndexInitializer, RepositoryIndexInitializerFactory } from '../indexer';
import { Log } from '../log';
import { CloneWorker, DeleteWorker, IndexWorker } from '../queue';
import { RepositoryConfigController } from '../repository_config_controller';
import { RepositoryObjectClient } from '../search';
import { ServerOptions } from '../server_options';
import { EsClientWithRequest } from '../utils/esclient_with_request';
@ -23,7 +24,8 @@ export function repositoryRoute(
cloneWorker: CloneWorker,
deleteWorker: DeleteWorker,
indexWorker: IndexWorker,
repoIndexInitializerFactory: RepositoryIndexInitializerFactory
repoIndexInitializerFactory: RepositoryIndexInitializerFactory,
repoConfigController: RepositoryConfigController
) {
// Clone a git repository
@ -228,6 +230,7 @@ export function repositoryRoute(
try {
// Persist to elasticsearch
await repoObjectClient.setRepositoryConfig(repo.uri, config);
repoConfigController.resetConfigCache(repo.uri);
return {};
} catch (error) {
const msg = `Issue repository clone request for ${repoUrl} error: ${error}`;

View file

@ -42,7 +42,7 @@ export class RepositoryObjectClient {
return await this.getRepositoryObject(repoUri, RepositoryDeleteStatusReservedField);
}
public async getRepositoryConfig(repoUri: RepositoryUri): Promise<Repository> {
public async getRepositoryConfig(repoUri: RepositoryUri): Promise<RepositoryConfig> {
return await this.getRepositoryObject(repoUri, RepositoryConfigReservedField);
}