forked from OSchip/llvm-project
68 lines
2.7 KiB
C
68 lines
2.7 KiB
C
|
//===--- PathMapping.h - apply path mappings to LSP messages -===//
|
||
|
//
|
||
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
||
|
// See https://llvm.org/LICENSE.txt for license information.
|
||
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
#include "llvm/ADT/Optional.h"
|
||
|
#include "llvm/ADT/StringRef.h"
|
||
|
#include "llvm/Support/Error.h"
|
||
|
#include "llvm/Support/JSON.h"
|
||
|
#include "llvm/Support/raw_ostream.h"
|
||
|
#include <memory>
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
|
||
|
namespace clang {
|
||
|
namespace clangd {
|
||
|
|
||
|
class Transport;
|
||
|
|
||
|
/// PathMappings are a collection of paired client and server paths.
|
||
|
/// These pairs are used to alter file:// URIs appearing in inbound and outbound
|
||
|
/// LSP messages, as the client's environment may have source files or
|
||
|
/// dependencies at different locations than the server. Therefore, both
|
||
|
/// paths are stored as they appear in file URI bodies, e.g. /usr/include or
|
||
|
/// /C:/config
|
||
|
///
|
||
|
/// For example, if the mappings were {{"/home/user", "/workarea"}}, then
|
||
|
/// a client-to-server LSP message would have file:///home/user/foo.cpp
|
||
|
/// remapped to file:///workarea/foo.cpp, and the same would happen for replies
|
||
|
/// (in the opposite order).
|
||
|
struct PathMapping {
|
||
|
std::string ClientPath;
|
||
|
std::string ServerPath;
|
||
|
enum class Direction { ClientToServer, ServerToClient };
|
||
|
};
|
||
|
using PathMappings = std::vector<PathMapping>;
|
||
|
|
||
|
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const PathMapping &M);
|
||
|
|
||
|
/// Parse the command line \p RawPathMappings (e.g. "/client=/server") into
|
||
|
/// pairs. Returns an error if the mappings are malformed, i.e. not absolute or
|
||
|
/// not a proper pair.
|
||
|
llvm::Expected<PathMappings> parsePathMappings(llvm::StringRef RawPathMappings);
|
||
|
|
||
|
/// Returns a modified \p S with the first matching path in \p Mappings
|
||
|
/// substituted, if applicable
|
||
|
llvm::Optional<std::string> doPathMapping(llvm::StringRef S,
|
||
|
PathMapping::Direction Dir,
|
||
|
const PathMappings &Mappings);
|
||
|
|
||
|
/// Applies the \p Mappings to all the file:// URIs in \p Params.
|
||
|
/// NOTE: The first matching mapping will be applied, otherwise \p Params will
|
||
|
/// be untouched.
|
||
|
void applyPathMappings(llvm::json::Value &Params, PathMapping::Direction Dir,
|
||
|
const PathMappings &Mappings);
|
||
|
|
||
|
/// Creates a wrapping transport over \p Transp that applies the \p Mappings to
|
||
|
/// all inbound and outbound LSP messages. All calls are then delegated to the
|
||
|
/// regular transport (e.g. XPC, JSON).
|
||
|
std::unique_ptr<Transport>
|
||
|
createPathMappingTransport(std::unique_ptr<Transport> Transp,
|
||
|
PathMappings Mappings);
|
||
|
|
||
|
} // namespace clangd
|
||
|
} // namespace clang
|