1//===--- FixIt.h - FixIt Hint utilities -------------------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This file implements functions to ease source rewriting from AST-nodes. 10// 11// Example swapping A and B expressions: 12// 13// Expr *A, *B; 14// tooling::fixit::createReplacement(*A, *B); 15// tooling::fixit::createReplacement(*B, *A); 16// 17//===----------------------------------------------------------------------===// 18 19#ifndef LLVM_CLANG_TOOLING_FIXIT_H 20#define LLVM_CLANG_TOOLING_FIXIT_H 21 22#include "clang/AST/ASTContext.h" 23 24namespace clang { 25namespace tooling { 26namespace fixit { 27 28namespace internal { 29StringRef getText(CharSourceRange Range, const ASTContext &Context); 30 31/// Returns the token CharSourceRange corresponding to \p Range. 32inline CharSourceRange getSourceRange(const SourceRange &Range) { 33 return CharSourceRange::getTokenRange(Range); 34} 35 36/// Returns the CharSourceRange of the token at Location \p Loc. 37inline CharSourceRange getSourceRange(const SourceLocation &Loc) { 38 return CharSourceRange::getTokenRange(Loc, Loc); 39} 40 41/// Returns the CharSourceRange of an given Node. \p Node is typically a 42/// 'Stmt', 'Expr' or a 'Decl'. 43template <typename T> CharSourceRange getSourceRange(const T &Node) { 44 return CharSourceRange::getTokenRange(Node.getSourceRange()); 45} 46} // end namespace internal 47 48/// 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// 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// 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// 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