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 24 namespace clang { 25 namespace tooling { 26 namespace fixit { 27 28 namespace internal { 29 StringRef getText(CharSourceRange Range, const ASTContext &Context); 30 31 /// Returns the token CharSourceRange corresponding to \p Range. 32 inline CharSourceRange getSourceRange(const SourceRange &Range) { 33 return CharSourceRange::getTokenRange(Range); 34 } 35 36 /// Returns the CharSourceRange of the token at Location \p Loc. 37 inline 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'. 43 template <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. 49 template <typename T> 50 StringRef 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, ...). 56 template <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. 61 template <typename D, typename S> 62 FixItHint 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. 69 template <typename D> 70 FixItHint 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_FIXIT_H 80