forked from OSchip/llvm-project
				
			
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C++
		
	
	
	
| //===--- RefactoringCallbacks.cpp - Structural query framework ------------===//
 | |
| //
 | |
| //                     The LLVM Compiler Infrastructure
 | |
| //
 | |
| // This file is distributed under the University of Illinois Open Source
 | |
| // License. See LICENSE.TXT for details.
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| //
 | |
| //
 | |
| //===----------------------------------------------------------------------===//
 | |
| #include "clang/Lex/Lexer.h"
 | |
| #include "clang/Tooling/RefactoringCallbacks.h"
 | |
| 
 | |
| namespace clang {
 | |
| namespace tooling {
 | |
| 
 | |
| RefactoringCallback::RefactoringCallback() {}
 | |
| tooling::Replacements &RefactoringCallback::getReplacements() {
 | |
|   return Replace;
 | |
| }
 | |
| 
 | |
| static Replacement replaceStmtWithText(SourceManager &Sources,
 | |
|                                        const Stmt &From,
 | |
|                                        StringRef Text) {
 | |
|   return tooling::Replacement(Sources, CharSourceRange::getTokenRange(
 | |
|       From.getSourceRange()), Text);
 | |
| }
 | |
| static Replacement replaceStmtWithStmt(SourceManager &Sources,
 | |
|                                        const Stmt &From,
 | |
|                                        const Stmt &To) {
 | |
|   return replaceStmtWithText(Sources, From, Lexer::getSourceText(
 | |
|       CharSourceRange::getTokenRange(To.getSourceRange()),
 | |
|       Sources, LangOptions()));
 | |
| }
 | |
| 
 | |
| ReplaceStmtWithText::ReplaceStmtWithText(StringRef FromId, StringRef ToText)
 | |
|     : FromId(FromId), ToText(ToText) {}
 | |
| 
 | |
| void ReplaceStmtWithText::run(
 | |
|     const ast_matchers::MatchFinder::MatchResult &Result) {
 | |
|   if (const Stmt *FromMatch = Result.Nodes.getStmtAs<Stmt>(FromId)) {
 | |
|     Replace.insert(tooling::Replacement(
 | |
|         *Result.SourceManager,
 | |
|         CharSourceRange::getTokenRange(FromMatch->getSourceRange()),
 | |
|         ToText));
 | |
|   }
 | |
| }
 | |
| 
 | |
| ReplaceStmtWithStmt::ReplaceStmtWithStmt(StringRef FromId, StringRef ToId)
 | |
|     : FromId(FromId), ToId(ToId) {}
 | |
| 
 | |
| void ReplaceStmtWithStmt::run(
 | |
|     const ast_matchers::MatchFinder::MatchResult &Result) {
 | |
|   const Stmt *FromMatch = Result.Nodes.getStmtAs<Stmt>(FromId);
 | |
|   const Stmt *ToMatch = Result.Nodes.getStmtAs<Stmt>(ToId);
 | |
|   if (FromMatch && ToMatch)
 | |
|     Replace.insert(replaceStmtWithStmt(
 | |
|         *Result.SourceManager, *FromMatch, *ToMatch));
 | |
| }
 | |
| 
 | |
| ReplaceIfStmtWithItsBody::ReplaceIfStmtWithItsBody(StringRef Id,
 | |
|                                                    bool PickTrueBranch)
 | |
|     : Id(Id), PickTrueBranch(PickTrueBranch) {}
 | |
| 
 | |
| void ReplaceIfStmtWithItsBody::run(
 | |
|     const ast_matchers::MatchFinder::MatchResult &Result) {
 | |
|   if (const IfStmt *Node = Result.Nodes.getStmtAs<IfStmt>(Id)) {
 | |
|     const Stmt *Body = PickTrueBranch ? Node->getThen() : Node->getElse();
 | |
|     if (Body) {
 | |
|       Replace.insert(replaceStmtWithStmt(*Result.SourceManager, *Node, *Body));
 | |
|     } else if (!PickTrueBranch) {
 | |
|       // If we want to use the 'else'-branch, but it doesn't exist, delete
 | |
|       // the whole 'if'.
 | |
|       Replace.insert(replaceStmtWithText(*Result.SourceManager, *Node, ""));
 | |
|     }
 | |
|   }
 | |
| }
 | |
| 
 | |
| } // end namespace tooling
 | |
| } // end namespace clang
 |