You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
81 lines
2.9 KiB
81 lines
2.9 KiB
//===--- 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
|
|
|