xref: /openbsd-src/gnu/llvm/clang/lib/Tooling/Refactoring/ASTSelectionRequirements.cpp (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick //===--- ASTSelectionRequirements.cpp - Clang refactoring library ---------===//
2e5dd7070Spatrick //
3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick //
7e5dd7070Spatrick //===----------------------------------------------------------------------===//
8e5dd7070Spatrick 
9e5dd7070Spatrick #include "clang/Tooling/Refactoring/RefactoringActionRuleRequirements.h"
10e5dd7070Spatrick #include "clang/AST/Attr.h"
11*12c85518Srobert #include <optional>
12e5dd7070Spatrick 
13e5dd7070Spatrick using namespace clang;
14e5dd7070Spatrick using namespace tooling;
15e5dd7070Spatrick 
16e5dd7070Spatrick Expected<SelectedASTNode>
evaluate(RefactoringRuleContext & Context) const17e5dd7070Spatrick ASTSelectionRequirement::evaluate(RefactoringRuleContext &Context) const {
18e5dd7070Spatrick   // FIXME: Memoize so that selection is evaluated only once.
19e5dd7070Spatrick   Expected<SourceRange> Range =
20e5dd7070Spatrick       SourceRangeSelectionRequirement::evaluate(Context);
21e5dd7070Spatrick   if (!Range)
22e5dd7070Spatrick     return Range.takeError();
23e5dd7070Spatrick 
24*12c85518Srobert   std::optional<SelectedASTNode> Selection =
25e5dd7070Spatrick       findSelectedASTNodes(Context.getASTContext(), *Range);
26e5dd7070Spatrick   if (!Selection)
27e5dd7070Spatrick     return Context.createDiagnosticError(
28e5dd7070Spatrick         Range->getBegin(), diag::err_refactor_selection_invalid_ast);
29e5dd7070Spatrick   return std::move(*Selection);
30e5dd7070Spatrick }
31e5dd7070Spatrick 
evaluate(RefactoringRuleContext & Context) const32e5dd7070Spatrick Expected<CodeRangeASTSelection> CodeRangeASTSelectionRequirement::evaluate(
33e5dd7070Spatrick     RefactoringRuleContext &Context) const {
34e5dd7070Spatrick   // FIXME: Memoize so that selection is evaluated only once.
35e5dd7070Spatrick   Expected<SelectedASTNode> ASTSelection =
36e5dd7070Spatrick       ASTSelectionRequirement::evaluate(Context);
37e5dd7070Spatrick   if (!ASTSelection)
38e5dd7070Spatrick     return ASTSelection.takeError();
39e5dd7070Spatrick   std::unique_ptr<SelectedASTNode> StoredSelection =
40e5dd7070Spatrick       std::make_unique<SelectedASTNode>(std::move(*ASTSelection));
41*12c85518Srobert   std::optional<CodeRangeASTSelection> CodeRange =
42*12c85518Srobert       CodeRangeASTSelection::create(Context.getSelectionRange(),
43*12c85518Srobert                                     *StoredSelection);
44e5dd7070Spatrick   if (!CodeRange)
45e5dd7070Spatrick     return Context.createDiagnosticError(
46e5dd7070Spatrick         Context.getSelectionRange().getBegin(),
47e5dd7070Spatrick         diag::err_refactor_selection_invalid_ast);
48e5dd7070Spatrick   Context.setASTSelection(std::move(StoredSelection));
49e5dd7070Spatrick   return std::move(*CodeRange);
50e5dd7070Spatrick }
51