[tooling] In CompileCommand, Expose the 'file' that was associated with the command.

llvm-svn: 247468
This commit is contained in:
Argyrios Kyrtzidis 2015-09-11 20:43:05 +00:00
parent 744267765c
commit 74bcd21e34
7 changed files with 37 additions and 8 deletions

View File

@ -125,6 +125,12 @@ clang_CompileCommands_getCommand(CXCompileCommands, unsigned I);
CINDEX_LINKAGE CXString CINDEX_LINKAGE CXString
clang_CompileCommand_getDirectory(CXCompileCommand); clang_CompileCommand_getDirectory(CXCompileCommand);
/**
* \brief Get the filename associated with the CompileCommand.
*/
CINDEX_LINKAGE CXString
clang_CompileCommand_getFilename(CXCompileCommand);
/** /**
* \brief Get the number of arguments in the compiler invocation. * \brief Get the number of arguments in the compiler invocation.
* *

View File

@ -42,12 +42,18 @@ namespace tooling {
/// \brief Specifies the working directory and command of a compilation. /// \brief Specifies the working directory and command of a compilation.
struct CompileCommand { struct CompileCommand {
CompileCommand() {} CompileCommand() {}
CompileCommand(Twine Directory, std::vector<std::string> CommandLine) CompileCommand(Twine Directory, Twine Filename,
: Directory(Directory.str()), CommandLine(std::move(CommandLine)) {} std::vector<std::string> CommandLine)
: Directory(Directory.str()),
Filename(Filename.str()),
CommandLine(std::move(CommandLine)) {}
/// \brief The working directory the command was executed from. /// \brief The working directory the command was executed from.
std::string Directory; std::string Directory;
/// The source file associated with the command.
std::string Filename;
/// \brief The command line that was executed. /// \brief The command line that was executed.
std::vector<std::string> CommandLine; std::vector<std::string> CommandLine;

View File

@ -99,13 +99,14 @@ private:
/// failed. /// failed.
bool parse(std::string &ErrorMessage); bool parse(std::string &ErrorMessage);
// Tuple (directory, commandline) where 'commandline' points to the // Tuple (directory, filename, commandline) where 'commandline' points to the
// corresponding scalar nodes in the YAML stream. // corresponding scalar nodes in the YAML stream.
// If the command line contains a single argument, it is a shell-escaped // If the command line contains a single argument, it is a shell-escaped
// command line. // command line.
// Otherwise, each entry in the command line vector is a literal // Otherwise, each entry in the command line vector is a literal
// argument to the compiler. // argument to the compiler.
typedef std::pair<llvm::yaml::ScalarNode *, typedef std::tuple<llvm::yaml::ScalarNode *,
llvm::yaml::ScalarNode *,
std::vector<llvm::yaml::ScalarNode *>> CompileCommandRef; std::vector<llvm::yaml::ScalarNode *>> CompileCommandRef;
/// \brief Converts the given array of CompileCommandRefs to CompileCommands. /// \brief Converts the given array of CompileCommandRefs to CompileCommands.

View File

@ -299,13 +299,15 @@ FixedCompilationDatabase(Twine Directory, ArrayRef<std::string> CommandLine) {
std::vector<std::string> ToolCommandLine(1, "clang-tool"); std::vector<std::string> ToolCommandLine(1, "clang-tool");
ToolCommandLine.insert(ToolCommandLine.end(), ToolCommandLine.insert(ToolCommandLine.end(),
CommandLine.begin(), CommandLine.end()); CommandLine.begin(), CommandLine.end());
CompileCommands.emplace_back(Directory, std::move(ToolCommandLine)); CompileCommands.emplace_back(Directory, StringRef(),
std::move(ToolCommandLine));
} }
std::vector<CompileCommand> std::vector<CompileCommand>
FixedCompilationDatabase::getCompileCommands(StringRef FilePath) const { FixedCompilationDatabase::getCompileCommands(StringRef FilePath) const {
std::vector<CompileCommand> Result(CompileCommands); std::vector<CompileCommand> Result(CompileCommands);
Result[0].CommandLine.push_back(FilePath); Result[0].CommandLine.push_back(FilePath);
Result[0].Filename = FilePath;
return Result; return Result;
} }

View File

@ -232,8 +232,11 @@ void JSONCompilationDatabase::getCommands(
std::vector<CompileCommand> &Commands) const { std::vector<CompileCommand> &Commands) const {
for (int I = 0, E = CommandsRef.size(); I != E; ++I) { for (int I = 0, E = CommandsRef.size(); I != E; ++I) {
SmallString<8> DirectoryStorage; SmallString<8> DirectoryStorage;
Commands.emplace_back(CommandsRef[I].first->getValue(DirectoryStorage), SmallString<32> FilenameStorage;
nodeToCommandLine(CommandsRef[I].second)); Commands.emplace_back(
std::get<0>(CommandsRef[I])->getValue(DirectoryStorage),
std::get<1>(CommandsRef[I])->getValue(FilenameStorage),
nodeToCommandLine(std::get<2>(CommandsRef[I])));
} }
} }
@ -335,7 +338,7 @@ bool JSONCompilationDatabase::parse(std::string &ErrorMessage) {
llvm::sys::path::native(FileName, NativeFilePath); llvm::sys::path::native(FileName, NativeFilePath);
} }
IndexByFile[NativeFilePath].push_back( IndexByFile[NativeFilePath].push_back(
CompileCommandRef(Directory, *Command)); CompileCommandRef(Directory, File, *Command));
MatchTrie.insert(NativeFilePath); MatchTrie.insert(NativeFilePath);
} }
return true; return true;

View File

@ -111,6 +111,16 @@ clang_CompileCommand_getDirectory(CXCompileCommand CCmd)
return cxstring::createRef(cmd->Directory.c_str()); return cxstring::createRef(cmd->Directory.c_str());
} }
CXString
clang_CompileCommand_getFilename(CXCompileCommand CCmd)
{
if (!CCmd)
return cxstring::createNull();
CompileCommand *cmd = static_cast<CompileCommand *>(CCmd);
return cxstring::createRef(cmd->Filename.c_str());
}
unsigned unsigned
clang_CompileCommand_getNumArgs(CXCompileCommand CCmd) clang_CompileCommand_getNumArgs(CXCompileCommand CCmd)
{ {

View File

@ -297,6 +297,7 @@ clang_CompileCommands_dispose
clang_CompileCommands_getSize clang_CompileCommands_getSize
clang_CompileCommands_getCommand clang_CompileCommands_getCommand
clang_CompileCommand_getDirectory clang_CompileCommand_getDirectory
clang_CompileCommand_getFilename
clang_CompileCommand_getMappedSourceContent clang_CompileCommand_getMappedSourceContent
clang_CompileCommand_getMappedSourcePath clang_CompileCommand_getMappedSourcePath
clang_CompileCommand_getNumArgs clang_CompileCommand_getNumArgs