Skip to content

Commit

Permalink
[clang-format][NFC] Clean up the driver and getStyle() in Format.cpp (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
owenca committed Dec 8, 2023
1 parent 9810fe1 commit 3791b3f
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 70 deletions.
95 changes: 48 additions & 47 deletions clang/lib/Format/Format.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3955,10 +3955,7 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
StringRef FallbackStyleName,
StringRef Code, llvm::vfs::FileSystem *FS,
bool AllowUnknownOptions) {
if (!FS)
FS = llvm::vfs::getRealFileSystem().get();
FormatStyle Style = getLLVMStyle(guessLanguage(FileName, Code));

FormatStyle FallbackStyle = getNoStyle();
if (!getPredefinedStyle(FallbackStyleName, Style.Language, &FallbackStyle))
return make_string_error("Invalid fallback style: " + FallbackStyleName);
Expand All @@ -3974,14 +3971,18 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
AllowUnknownOptions)) {
return make_string_error("Error parsing -style: " + ec.message());
}
if (Style.InheritsParentConfig) {
ChildFormatTextToApply.emplace_back(
llvm::MemoryBuffer::getMemBuffer(StyleName, Source, false));
} else {

if (!Style.InheritsParentConfig)
return Style;
}

ChildFormatTextToApply.emplace_back(
llvm::MemoryBuffer::getMemBuffer(StyleName, Source, false));
}

if (!FS)
FS = llvm::vfs::getRealFileSystem().get();
assert(FS);

// User provided clang-format file using -style=file:path/to/format/file.
if (!Style.InheritsParentConfig &&
StyleName.starts_with_insensitive("file:")) {
Expand Down Expand Up @@ -4015,18 +4016,12 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
return Style;
}

// Reset possible inheritance
Style.InheritsParentConfig = false;

// Look for .clang-format/_clang-format file in the file's parent directories.
SmallString<128> UnsuitableConfigFiles;
SmallString<128> Path(FileName);
if (std::error_code EC = FS->makeAbsolute(Path))
return make_string_error(EC.message());

llvm::SmallVector<std::string, 2> FilesToLookFor;
FilesToLookFor.push_back(".clang-format");
FilesToLookFor.push_back("_clang-format");
// Reset possible inheritance
Style.InheritsParentConfig = false;

auto dropDiagnosticHandler = [](const llvm::SMDiagnostic &, void *) {};

Expand All @@ -4040,9 +4035,14 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
}
};

// Look for .clang-format/_clang-format file in the file's parent directories.
llvm::SmallVector<std::string, 2> FilesToLookFor;
FilesToLookFor.push_back(".clang-format");
FilesToLookFor.push_back("_clang-format");

SmallString<128> UnsuitableConfigFiles;
for (StringRef Directory = Path; !Directory.empty();
Directory = llvm::sys::path::parent_path(Directory)) {

auto Status = FS->status(Directory);
if (!Status ||
Status->getType() != llvm::sys::fs::file_type::directory_file) {
Expand All @@ -4055,50 +4055,51 @@ llvm::Expected<FormatStyle> getStyle(StringRef StyleName, StringRef FileName,
llvm::sys::path::append(ConfigFile, F);
LLVM_DEBUG(llvm::dbgs() << "Trying " << ConfigFile << "...\n");

Status = FS->status(ConfigFile.str());

if (Status &&
(Status->getType() == llvm::sys::fs::file_type::regular_file)) {
llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
loadAndParseConfigFile(ConfigFile, FS, &Style, AllowUnknownOptions);
if (auto EC = Text.getError()) {
if (EC == ParseError::Unsuitable) {
if (!UnsuitableConfigFiles.empty())
UnsuitableConfigFiles.append(", ");
UnsuitableConfigFiles.append(ConfigFile);
continue;
}
Status = FS->status(ConfigFile);
if (!Status ||
Status->getType() != llvm::sys::fs::file_type::regular_file) {
continue;
}

llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
loadAndParseConfigFile(ConfigFile, FS, &Style, AllowUnknownOptions);
if (auto EC = Text.getError()) {
if (EC != ParseError::Unsuitable) {
return make_string_error("Error reading " + ConfigFile + ": " +
EC.message());
}
LLVM_DEBUG(llvm::dbgs()
<< "Using configuration file " << ConfigFile << "\n");
if (!UnsuitableConfigFiles.empty())
UnsuitableConfigFiles.append(", ");
UnsuitableConfigFiles.append(ConfigFile);
continue;
}

if (!Style.InheritsParentConfig) {
if (ChildFormatTextToApply.empty())
return Style;
LLVM_DEBUG(llvm::dbgs()
<< "Using configuration file " << ConfigFile << "\n");

if (!Style.InheritsParentConfig) {
if (!ChildFormatTextToApply.empty()) {
LLVM_DEBUG(llvm::dbgs() << "Applying child configurations\n");
applyChildFormatTexts(&Style);

return Style;
}
return Style;
}

LLVM_DEBUG(llvm::dbgs() << "Inherits parent configuration\n");
LLVM_DEBUG(llvm::dbgs() << "Inherits parent configuration\n");

// Reset inheritance of style
Style.InheritsParentConfig = false;
// Reset inheritance of style
Style.InheritsParentConfig = false;

ChildFormatTextToApply.emplace_back(std::move(*Text));
ChildFormatTextToApply.emplace_back(std::move(*Text));

// Breaking out of the inner loop, since we don't want to parse
// .clang-format AND _clang-format, if both exist. Then we continue the
// inner loop (parent directories) in search for the parent
// configuration.
break;
}
// Breaking out of the inner loop, since we don't want to parse
// .clang-format AND _clang-format, if both exist. Then we continue the
// outer loop (parent directories) in search for the parent
// configuration.
break;
}
}

if (!UnsuitableConfigFiles.empty()) {
return make_string_error("Configuration file(s) do(es) not support " +
getLanguageName(Style.Language) + ": " +
Expand Down
40 changes: 17 additions & 23 deletions clang/tools/clang-format/ClangFormat.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -398,8 +398,8 @@ class ClangFormatDiagConsumer : public DiagnosticConsumer {
};

// Returns true on error.
static bool format(StringRef FileName) {
if (!OutputXML && Inplace && FileName == "-") {
static bool format(StringRef FileName, bool IsSTDIN) {
if (!OutputXML && Inplace && IsSTDIN) {
errs() << "error: cannot use -i when reading from stdin.\n";
return false;
}
Expand All @@ -423,7 +423,7 @@ static bool format(StringRef FileName) {
if (InvalidBOM) {
errs() << "error: encoding with unsupported byte order mark \""
<< InvalidBOM << "\" detected";
if (FileName != "-")
if (!IsSTDIN)
errs() << " in file '" << FileName << "'";
errs() << ".\n";
return true;
Expand All @@ -432,7 +432,7 @@ static bool format(StringRef FileName) {
std::vector<tooling::Range> Ranges;
if (fillRanges(Code.get(), Ranges))
return true;
StringRef AssumedFileName = (FileName == "-") ? AssumeFileName : FileName;
StringRef AssumedFileName = IsSTDIN ? AssumeFileName : FileName;
if (AssumedFileName.empty()) {
llvm::errs() << "error: empty filenames are not allowed\n";
return true;
Expand Down Expand Up @@ -544,28 +544,23 @@ static void PrintVersion(raw_ostream &OS) {
}

// Dump the configuration.
static int dumpConfig() {
StringRef FileName;
static int dumpConfig(bool IsSTDIN) {
std::unique_ptr<llvm::MemoryBuffer> Code;
if (FileNames.empty()) {
// We can't read the code to detect the language if there's no
// file name, so leave Code empty here.
FileName = AssumeFileName;
} else {
// Read in the code in case the filename alone isn't enough to
// detect the language.
// We can't read the code to detect the language if there's no file name.
if (!IsSTDIN) {
// Read in the code in case the filename alone isn't enough to detect the
// language.
ErrorOr<std::unique_ptr<MemoryBuffer>> CodeOrErr =
MemoryBuffer::getFileOrSTDIN(FileNames[0]);
if (std::error_code EC = CodeOrErr.getError()) {
llvm::errs() << EC.message() << "\n";
return 1;
}
FileName = (FileNames[0] == "-") ? AssumeFileName : FileNames[0];
Code = std::move(CodeOrErr.get());
}
llvm::Expected<clang::format::FormatStyle> FormatStyle =
clang::format::getStyle(Style, FileName, FallbackStyle,
Code ? Code->getBuffer() : "");
clang::format::getStyle(Style, IsSTDIN ? AssumeFileName : FileNames[0],
FallbackStyle, Code ? Code->getBuffer() : "");
if (!FormatStyle) {
llvm::errs() << llvm::toString(FormatStyle.takeError()) << "\n";
return 1;
Expand Down Expand Up @@ -596,8 +591,11 @@ int main(int argc, const char **argv) {
return 0;
}

if (FileNames.empty())
FileNames.push_back("-");

if (DumpConfig)
return dumpConfig();
return dumpConfig(FileNames[0] == "-");

if (!Files.empty()) {
std::ifstream ExternalFileOfFiles{std::string(Files)};
Expand All @@ -610,11 +608,6 @@ int main(int argc, const char **argv) {
errs() << "Clang-formating " << LineNo << " files\n";
}

bool Error = false;
if (FileNames.empty()) {
Error = clang::format::format("-");
return Error ? 1 : 0;
}
if (FileNames.size() != 1 &&
(!Offsets.empty() || !Lengths.empty() || !LineRanges.empty())) {
errs() << "error: -offset, -length and -lines can only be used for "
Expand All @@ -623,12 +616,13 @@ int main(int argc, const char **argv) {
}

unsigned FileNo = 1;
bool Error = false;
for (const auto &FileName : FileNames) {
if (Verbose) {
errs() << "Formatting [" << FileNo++ << "/" << FileNames.size() << "] "
<< FileName << "\n";
}
Error |= clang::format::format(FileName);
Error |= clang::format::format(FileName, FileName == "-");
}
return Error ? 1 : 0;
}

0 comments on commit 3791b3f

Please sign in to comment.