std::string Format(std::string qualifier, const SourceLocation& location, StringView message, size_t squiggle_size = 0u) { SourceFile::Position position; std::string surrounding_line = location.SourceLine(&position); std::string squiggle = MakeSquiggle(surrounding_line, position.column); if (squiggle_size != 0u) { --squiggle_size; } squiggle += std::string(squiggle_size, '~'); // Some tokens (like string literals) can span multiple // lines. Truncate the string to just one line at most. The // containing line contains a newline, so drop it when // comparing sizes. size_t line_size = surrounding_line.size() - 1; if (squiggle.size() > line_size) { squiggle.resize(line_size); } // Many editors and IDEs recognize errors in the form of // filename:linenumber:column: error: descriptive-test-here\n std::string error = location.position(); error.append(": "); error.append(qualifier); error.append(": "); error.append(message); error.push_back('\n'); error.append(surrounding_line); error.append(squiggle); return error; }