aboutsummaryrefslogtreecommitdiff
path: root/clangd/clients
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2018-03-08 15:28:42 +0000
committerEric Liu <ioeric@google.com>2018-03-08 15:28:42 +0000
commitae80c07cb1668fd62dd3861cd4569786b7f22d07 (patch)
tree8c007ecbc23d88c3f90bfd24761bfd4f2e8d1773 /clangd/clients
parent86622a73e42e4ea56944244dfc191152850a0a40 (diff)
downloadclang-tools-extra-ae80c07cb1668fd62dd3861cd4569786b7f22d07.tar.gz
[clangd:vscode] Resolve symlinks for file paths from clangd.
Summary: For features like go-to-definition, clangd can point clients to symlink paths (e.g. in bazel execroot) which might not be desired if the symlink points to a file in the workspace. Clangd might not be able to build the file, and users might prefer to edit the file on the real path. This change converts file paths from clangd to real path (e.g. resolving symlinks). Long term, we might want to the symlink handling logic to clangd where clangd can better decide whether symlinks should be resolved according to e.g. compile commands. Reviewers: sammccall Subscribers: klimek, ilya-biryukov, jkorous-apple, cfe-commits Differential Revision: https://reviews.llvm.org/D44158 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@327009 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clangd/clients')
-rw-r--r--clangd/clients/clangd-vscode/src/extension.ts22
1 files changed, 17 insertions, 5 deletions
diff --git a/clangd/clients/clangd-vscode/src/extension.ts b/clangd/clients/clangd-vscode/src/extension.ts
index 3f9e95ff..a126a19f 100644
--- a/clangd/clients/clangd-vscode/src/extension.ts
+++ b/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<T>(option: string, defaultValue?: any) : T {
+function getConfig<T>(option: string, defaultValue?: any): T {
const config = vscode.workspace.getConfiguration('clangd');
return config.get<T>(option, defaultValue);
}
@@ -24,18 +25,29 @@ export function activate(context: vscode.ExtensionContext) {
};
const traceFile = getConfig<string>('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))
}
};