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
12using namespace clang;
13using namespace tooling;
14
15Expected<SelectedASTNode>
16ASTSelectionRequirement::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
31Expected<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