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