Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.