//===- IndentedOstream.cpp - raw ostream wrapper to indent ----------------===// // // 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 // //===----------------------------------------------------------------------===// // // raw_ostream subclass that keeps track of indentation for textual output // where indentation helps readability. // //===----------------------------------------------------------------------===// #include "mlir/Support/IndentedOstream.h" using namespace mlir; raw_indented_ostream &mlir::raw_indented_ostream::reindent(StringRef str) { StringRef remaining = str; // Find leading whitespace indent. while (!remaining.empty()) { auto split = remaining.split('\n'); size_t indent = split.first.find_first_not_of(" \t"); if (indent != StringRef::npos) { leadingWs = indent; break; } remaining = split.second; } // Print, skipping the empty lines. *this << remaining; leadingWs = 0; return *this; } void mlir::raw_indented_ostream::write_impl(const char *ptr, size_t size) { StringRef str(ptr, size); // Print out indented. auto print = [this](StringRef str) { if (atStartOfLine) os.indent(currentIndent) << str.substr(leadingWs); else os << str.substr(leadingWs); }; while (!str.empty()) { size_t idx = str.find('\n'); if (idx == StringRef::npos) { if (!str.substr(leadingWs).empty()) { print(str); atStartOfLine = false; } break; } auto split = std::make_pair(str.slice(0, idx), str.slice(idx + 1, StringRef::npos)); // Print empty new line without spaces if line only has spaces. if (!split.first.ltrim().empty()) print(split.first); os << '\n'; atStartOfLine = true; str = split.second; } }