blob: 4aed8ab37e76a434c9b841fcb6b5ebc9cd01870b [file] [log] [blame]
//===--- RefactoringReplacement.h - ------------------------*- C++ -*------===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_REPLACEMENT_H
#define LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_REPLACEMENT_H
#include "clang/Basic/Diagnostic.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Tooling/Refactor/SymbolName.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringSet.h"
#include <string>
namespace clang {
namespace tooling {
/// \brief Represent a symbol that can be used for an additional refactoring
/// action that associated.
class RefactoringResultAssociatedSymbol {
SymbolName Name;
public:
RefactoringResultAssociatedSymbol(SymbolName Name) : Name(std::move(Name)) {}
const SymbolName &getName() const { return Name; }
};
/// \brief A replacement range.
class RefactoringReplacement {
public:
SourceRange Range;
std::string ReplacementString;
/// \brief Represents a symbol that is contained in the replacement string
/// of this replacement.
struct AssociatedSymbolLocation {
/// These offsets point into the ReplacementString.
llvm::SmallVector<unsigned, 4> Offsets;
bool IsDeclaration;
AssociatedSymbolLocation(ArrayRef<unsigned> Offsets,
bool IsDeclaration = false)
: Offsets(Offsets.begin(), Offsets.end()),
IsDeclaration(IsDeclaration) {}
};
llvm::SmallDenseMap<const RefactoringResultAssociatedSymbol *,
AssociatedSymbolLocation>
SymbolLocations;
RefactoringReplacement(SourceRange Range) : Range(Range) {}
RefactoringReplacement(SourceRange Range, StringRef ReplacementString)
: Range(Range), ReplacementString(ReplacementString.str()) {}
RefactoringReplacement(SourceRange Range, std::string ReplacementString)
: Range(Range), ReplacementString(std::move(ReplacementString)) {}
RefactoringReplacement(SourceRange Range, StringRef ReplacementString,
const RefactoringResultAssociatedSymbol *Symbol,
const AssociatedSymbolLocation &Loc)
: Range(Range), ReplacementString(ReplacementString.str()) {
SymbolLocations.insert(std::make_pair(Symbol, Loc));
}
RefactoringReplacement(const FixItHint &Hint) {
Range = Hint.RemoveRange.getAsRange();
ReplacementString = Hint.CodeToInsert;
}
RefactoringReplacement(RefactoringReplacement &&) = default;
RefactoringReplacement &operator=(RefactoringReplacement &&) = default;
};
} // end namespace tooling
} // end namespace clang
#endif // LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_REPLACEMENT_H