1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
//===--- RefactoringActionFinder.cpp - Clang refactoring library ----------===//
//
// 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
//
//===----------------------------------------------------------------------===//
///
/// \file
/// \brief Implements methods that find the refactoring actions that can be
/// performed at specific locations / source ranges in a translation unit.
///
//===----------------------------------------------------------------------===//
#include "clang/Tooling/Refactor/RefactoringActionFinder.h"
#include "clang/Tooling/Refactor/RefactoringOperation.h"
#include "clang/Tooling/Refactor/USRFinder.h"
namespace clang {
namespace tooling {
RefactoringActionSet findActionSetAt(SourceLocation Location,
SourceRange SelectionRange,
ASTContext &Context) {
RefactoringActionSet Result;
if (const auto *ND = rename::getNamedDeclAt(Context, Location))
Result.Actions.push_back(isLocalSymbol(ND, Context.getLangOpts())
? RefactoringActionType::Rename_Local
: RefactoringActionType::Rename);
// FIXME: We can avoid checking if some actions can be initiated when they're
// not allowed in the current language mode.
RefactoringActionType Actions[] = {
#define REFACTORING_OPERATION_ACTION(Name, Spelling, Command) \
RefactoringActionType::Name,
#include "clang/Tooling/Refactor/RefactoringActions.def"
};
for (auto Action : Actions) {
auto Op = initiateRefactoringOperationAt(Location, SelectionRange, Context,
Action,
/*CreateOperation=*/true);
if (Op.Initiated) {
Result.Actions.push_back(Action);
if (Op.RefactoringOp) {
for (const auto &SubAction : Op.RefactoringOp->getAvailableSubActions())
Result.Actions.push_back(SubAction);
}
}
}
return Result;
}
} // end namespace tooling
} // end namespace clang
|