From: Ted Kremenek Date: Thu, 22 Oct 2009 00:03:57 +0000 (+0000) Subject: Enhance 'clang_createTranslationUnitFromSourceFile()' in two ways: X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=139ba86a362593da2e350f881e5c7003917aa5a7;p=clang Enhance 'clang_createTranslationUnitFromSourceFile()' in two ways: (1) Allow the source file to be specified in the actual command line arguments by allowing the caller to set 'source_filename' to NULL. (2) Automatically strip off the arguments '-emit-ast', '-fsyntax-only', and '-c'. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@84802 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang-c/Index.h b/include/clang-c/Index.h index 47cecd1c8c..644b2e2941 100644 --- a/include/clang-c/Index.h +++ b/include/clang-c/Index.h @@ -159,12 +159,20 @@ void clang_disposeTranslationUnit(CXTranslationUnit); * \brief Return the CXTranslationUnit for a given source file and the provided * command line arguments one would pass to the compiler. * - * Note: If provided, this routine will strip the '-o ' command - * line arguments. + * Note: The 'source_filename' argument is optional. If the caller provides a NULL pointer, + * the name of the source file is expected to reside in the specified command line arguments. + * + * Note: When encountered in 'clang_command_line_args', the following options are ignored: + * + * '-c' + * '-emit-ast' + * '-fsyntax-only' + * '-o ' (both '-o' and '' are ignored) + * */ CXTranslationUnit clang_createTranslationUnitFromSourceFile( CXIndex CIdx, - const char *source_filename, + const char *source_filename /* specify NULL if the source file is in clang_command_line_args */, int num_clang_command_line_args, const char **clang_command_line_args ); diff --git a/tools/CIndex/CIndex.cpp b/tools/CIndex/CIndex.cpp index fb6dd5608f..66db65b009 100644 --- a/tools/CIndex/CIndex.cpp +++ b/tools/CIndex/CIndex.cpp @@ -386,24 +386,45 @@ CXTranslationUnit clang_createTranslationUnitFromSourceFile( assert(CIdx && "Passed null CXIndex"); CIndexer *CXXIdx = static_cast(CIdx); - // Build up the arguments for involing clang. - llvm::sys::Path ClangPath = static_cast(CIdx)->getClangPath(); + // Build up the arguments for invoking 'clang'. std::vector argv; + + // First add the complete path to the 'clang' executable. + llvm::sys::Path ClangPath = static_cast(CIdx)->getClangPath(); argv.push_back(ClangPath.c_str()); + + // Add the '-emit-ast' option as our execution mode for 'clang'. argv.push_back("-emit-ast"); - argv.push_back(source_filename); - argv.push_back("-o"); + + // The 'source_filename' argument is optional. If the caller does not + // specify it then it is assumed that the source file is specified + // in the actual argument list. + if (source_filename) + argv.push_back(source_filename); + // Generate a temporary name for the AST file. + argv.push_back("-o"); char astTmpFile[L_tmpnam]; argv.push_back(tmpnam(astTmpFile)); - for (int i = 0; i < num_command_line_args; i++) { - if (command_line_args[i] && strcmp(command_line_args[i], "-o") != 0) - argv.push_back(command_line_args[i]); - else { - if (++i < num_command_line_args) // Skip "-o"... - i++; // ...and the following argument as well. + + // Process the compiler options, stripping off '-o', '-c', '-fsyntax-only'. + for (int i = 0; i < num_command_line_args; ++i) + if (const char *arg = command_line_args[i]) { + if (strcmp(arg, "-o") == 0) { + ++i; // Also skip the matching argument. + continue; + } + if (strcmp(arg, "-emit-ast") == 0 || + strcmp(arg, "-c") == 0 || + strcmp(arg, "-fsyntax-only") == 0) { + continue; + } + + // Keep the argument. + argv.push_back(arg); } - } + + // Add the null terminator. argv.push_back(NULL); #ifndef LLVM_ON_WIN32