2017-12-31 22:15:03 +00:00
|
|
|
#if USE_CLANG_CXX
|
|
|
|
|
2017-12-25 17:04:10 +00:00
|
|
|
#include "clang_format.h"
|
2018-01-01 03:33:28 +00:00
|
|
|
#include "working_files.h"
|
2017-12-25 17:04:10 +00:00
|
|
|
|
2017-12-29 21:44:28 +00:00
|
|
|
#include <loguru.hpp>
|
|
|
|
|
2018-01-01 04:17:31 +00:00
|
|
|
using namespace clang;
|
|
|
|
using clang::format::FormatStyle;
|
2017-12-25 17:04:10 +00:00
|
|
|
|
2018-01-01 03:33:28 +00:00
|
|
|
namespace {
|
|
|
|
|
2018-01-01 04:17:31 +00:00
|
|
|
// TODO Objective-C 'header/interface' files may use .h, we should get this from
|
|
|
|
// project information.
|
2018-01-01 03:33:28 +00:00
|
|
|
FormatStyle::LanguageKind getLanguageKindFromFilename(
|
2017-12-25 17:06:30 +00:00
|
|
|
llvm::StringRef filename) {
|
|
|
|
if (filename.endswith(".m") || filename.endswith(".mm")) {
|
|
|
|
return FormatStyle::LK_ObjC;
|
|
|
|
}
|
|
|
|
return FormatStyle::LK_Cpp;
|
|
|
|
}
|
|
|
|
|
2018-01-01 03:33:28 +00:00
|
|
|
} // namespace
|
|
|
|
|
2018-01-01 04:17:31 +00:00
|
|
|
std::vector<tooling::Replacement> ClangFormatDocument(
|
|
|
|
WorkingFile* working_file,
|
|
|
|
int start,
|
|
|
|
int end,
|
|
|
|
lsFormattingOptions options) {
|
2018-01-01 03:33:28 +00:00
|
|
|
const auto language_kind =
|
|
|
|
getLanguageKindFromFilename(working_file->filename);
|
2017-12-25 17:06:30 +00:00
|
|
|
FormatStyle predefined_style;
|
|
|
|
getPredefinedStyle("chromium", language_kind, &predefined_style);
|
2017-12-29 21:44:28 +00:00
|
|
|
llvm::Expected<FormatStyle> style =
|
2018-01-01 04:17:31 +00:00
|
|
|
format::getStyle("file", working_file->filename, "chromium");
|
2017-12-29 21:44:28 +00:00
|
|
|
if (!style) {
|
2018-01-01 00:35:37 +00:00
|
|
|
// If, for some reason, we cannot get a format style, use Chromium's with
|
|
|
|
// tab configuration provided by the client editor.
|
2017-12-29 21:44:28 +00:00
|
|
|
LOG_S(ERROR) << llvm::toString(style.takeError());
|
2018-01-01 03:33:28 +00:00
|
|
|
predefined_style.UseTab = options.insertSpaces
|
2018-01-01 00:35:37 +00:00
|
|
|
? FormatStyle::UseTabStyle::UT_Never
|
2017-12-25 17:06:30 +00:00
|
|
|
: FormatStyle::UseTabStyle::UT_Always;
|
2018-01-01 03:33:28 +00:00
|
|
|
predefined_style.IndentWidth = options.tabSize;
|
2017-12-25 17:06:30 +00:00
|
|
|
}
|
2018-01-01 00:35:37 +00:00
|
|
|
|
2018-01-01 03:33:28 +00:00
|
|
|
auto format_result = reformat(
|
2018-01-03 20:48:10 +00:00
|
|
|
style ? *style : predefined_style, working_file->buffer_content,
|
2018-01-01 04:17:31 +00:00
|
|
|
llvm::ArrayRef<tooling::Range>(tooling::Range(start, end - start)),
|
2018-01-01 03:33:28 +00:00
|
|
|
working_file->filename);
|
2018-01-01 04:17:31 +00:00
|
|
|
return std::vector<tooling::Replacement>(format_result.begin(),
|
|
|
|
format_result.end());
|
2017-12-25 17:04:10 +00:00
|
|
|
}
|
2017-12-31 22:15:03 +00:00
|
|
|
|
|
|
|
#endif
|