2019-05-07 15:11:56 +08:00
|
|
|
//===--- Rename.h - Symbol-rename refactorings -------------------*- C++-*-===//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2019-06-11 16:50:35 +08:00
|
|
|
#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_REFACTOR_RENAME_H
|
|
|
|
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_REFACTOR_RENAME_H
|
|
|
|
|
2019-10-23 20:40:20 +08:00
|
|
|
#include "Path.h"
|
2019-09-03 23:34:47 +08:00
|
|
|
#include "Protocol.h"
|
2019-10-23 20:40:20 +08:00
|
|
|
#include "SourceCode.h"
|
2019-12-10 00:00:51 +08:00
|
|
|
#include "clang/Basic/LangOptions.h"
|
2019-05-07 15:11:56 +08:00
|
|
|
#include "clang/Tooling/Core/Replacement.h"
|
|
|
|
#include "llvm/Support/Error.h"
|
|
|
|
|
|
|
|
namespace clang {
|
|
|
|
namespace clangd {
|
2019-09-03 23:34:47 +08:00
|
|
|
class ParsedAST;
|
|
|
|
class SymbolIndex;
|
2019-05-07 15:11:56 +08:00
|
|
|
|
2019-10-23 20:40:20 +08:00
|
|
|
/// Gets dirty buffer for a given file \p AbsPath.
|
|
|
|
/// Returns None if there is no dirty buffer for the given file.
|
|
|
|
using DirtyBufferGetter =
|
|
|
|
llvm::function_ref<llvm::Optional<std::string>(PathRef AbsPath)>;
|
|
|
|
|
|
|
|
struct RenameInputs {
|
|
|
|
Position Pos; // the position triggering the rename
|
|
|
|
llvm::StringRef NewName;
|
|
|
|
|
|
|
|
ParsedAST &AST;
|
|
|
|
llvm::StringRef MainFilePath;
|
|
|
|
|
|
|
|
const SymbolIndex *Index = nullptr;
|
|
|
|
|
|
|
|
bool AllowCrossFile = false;
|
|
|
|
// When set, used by the rename to get file content for all rename-related
|
|
|
|
// files.
|
|
|
|
// If there is no corresponding dirty buffer, we will use the file content
|
|
|
|
// from disk.
|
|
|
|
DirtyBufferGetter GetDirtyBuffer = nullptr;
|
|
|
|
};
|
|
|
|
|
|
|
|
/// Renames all occurrences of the symbol.
|
|
|
|
/// If AllowCrossFile is false, returns an error if rename a symbol that's used
|
|
|
|
/// in another file (per the index).
|
|
|
|
llvm::Expected<FileEdits> rename(const RenameInputs &RInputs);
|
2019-05-07 15:11:56 +08:00
|
|
|
|
2019-11-19 22:23:36 +08:00
|
|
|
/// Generates rename edits that replaces all given occurrences with the
|
|
|
|
/// NewName.
|
|
|
|
/// Exposed for testing only.
|
[clangd] Deduplicate refs from index for cross-file rename.
Summary:
If the index returns duplicated refs, it will trigger the assertion in
BuildRenameEdit (we expect the processing position is always larger the
the previous one, but it is not true if we have duplication), and also
breaks our heuristics.
This patch make the code robost enough to handle duplications, also
save some cost of redundnat llvm::sort.
Though clangd's index doesn't return duplications, our internal index
kythe will.
Reviewers: ilya-biryukov
Subscribers: MaskRay, jkorous, mgrang, arphaman, kadircet, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71300
2019-12-11 05:15:29 +08:00
|
|
|
/// REQUIRED: Occurrences is sorted and doesn't have duplicated ranges.
|
2019-11-28 23:48:49 +08:00
|
|
|
llvm::Expected<Edit> buildRenameEdit(llvm::StringRef AbsFilePath,
|
|
|
|
llvm::StringRef InitialCode,
|
2019-11-19 22:23:36 +08:00
|
|
|
std::vector<Range> Occurrences,
|
|
|
|
llvm::StringRef NewName);
|
|
|
|
|
2019-12-10 00:00:51 +08:00
|
|
|
/// Adjusts indexed occurrences to match the current state of the file.
|
|
|
|
///
|
|
|
|
/// The Index is not always up to date. Blindly editing at the locations
|
|
|
|
/// reported by the index may mangle the code in such cases.
|
|
|
|
/// This function determines whether the indexed occurrences can be applied to
|
|
|
|
/// this file, and heuristically repairs the occurrences if necessary.
|
|
|
|
///
|
|
|
|
/// The API assumes that Indexed contains only named occurrences (each
|
|
|
|
/// occurrence has the same length).
|
[clangd] Deduplicate refs from index for cross-file rename.
Summary:
If the index returns duplicated refs, it will trigger the assertion in
BuildRenameEdit (we expect the processing position is always larger the
the previous one, but it is not true if we have duplication), and also
breaks our heuristics.
This patch make the code robost enough to handle duplications, also
save some cost of redundnat llvm::sort.
Though clangd's index doesn't return duplications, our internal index
kythe will.
Reviewers: ilya-biryukov
Subscribers: MaskRay, jkorous, mgrang, arphaman, kadircet, usaxena95, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D71300
2019-12-11 05:15:29 +08:00
|
|
|
/// REQUIRED: Indexed is sorted.
|
2019-12-10 00:00:51 +08:00
|
|
|
llvm::Optional<std::vector<Range>>
|
|
|
|
adjustRenameRanges(llvm::StringRef DraftCode, llvm::StringRef Identifier,
|
|
|
|
std::vector<Range> Indexed, const LangOptions &LangOpts);
|
|
|
|
|
|
|
|
/// Calculates the lexed occurrences that the given indexed occurrences map to.
|
|
|
|
/// Returns None if we don't find a mapping.
|
|
|
|
///
|
|
|
|
/// Exposed for testing only.
|
|
|
|
///
|
|
|
|
/// REQUIRED: Indexed and Lexed are sorted.
|
|
|
|
llvm::Optional<std::vector<Range>> getMappedRanges(ArrayRef<Range> Indexed,
|
|
|
|
ArrayRef<Range> Lexed);
|
|
|
|
/// Evaluates how good the mapped result is. 0 indicates a perfect match.
|
|
|
|
///
|
|
|
|
/// Exposed for testing only.
|
|
|
|
///
|
|
|
|
/// REQUIRED: Indexed and Lexed are sorted, Indexed and MappedIndex have the
|
|
|
|
/// same size.
|
|
|
|
size_t renameRangeAdjustmentCost(ArrayRef<Range> Indexed, ArrayRef<Range> Lexed,
|
|
|
|
ArrayRef<size_t> MappedIndex);
|
|
|
|
|
2019-05-07 15:11:56 +08:00
|
|
|
} // namespace clangd
|
|
|
|
} // namespace clang
|
2019-06-11 16:50:35 +08:00
|
|
|
|
|
|
|
#endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_REFACTOR_RENAME_H
|