Skip to content

Commit

Permalink
Ask user for relevant diagnostics when clang translation unit creatio…
Browse files Browse the repository at this point in the history
…n fails.

Closes issue MaskRay#450.
  • Loading branch information
jacobdufault committed Feb 14, 2018
1 parent 71a55ce commit aba38a9
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 17 deletions.
18 changes: 10 additions & 8 deletions src/clang_translation_unit.cc
Original file line number Diff line number Diff line change
Expand Up @@ -93,24 +93,26 @@ std::unique_ptr<ClangTranslationUnit> ClangTranslationUnit::Create(
if (error_code != CXError_Success && cx_tu)
EmitDiagnostics(filepath, args, cx_tu);

auto make_msg = [&]() {
return "Please try running the following, identify which flag causes the "
"issue, and report a bug. cquery will then filter the flag for you "
" automatically:\n$ " + StringJoin(args, " ");
};

switch (error_code) {
case CXError_Success:
return MakeUnique<ClangTranslationUnit>(cx_tu);
case CXError_Failure:
LOG_S(ERROR) << "libclang generic failure for " << filepath
<< " with args " << StringJoin(args);
LOG_S(ERROR) << "libclang generic failure for " << filepath << ". " << make_msg();
return nullptr;
case CXError_Crashed:
LOG_S(ERROR) << "libclang crashed for " << filepath << " with args "
<< StringJoin(args);
LOG_S(ERROR) << "libclang crashed for " << filepath << ". " << make_msg();
return nullptr;
case CXError_InvalidArguments:
LOG_S(ERROR) << "libclang had invalid arguments for "
<< " with args " << StringJoin(args) << filepath;
LOG_S(ERROR) << "libclang had invalid arguments for " << filepath << ". " << make_msg();
return nullptr;
case CXError_ASTReadError:
LOG_S(ERROR) << "libclang had ast read error for " << filepath
<< " with args " << StringJoin(args);
LOG_S(ERROR) << "libclang had ast read error for " << filepath << ". " << make_msg();
return nullptr;
}

Expand Down
25 changes: 16 additions & 9 deletions src/project.cc
Original file line number Diff line number Diff line change
Expand Up @@ -265,7 +265,12 @@ Project::Entry GetCompilationEntryFromCompileCommandEntry(
if (!AnyStartsWith(result.args, "-Wno-unknown-warning-option"))
result.args.push_back("-Wno-unknown-warning-option");

// Using -fparse-all-comments enables documententation in the indexer and in
// We sometimes dump the command to logs and ask the user to run it. Include
// -fsyntax-only so they don't do a full compile.
if (!AnyStartsWith(result.args, "-fsyntax-only"))
result.args.push_back("-fsyntax-only");

// Using -fparse-all-comments enables documentation in the indexer and in
// code completion.
if (init_opts->index.comments > 1 &&
!AnyStartsWith(result.args, "-fparse-all-comments")) {
Expand Down Expand Up @@ -598,28 +603,28 @@ TEST_SUITE("Project") {
/* expected */
{"clang", "-working-directory", "/dir/", "-xc++", "-std=c++14",
"-lstdc++", "&/dir/myfile.cc", "-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option", "-fparse-all-comments"});
"-Wno-unknown-warning-option", "-fsyntax-only", "-fparse-all-comments"});

CheckFlags(
/* raw */ {"clang.exe"},
/* expected */
{"clang.exe", "-working-directory", "/dir/", "-xc++", "-std=c++14",
"-resource-dir=/w/resource_dir/", "-Wno-unknown-warning-option",
"-fparse-all-comments"});
"-fsyntax-only", "-fparse-all-comments"});

CheckFlags(
/* raw */ {"goma", "clang"},
/* expected */
{"clang", "-working-directory", "/dir/", "-xc++", "-std=c++14",
"-resource-dir=/w/resource_dir/", "-Wno-unknown-warning-option",
"-fparse-all-comments"});
"-fsyntax-only", "-fparse-all-comments"});

CheckFlags(
/* raw */ {"goma", "clang", "--foo"},
/* expected */
{"clang", "-working-directory", "/dir/", "-xc++", "-std=c++14", "--foo",
"-resource-dir=/w/resource_dir/", "-Wno-unknown-warning-option",
"-fparse-all-comments"});
"-fsyntax-only", "-fparse-all-comments"});
}

TEST_CASE("Windows path normalization") {
Expand All @@ -628,15 +633,15 @@ TEST_SUITE("Project") {
/* expected */
{"clang", "-working-directory", "E:/workdir", "-xc++", "-std=c++14",
"&E:/workdir/bar.cc", "-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option", "-fparse-all-comments"});
"-Wno-unknown-warning-option", "-fsyntax-only", "-fparse-all-comments"});

CheckFlags(
"E:/workdir", "E:/workdir/bar.cc",
/* raw */ {"clang", "E:/workdir/bar.cc"},
/* expected */
{"clang", "-working-directory", "E:/workdir", "-xc++", "-std=c++14",
"&E:/workdir/bar.cc", "-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option", "-fparse-all-comments"});
"-Wno-unknown-warning-option", "-fsyntax-only", "-fparse-all-comments"});
}

TEST_CASE("Path in args") {
Expand All @@ -646,7 +651,7 @@ TEST_SUITE("Project") {
/* expected */
{"cc", "-working-directory", "/home/user", "-xc", "-std=gnu11", "-O0",
"&/home/user/foo/bar.c", "-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option", "-fparse-all-comments"});
"-Wno-unknown-warning-option", "-fsyntax-only", "-fparse-all-comments"});
}

TEST_CASE("Implied binary") {
Expand All @@ -656,7 +661,7 @@ TEST_SUITE("Project") {
/* expected */
{"clang++", "-working-directory", "/home/user", "-xc++", "-std=c++14",
"-DDONT_IGNORE_ME", "-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option", "-fparse-all-comments"});
"-Wno-unknown-warning-option", "-fsyntax-only", "-fparse-all-comments"});
}

// Checks flag parsing for a random chromium file in comparison to what
Expand Down Expand Up @@ -1007,6 +1012,7 @@ TEST_SUITE("Project") {
"lock_screen_sanity_unittest.cc",
"-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option",
"-fsyntax-only",
"-fparse-all-comments"});
}

Expand Down Expand Up @@ -1332,6 +1338,7 @@ TEST_SUITE("Project") {
"&/w/c/s/out/Release/../../apps/app_lifetime_monitor.cc",
"-resource-dir=/w/resource_dir/",
"-Wno-unknown-warning-option",
"-fsyntax-only",
"-fparse-all-comments"});
}

Expand Down

0 comments on commit aba38a9

Please sign in to comment.