Declare abstract class ArgumentsAdjuster. This abstract interface describes

a command line argument adjuster, which is responsible for command line
arguments modification before the arguments are used to run a frontend action.

Define class ClangSyntaxOnlyAdjuster implements ArgumentsAdjuster interface.
This class converts input command line arguments to the "syntax check only"
variant.

Reviewed by Manuel Klimek.

llvm-svn: 156478
This commit is contained in:
Simon Atanasyan 2012-05-09 16:18:30 +00:00
parent cbabea83d4
commit 32df72db66
6 changed files with 117 additions and 3 deletions

View File

@ -0,0 +1,56 @@
//===--- ArgumentsAdjusters.h - Command line arguments adjuster -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares base abstract class ArgumentsAdjuster and its descendants.
// These classes are intended to modify command line arguments obtained from
// a compilation database before they are used to run a frontend action.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_TOOLING_ARGUMENTSADJUSTERS_H
#define LLVM_CLANG_TOOLING_ARGUMENTSADJUSTERS_H
#include <string>
#include <vector>
namespace clang {
namespace tooling {
/// \brief A sequence of command line arguments.
typedef std::vector<std::string> CommandLineArguments;
/// \brief Abstract interface for a command line adjusters.
///
/// This abstract interface describes a command line argument adjuster,
/// which is responsible for command line arguments modification before
/// the arguments are used to run a frontend action.
class ArgumentsAdjuster {
public:
/// \brief Returns adjusted command line arguments.
///
/// \param Args Input sequence of command line arguments.
///
/// \returns Modified sequence of command line arguments.
virtual CommandLineArguments Adjust(const CommandLineArguments &Args) = 0;
};
/// \brief Syntax check only command line adjuster.
///
/// This class implements ArgumentsAdjuster interface and converts input
/// command line arguments to the "syntax check only" variant.
class ClangSyntaxOnlyAdjuster : public ArgumentsAdjuster {
virtual CommandLineArguments Adjust(const CommandLineArguments &Args);
};
} // end namespace tooling
} // end namespace clang
#endif // LLVM_CLANG_TOOLING_ARGUMENTSADJUSTERS_H

View File

@ -35,6 +35,7 @@
#include "clang/Basic/FileManager.h" #include "clang/Basic/FileManager.h"
#include "clang/Basic/LLVM.h" #include "clang/Basic/LLVM.h"
#include "clang/Driver/Util.h" #include "clang/Driver/Util.h"
#include "clang/Tooling/ArgumentsAdjusters.h"
#include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/CompilationDatabase.h"
#include <string> #include <string>
#include <vector> #include <vector>
@ -138,6 +139,10 @@ class ToolInvocation {
/// \brief Utility to run a FrontendAction over a set of files. /// \brief Utility to run a FrontendAction over a set of files.
/// ///
/// This class is written to be usable for command line utilities. /// This class is written to be usable for command line utilities.
/// By default the class uses ClangSyntaxOnlyAdjuster to modify
/// command line arguments before the arguments are used to run
/// a frontend action. One could install another command line
/// arguments adjuster by call setArgumentsAdjuster() method.
class ClangTool { class ClangTool {
public: public:
/// \brief Constructs a clang tool to run over a list of files. /// \brief Constructs a clang tool to run over a list of files.
@ -155,6 +160,11 @@ class ClangTool {
/// \param Content A null terminated buffer of the file's content. /// \param Content A null terminated buffer of the file's content.
void mapVirtualFile(StringRef FilePath, StringRef Content); void mapVirtualFile(StringRef FilePath, StringRef Content);
/// \brief Install command line arguments adjuster.
///
/// \param Adjuster Command line arguments adjuster.
void setArgumentsAdjuster(ArgumentsAdjuster *Adjuster);
/// Runs a frontend action over all files specified in the command line. /// Runs a frontend action over all files specified in the command line.
/// ///
/// \param ActionFactory Factory generating the frontend actions. The function /// \param ActionFactory Factory generating the frontend actions. The function
@ -174,6 +184,8 @@ class ClangTool {
FileManager Files; FileManager Files;
// Contains a list of pairs (<file name>, <file content>). // Contains a list of pairs (<file name>, <file content>).
std::vector< std::pair<StringRef, StringRef> > MappedFileContents; std::vector< std::pair<StringRef, StringRef> > MappedFileContents;
llvm::OwningPtr<ArgumentsAdjuster> ArgsAdjuster;
}; };
template <typename T> template <typename T>

View File

@ -0,0 +1,31 @@
//===--- ArgumentsAdjusters.cpp - Command line arguments adjuster ---------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains definitions of classes which implement ArgumentsAdjuster
// interface.
//
//===----------------------------------------------------------------------===//
#include "clang/Tooling/ArgumentsAdjusters.h"
namespace clang {
namespace tooling {
/// Add -fsyntax-only option to the commnand line arguments.
CommandLineArguments
ClangSyntaxOnlyAdjuster::Adjust(const CommandLineArguments &Args) {
CommandLineArguments AdjustedArgs = Args;
// FIXME: Remove options that generate output.
AdjustedArgs.push_back("-fsyntax-only");
return AdjustedArgs;
}
} // end namespace tooling
} // end namespace clang

View File

@ -4,4 +4,5 @@ SET(LLVM_USED_LIBS clangBasic clangFrontend clangAST)
add_clang_library(clangTooling add_clang_library(clangTooling
CompilationDatabase.cpp CompilationDatabase.cpp
Tooling.cpp Tooling.cpp
ArgumentsAdjusters.cpp
) )

View File

@ -12,6 +12,7 @@
// //
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//
#include "clang/Tooling/ArgumentsAdjusters.h"
#include "clang/Tooling/Tooling.h" #include "clang/Tooling/Tooling.h"
#include "clang/Tooling/CompilationDatabase.h" #include "clang/Tooling/CompilationDatabase.h"
#include "clang/Driver/Compilation.h" #include "clang/Driver/Compilation.h"
@ -253,7 +254,8 @@ void ToolInvocation::addFileMappingsTo(SourceManager &Sources) {
ClangTool::ClangTool(const CompilationDatabase &Compilations, ClangTool::ClangTool(const CompilationDatabase &Compilations,
ArrayRef<std::string> SourcePaths) ArrayRef<std::string> SourcePaths)
: Files((FileSystemOptions())) { : Files((FileSystemOptions())),
ArgsAdjuster(new ClangSyntaxOnlyAdjuster()) {
llvm::SmallString<1024> BaseDirectory; llvm::SmallString<1024> BaseDirectory;
if (const char *PWD = ::getenv("PWD")) if (const char *PWD = ::getenv("PWD"))
BaseDirectory = PWD; BaseDirectory = PWD;
@ -285,6 +287,10 @@ void ClangTool::mapVirtualFile(StringRef FilePath, StringRef Content) {
MappedFileContents.push_back(std::make_pair(FilePath, Content)); MappedFileContents.push_back(std::make_pair(FilePath, Content));
} }
void ClangTool::setArgumentsAdjuster(ArgumentsAdjuster *Adjuster) {
ArgsAdjuster.reset(Adjuster);
}
int ClangTool::run(FrontendActionFactory *ActionFactory) { int ClangTool::run(FrontendActionFactory *ActionFactory) {
bool ProcessingFailed = false; bool ProcessingFailed = false;
for (unsigned I = 0; I < CompileCommands.size(); ++I) { for (unsigned I = 0; I < CompileCommands.size(); ++I) {
@ -299,8 +305,8 @@ int ClangTool::run(FrontendActionFactory *ActionFactory) {
if (chdir(CompileCommands[I].second.Directory.c_str())) if (chdir(CompileCommands[I].second.Directory.c_str()))
llvm::report_fatal_error("Cannot chdir into \"" + llvm::report_fatal_error("Cannot chdir into \"" +
CompileCommands[I].second.Directory + "\n!"); CompileCommands[I].second.Directory + "\n!");
std::vector<std::string> &CommandLine = std::vector<std::string> CommandLine =
CompileCommands[I].second.CommandLine; ArgsAdjuster->Adjust(CompileCommands[I].second.CommandLine);
llvm::outs() << "Processing: " << File << ".\n"; llvm::outs() << "Processing: " << File << ".\n";
ToolInvocation Invocation(CommandLine, ActionFactory->create(), &Files); ToolInvocation Invocation(CommandLine, ActionFactory->create(), &Files);
for (int I = 0, E = MappedFileContents.size(); I != E; ++I) { for (int I = 0, E = MappedFileContents.size(); I != E; ++I) {

View File

@ -0,0 +1,8 @@
// RUN: clang-check . "%s" -- -no-integrated-as -c 2>&1 | FileCheck %s
// CHECK: C++ requires
invalid;
// FIXME: clang-check doesn't like gcc driver on cygming.
// XFAIL: cygwin,mingw32,win32