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
 |