Index: clangd/clients/clangd-vscode/src/extension.ts =================================================================== --- clangd/clients/clangd-vscode/src/extension.ts +++ clangd/clients/clangd-vscode/src/extension.ts @@ -1,12 +1,13 @@ import * as vscode from 'vscode'; import * as vscodelc from 'vscode-languageclient'; +import { realpathSync } from 'fs'; /** * Method to get workspace configuration option * @param option name of the option (e.g. for clangd.path should be path) * @param defaultValue default value to return if option is not set */ -function getConfig(option: string, defaultValue?: any) : T { +function getConfig(option: string, defaultValue?: any): T { const config = vscode.workspace.getConfiguration('clangd'); return config.get(option, defaultValue); } @@ -24,18 +25,29 @@ }; const traceFile = getConfig('trace'); if (!!traceFile) { - const trace = {CLANGD_TRACE : traceFile}; - clangd.options = {env : {...process.env, ...trace}}; + const trace = { CLANGD_TRACE: traceFile }; + clangd.options = { env: { ...process.env, ...trace } }; } const serverOptions: vscodelc.ServerOptions = clangd; const filePattern: string = '**/*.{' + - ['cpp', 'c', 'cc', 'cxx', 'c++', 'm', 'mm', 'h', 'hh', 'hpp', 'hxx', 'inc'].join() + '}'; + ['cpp', 'c', 'cc', 'cxx', 'c++', 'm', 'mm', 'h', 'hh', 'hpp', 'hxx', 'inc'].join() + '}'; const clientOptions: vscodelc.LanguageClientOptions = { // Register the server for C/C++ files - documentSelector: [{scheme: 'file', pattern: filePattern}], + documentSelector: [{ scheme: 'file', pattern: filePattern }], synchronize: !syncFileEvents ? undefined : { fileEvents: vscode.workspace.createFileSystemWatcher(filePattern) + }, + // Resolve symlinks for all files provided by clangd. + // This is a workaround for a bazel + clangd issue - bazel produces a symlink tree to build in, + // and when navigating to the included file, clangd passes its path inside the symlink tree + // rather than its filesystem path. + // FIXME: remove this once clangd knows enough about bazel to resolve the + // symlinks where needed (or if this causes problems for other workflows). + uriConverters: { + code2Protocol: (value: vscode.Uri) => value.toString(), + protocol2Code: (value: string) => + vscode.Uri.file(realpathSync(vscode.Uri.parse(value).fsPath)) } };