//===-- Core/SyntaxCheck.cpp ----------------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief This file exposes functionaliy for doing a syntax-only check on
/// files with overridden contents.
///
//===----------------------------------------------------------------------===//

#include "Core/SyntaxCheck.h"
#include "Core/FileOverrides.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/Tooling.h"

using namespace clang;
using namespace tooling;

class SyntaxCheck : public SyntaxOnlyAction {
public:
  SyntaxCheck(const FileOverrides &Overrides) : Overrides(Overrides) {}

  virtual bool BeginSourceFileAction(CompilerInstance &CI, StringRef Filename) {
    if (!SyntaxOnlyAction::BeginSourceFileAction(CI, Filename))
      return false;

    Overrides.applyOverrides(CI.getSourceManager());

    return true;
  }

private:
  const FileOverrides &Overrides;
};

class SyntaxCheckFactory : public FrontendActionFactory {
public:
  SyntaxCheckFactory(const FileOverrides &Overrides)
      : Overrides(Overrides) {}

  virtual FrontendAction *create() { return new SyntaxCheck(Overrides); }

private:
  const FileOverrides &Overrides;
};

class SyntaxArgumentsAdjuster : public ArgumentsAdjuster {
  CommandLineArguments Adjust(const CommandLineArguments &Args) {
    CommandLineArguments AdjustedArgs = Args;
    AdjustedArgs.push_back("-fsyntax-only");
    AdjustedArgs.push_back("-std=c++11");
    return AdjustedArgs;
  }
};

bool doSyntaxCheck(const CompilationDatabase &Database,
                   const std::vector<std::string> &SourcePaths,
                   const FileOverrides &Overrides) {
  ClangTool SyntaxTool(Database, SourcePaths);

  // Ensure C++11 support is enabled.
  // FIXME: This isn't necessary anymore since the Migrator requires C++11
  // to be enabled in the CompilationDatabase. Remove later.
  SyntaxTool.setArgumentsAdjuster(new SyntaxArgumentsAdjuster);

  return SyntaxTool.run(new SyntaxCheckFactory(Overrides)) == 0;
}
