xref: /freebsd/contrib/llvm-project/clang/lib/Tooling/Refactoring/ASTSelectionRequirements.cpp (revision e64bea71c21eb42e97aa615188ba91f6cce0d36d)
1 //===--- ASTSelectionRequirements.cpp - Clang refactoring library ---------===//
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 #include "clang/Tooling/Refactoring/RefactoringActionRuleRequirements.h"
10 #include <optional>
11 
12 using namespace clang;
13 using namespace tooling;
14 
15 Expected<SelectedASTNode>
16 ASTSelectionRequirement::evaluate(RefactoringRuleContext &Context) const {
17   // FIXME: Memoize so that selection is evaluated only once.
18   Expected<SourceRange> Range =
19       SourceRangeSelectionRequirement::evaluate(Context);
20   if (!Range)
21     return Range.takeError();
22 
23   std::optional<SelectedASTNode> Selection =
24       findSelectedASTNodes(Context.getASTContext(), *Range);
25   if (!Selection)
26     return Context.createDiagnosticError(
27         Range->getBegin(), diag::err_refactor_selection_invalid_ast);
28   return std::move(*Selection);
29 }
30 
31 Expected<CodeRangeASTSelection> CodeRangeASTSelectionRequirement::evaluate(
32     RefactoringRuleContext &Context) const {
33   // FIXME: Memoize so that selection is evaluated only once.
34   Expected<SelectedASTNode> ASTSelection =
35       ASTSelectionRequirement::evaluate(Context);
36   if (!ASTSelection)
37     return ASTSelection.takeError();
38   std::unique_ptr<SelectedASTNode> StoredSelection =
39       std::make_unique<SelectedASTNode>(std::move(*ASTSelection));
40   std::optional<CodeRangeASTSelection> CodeRange =
41       CodeRangeASTSelection::create(Context.getSelectionRange(),
42                                     *StoredSelection);
43   if (!CodeRange)
44     return Context.createDiagnosticError(
45         Context.getSelectionRange().getBegin(),
46         diag::err_refactor_selection_invalid_ast);
47   Context.setASTSelection(std::move(StoredSelection));
48   return std::move(*CodeRange);
49 }
50