[clang-tools-extra] r178182 - Broke out header file list reading into separate function. Moved options to front. Removed some trailing spaces.
John Thompson
John.Thompson.JTSoftware at gmail.com
Wed Mar 27 14:23:21 PDT 2013
Author: jtsoftware
Date: Wed Mar 27 16:23:21 2013
New Revision: 178182
URL: http://llvm.org/viewvc/llvm-project?rev=178182&view=rev
Log:
Broke out header file list reading into separate function. Moved options to front. Removed some trailing spaces.
Modified:
clang-tools-extra/trunk/modularize/Modularize.cpp
Modified: clang-tools-extra/trunk/modularize/Modularize.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/modularize/Modularize.cpp?rev=178182&r1=178181&r2=178182&view=diff
==============================================================================
--- clang-tools-extra/trunk/modularize/Modularize.cpp (original)
+++ clang-tools-extra/trunk/modularize/Modularize.cpp Wed Mar 27 16:23:21 2013
@@ -30,7 +30,7 @@
//
// Note that by default, the underlying Clang front end assumes .h files
// contain C source. If your .h files in the file list contain C++ source,
-// you should append the following to your command lines: -x c++
+// you should append the following to your command lines: -x c++
//
// Modularize will do normal parsing, reporting normal errors and warnings,
// but will also report special error messages like the following:
@@ -96,6 +96,68 @@ using namespace clang::tooling;
using namespace clang;
using namespace llvm;
+// Option to specify a file name for a list of header files to check.
+cl::opt<std::string>
+ListFileName(cl::Positional,
+ cl::desc("<name of file containing list of headers to check>"));
+
+// Collect all other arguments, which will be passed to the front end.
+cl::list<std::string> CC1Arguments(
+ cl::ConsumeAfter, cl::desc("<arguments to be passed to front end>..."));
+
+// Option to specify a prefix to be prepended to the header names.
+cl::opt<std::string> HeaderPrefix(
+ "prefix", cl::init(""),
+ cl::desc(
+ "Prepend header file paths with this prefix."
+ " If not specified,"
+ " the files are considered to be relative to the header list file."));
+
+// Read the header list file and collect the header file names.
+error_code GetHeaderFileNames(SmallVectorImpl<std::string> &headerFileNames,
+ StringRef listFileName, StringRef headerPrefix) {
+
+ // By default, use the path component of the list file name.
+ SmallString<256> headerDirectory(listFileName);
+ sys::path::remove_filename(headerDirectory);
+
+ // Get the prefix if we have one.
+ if (headerPrefix.size() != 0)
+ headerDirectory = headerPrefix;
+
+ // Read the header list file into a buffer.
+ OwningPtr<MemoryBuffer> listBuffer;
+ if (error_code ec = MemoryBuffer::getFile(ListFileName, listBuffer)) {
+ return ec;
+ }
+
+ // Parse the header list into strings.
+ SmallVector<StringRef, 32> strings;
+ listBuffer->getBuffer().split(strings, "\n", -1, false);
+
+ // Collect the header file names from the string list.
+ for (SmallVectorImpl<StringRef>::iterator I = strings.begin(),
+ E = strings.end();
+ I != E; ++I) {
+ StringRef line = (*I).trim();
+ // Ignore comments and empty lines.
+ if (line.empty() || (line[0] == '#'))
+ continue;
+ SmallString<256> headerFileName;
+ // Prepend header file name prefix if it's not absolute.
+ if (sys::path::is_absolute(line))
+ headerFileName = line;
+ else {
+ headerFileName = headerDirectory;
+ sys::path::append(headerFileName, line);
+ }
+ // Save the resulting header file path.
+ headerFileNames.push_back(headerFileName.str());
+ }
+
+ return error_code::success();
+}
+
// FIXME: The Location class seems to be something that we might
// want to design to be applicable to a wider range of tools, and stick it
// somewhere into Tooling/ in mainline
@@ -351,23 +413,6 @@ private:
EntityMap &Entities;
};
-// Option to specify a file name for a list of header files to check.
-cl::opt<std::string>
-ListFileName(cl::Positional,
- cl::desc("<name of file containing list of headers to check>"));
-
-// Collect all other arguments, which will be passed to the front end.
-cl::list<std::string> CC1Arguments(
- cl::ConsumeAfter, cl::desc("<arguments to be passed to front end>..."));
-
-// Option to specify a prefix to be prepended to the header names.
-cl::opt<std::string> HeaderPrefix(
- "prefix", cl::init(""),
- cl::desc(
- "Prepend header file paths with this prefix."
- " If not specified,"
- " the files are considered to be relative to the header list file."));
-
int main(int argc, const char **argv) {
// This causes options to be parsed.
@@ -376,43 +421,15 @@ int main(int argc, const char **argv) {
// No go if we have no header list file.
if (ListFileName.size() == 0) {
cl::PrintHelpMessage();
- return -1;
+ return 1;
}
- // By default, use the path component of the list file name.
- SmallString<256> HeaderDirectory(ListFileName);
- sys::path::remove_filename(HeaderDirectory);
-
- // Get the prefix if we have one.
- if (HeaderPrefix.size() != 0)
- HeaderDirectory = HeaderPrefix;
-
- // Load the list of headers.
+ // Get header file names.
SmallVector<std::string, 32> Headers;
- {
- OwningPtr<MemoryBuffer> listBuffer;
- if (error_code ec = MemoryBuffer::getFile(ListFileName, listBuffer)) {
- errs() << argv[0] << ": error: Unable to get header list '" << ListFileName
- << "': " << ec.message() << '\n';
- return 1;
- }
- SmallVector<StringRef, 32> strings;
- listBuffer->getBuffer().split(strings, "\n", -1, false);
- for (SmallVectorImpl<StringRef>::iterator I = strings.begin(),
- E = strings.end();
- I != E; ++I) {
- StringRef line = (*I).trim();
- if (line.empty() || (line[0] == '#'))
- continue;
- SmallString<256> headerFileName;
- if (sys::path::is_absolute(line))
- headerFileName = line;
- else {
- headerFileName = HeaderDirectory;
- sys::path::append(headerFileName, line);
- }
- Headers.push_back(headerFileName.str());
- }
+ if (error_code ec = GetHeaderFileNames(Headers, ListFileName, HeaderPrefix)) {
+ errs() << argv[0] << ": error: Unable to get header list '" << ListFileName
+ << "': " << ec.message() << '\n';
+ return 1;
}
// Create the compilation database.
More information about the cfe-commits
mailing list