#include <AtomicFile.hpp>
#include <core/CacheEntry.hpp>
#include <core/Manifest.hpp>
+#include <core/MsvcShowIncludesOutput.hpp>
#include <core/Result.hpp>
#include <core/ResultRetriever.hpp>
-#include <core/ShowIncludesParser.hpp>
#include <core/Statistics.hpp>
#include <core/StatsLog.hpp>
#include <core/exceptions.hpp>
static std::optional<Digest>
result_key_from_includes(Context& ctx, Hash& hash, std::string_view stdout_data)
{
- for (std::string_view token : core::ShowIncludesParser::tokenize(
+ for (std::string_view token : core::MsvcShowIncludesOutput::get_includes(
stdout_data, ctx.config.msvc_dep_prefix())) {
const std::string path = Util::make_relative_path(ctx, token);
remember_include_file(ctx, path, hash, false, &hash);
ctx, util::to_string_view(result->stderr_data), STDERR_FILENO);
Util::send_to_fd(
ctx,
- util::to_string_view(core::ShowIncludesParser::strip_includes(
+ util::to_string_view(core::MsvcShowIncludesOutput::strip_includes(
ctx, std::move(result->stdout_data))),
STDOUT_FILENO);
// Send stdout after stderr, it makes the output clearer with MSVC.
Util::send_to_fd(
ctx,
- util::to_string_view(core::ShowIncludesParser::strip_includes(
+ util::to_string_view(core::MsvcShowIncludesOutput::strip_includes(
ctx, std::move(result->stdout_data))),
STDOUT_FILENO);
// this program; if not, write to the Free Software Foundation, Inc., 51
// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
-#include "ShowIncludesParser.hpp"
+#include "MsvcShowIncludesOutput.hpp"
#include <Context.hpp>
#include <Util.hpp>
#include <util/string.hpp>
-namespace core::ShowIncludesParser {
+namespace core::MsvcShowIncludesOutput {
std::vector<std::string_view>
-tokenize(std::string_view file_content, std::string_view prefix)
+get_includes(std::string_view file_content, std::string_view prefix)
{
// /showIncludes output is written to stdout together with other messages.
// Every line of it is "<prefix> <spaces> <file>" where the prefix is "Note:
return util::Bytes(new_stdout_text.data(), new_stdout_text.size());
}
-} // namespace core::ShowIncludesParser
+} // namespace core::MsvcShowIncludesOutput
// Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#include "../src/Context.hpp"
-#include "../src/core/ShowIncludesParser.hpp"
+#include "../src/core/MsvcShowIncludesOutput.hpp"
#include "../src/util/string.hpp"
#include "TestUtil.hpp"
static const std::string defaultPrefix = "Note: including file:";
-TEST_SUITE_BEGIN("ShowIncludesParser");
+TEST_SUITE_BEGIN("MsvcShowIncludesOutput");
-TEST_CASE("ShowIncludesParser::tokenize")
+TEST_CASE("MsvcShowIncludesOutput::get_includes")
{
SUBCASE("Parse empty output")
{
std::string contents;
const auto result =
- core::ShowIncludesParser::tokenize(contents, defaultPrefix);
+ core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix);
CHECK(result.size() == 0);
}
Note: including file: C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.33.31629\include\deque
)";
const auto result =
- core::ShowIncludesParser::tokenize(contents, defaultPrefix);
+ core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix);
REQUIRE(result.size() == 5);
CHECK(result[0] == "F:/Projects/ccache/build-msvc/config.h");
CHECK(result[1] == R"(F:\Projects\ccache\unittest\../src/Context.hpp)");
"Note: including file: foo\r\n"
"Note: including file: bar\r\n";
const auto result =
- core::ShowIncludesParser::tokenize(contents, defaultPrefix);
+ core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix);
REQUIRE(result.size() == 2);
CHECK(result[0] == "foo");
CHECK(result[1] == "bar");
"Note: including file: \n"
"Note: including file: bar\n";
const auto result =
- core::ShowIncludesParser::tokenize(contents, defaultPrefix);
+ core::MsvcShowIncludesOutput::get_includes(contents, defaultPrefix);
REQUIRE(result.size() == 2);
CHECK(result[0] == "foo");
CHECK(result[1] == "bar");
std::string contents = R"(custom foo
custom bar
Just a line with custom in the middle)";
- const auto result = core::ShowIncludesParser::tokenize(contents, "custom");
+ const auto result =
+ core::MsvcShowIncludesOutput::get_includes(contents, "custom");
REQUIRE(result.size() == 2);
CHECK(result[0] == "foo");
CHECK(result[1] == "bar");
}
}
-TEST_CASE("ShowIncludesParser::strip_includes")
+TEST_CASE("MsvcShowIncludesOutput::strip_includes")
{
Context ctx;
const util::Bytes input = util::to_span(
SUBCASE("Empty output")
{
const util::Bytes result =
- core::ShowIncludesParser::strip_includes(ctx, {});
+ core::MsvcShowIncludesOutput::strip_includes(ctx, {});
CHECK(result.size() == 0);
}
SUBCASE("Feature disabled")
{
const util::Bytes result =
- core::ShowIncludesParser::strip_includes(ctx, util::Bytes(input));
+ core::MsvcShowIncludesOutput::strip_includes(ctx, util::Bytes(input));
CHECK(result == input);
}
SUBCASE("Wrong compiler")
{
const util::Bytes result =
- core::ShowIncludesParser::strip_includes(ctx, util::Bytes(input));
+ core::MsvcShowIncludesOutput::strip_includes(ctx, util::Bytes(input));
CHECK(result == input);
}
SUBCASE("Simple output")
{
const util::Bytes result =
- core::ShowIncludesParser::strip_includes(ctx, util::Bytes(input));
+ core::MsvcShowIncludesOutput::strip_includes(ctx, util::Bytes(input));
CHECK(result == util::to_span("First\nSecond\n"));
}
SUBCASE("Empty lines")
{
- const util::Bytes result = core::ShowIncludesParser::strip_includes(
+ const util::Bytes result = core::MsvcShowIncludesOutput::strip_includes(
ctx,
util::to_span("First\n"
"\n"
SUBCASE("CRLF")
{
- const util::Bytes result = core::ShowIncludesParser::strip_includes(
+ const util::Bytes result = core::MsvcShowIncludesOutput::strip_includes(
ctx,
util::to_span("First\r\n"
"Note: including file: foo\r\n"
SUBCASE("Custom prefix")
{
ctx.config.set_msvc_dep_prefix("custom");
- const util::Bytes result = core::ShowIncludesParser::strip_includes(
+ const util::Bytes result = core::MsvcShowIncludesOutput::strip_includes(
ctx,
util::to_span("First\n"
"custom: including file: foo\n"