1//===--- FixIt.h - FixIt Hint utilities -------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file implements functions to ease source rewriting from AST-nodes. 11// 12// Example swapping A and B expressions: 13// 14// Expr *A, *B; 15// tooling::fixit::createReplacement(*A, *B); 16// tooling::fixit::createReplacement(*B, *A); 17// 18//===----------------------------------------------------------------------===// 19 20#ifndef LLVM_CLANG_TOOLING_FIXIT_H 21#define LLVM_CLANG_TOOLING_FIXIT_H 22 23#include "clang/AST/ASTContext.h" 24 25namespace clang { 26namespace tooling { 27namespace fixit { 28 29namespace internal { 30StringRef getText(SourceRange Range, const ASTContext &Context); 31 32/// \brief Returns the SourceRange of a SourceRange. This identity function is 33/// used by the following template abstractions. 34inline SourceRange getSourceRange(const SourceRange &Range) { return Range; } 35 36/// \brief Returns the SourceRange of the token at Location \p Loc. 37inline SourceRange getSourceRange(const SourceLocation &Loc) { 38 return SourceRange(Loc); 39} 40 41/// \brief Returns the SourceRange of an given Node. \p Node is typically a 42/// 'Stmt', 'Expr' or a 'Decl'. 43template <typename T> SourceRange getSourceRange(const T &Node) { 44 return Node.getSourceRange(); 45} 46} // end namespace internal 47 48// \brief Returns a textual representation of \p Node. 49template <typename T> 50StringRef getText(const T &Node, const ASTContext &Context) { 51 return internal::getText(internal::getSourceRange(Node), Context); 52} 53 54// \brief Returns a FixItHint to remove \p Node. 55// TODO: Add support for related syntactical elements (i.e. comments, ...). 56template <typename T> FixItHint createRemoval(const T &Node) { 57 return FixItHint::CreateRemoval(internal::getSourceRange(Node)); 58} 59 60// \brief Returns a FixItHint to replace \p Destination by \p Source. 61template <typename D, typename S> 62FixItHint createReplacement(const D &Destination, const S &Source, 63 const ASTContext &Context) { 64 return FixItHint::CreateReplacement(internal::getSourceRange(Destination), 65 getText(Source, Context)); 66} 67 68// \brief Returns a FixItHint to replace \p Destination by \p Source. 69template <typename D> 70FixItHint createReplacement(const D &Destination, StringRef Source) { 71 return FixItHint::CreateReplacement(internal::getSourceRange(Destination), 72 Source); 73} 74 75} // end namespace fixit 76} // end namespace tooling 77} // end namespace clang 78 79#endif // LLVM_CLANG_TOOLING_FIXINT_H 80