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