forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			76 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===-- 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;
 | |
| 
 | |
|     FileOverrides::const_iterator I = Overrides.find(Filename);
 | |
|     if (I != Overrides.end())
 | |
|       I->second->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;
 | |
| }
 |