Index: include/clang/Tooling/Fixit.h =================================================================== --- /dev/null +++ include/clang/Tooling/Fixit.h @@ -0,0 +1,71 @@ +//===--- Fixit.h - Fixit Hint utilities -------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements functions to ease source rewriting from AST-nodes. +// +// Example swapping A and B expressions: +// +// Expr *A, *B; +// tooling::fixit::createReplacement(*A, *B); +// tooling::fixit::createReplacement(*B, *A); +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLING_FIXIT_H +#define LLVM_CLANG_TOOLING_FIXIT_H + +#include "clang/AST/ASTContext.h" + +namespace clang { +namespace tooling { +namespace fixit { + +namespace internal { +StringRef getText(SourceRange Range, const ASTContext &Context); +} // end namespace internal + +/// \brief Returns the SourceRange of a SourceRange. This identity function is +/// used by the following template abstractions. +inline SourceRange getSourceRange(const SourceRange &Range) { return Range; } + +/// \brief Returns the SourceRange of the token at Location \p Loc. +inline SourceRange getSourceRange(const SourceLocation &Loc) { + return SourceRange(Loc); +} + +/// \brief Returns the SourceRange of an given Node. \p Node is typically a +/// 'Stmt', 'Expr' or a 'Decl'. +template SourceRange getSourceRange(const T &Node) { + return Node.getSourceRange(); +} + +// \brief Returns a textual representation of \p Node. +template +StringRef getText(const T &Node, const ASTContext &Context) { + return getText(getSourceRange(Node), Context); +} + +// \brief Returns a FixItHint to remove \p Node. +template FixItHint createRemoval(const T &Node) { + return FixItHint::CreateRemoval(getSourceRange(Node)); +} + +// \brief Returns a FixItHint to replace \p Destination by \p Source. +template +FixItHint createReplacement(const D &Destination, const S &Source, + const ASTContext &Context) { + return FixItHint::CreateReplacement(getSourceRange(Destination), + getText(Source, Context)); +} + +} // end namespace fixit +} // end namespace tooling +} // end namespace clang + +#endif // LLVM_CLANG_TOOLING_FIXINT_H Index: lib/Tooling/CMakeLists.txt =================================================================== --- lib/Tooling/CMakeLists.txt +++ lib/Tooling/CMakeLists.txt @@ -7,6 +7,7 @@ CommonOptionsParser.cpp CompilationDatabase.cpp FileMatchTrie.cpp + Fixit.cpp JSONCompilationDatabase.cpp Refactoring.cpp RefactoringCallbacks.cpp Index: lib/Tooling/Fixit.cpp =================================================================== --- /dev/null +++ lib/Tooling/Fixit.cpp @@ -0,0 +1,29 @@ +//===--- RefactoringCallbacks.cpp - Structural query framework ------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// +//===----------------------------------------------------------------------===// +#include "clang/Tooling/Fixit.h" +#include "clang/Lex/Lexer.h" + +namespace clang { +namespace tooling { +namespace fixit { + +namespace internal { +StringRef getText(SourceRange Range, const ASTContext &Context) { + return Lexer::getSourceText(CharSourceRange::getTokenRange(Range), + Context.getSourceManager(), + Context.getLangOpts()); +} +} // end namespace internal + +} // end namespace fixit +} // end namespace tooling +} // end namespace clang