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 
12 using namespace clang;
13 using namespace tooling;
14 
15 Expected<SelectedASTNode>
evaluate(RefactoringRuleContext & Context) const16 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   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 
evaluate(RefactoringRuleContext & Context) const31 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   Optional<CodeRangeASTSelection> CodeRange = CodeRangeASTSelection::create(
41       Context.getSelectionRange(), *StoredSelection);
42   if (!CodeRange)
43     return Context.createDiagnosticError(
44         Context.getSelectionRange().getBegin(),
45         diag::err_refactor_selection_invalid_ast);
46   Context.setASTSelection(std::move(StoredSelection));
47   return std::move(*CodeRange);
48 }
49