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