50 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/Tooling/Refactoring/RefactoringActionRuleRequirements.h"10#include <optional>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 std::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 std::optional<CodeRangeASTSelection> CodeRange =41 CodeRangeASTSelection::create(Context.getSelectionRange(),42 *StoredSelection);43 if (!CodeRange)44 return Context.createDiagnosticError(45 Context.getSelectionRange().getBegin(),46 diag::err_refactor_selection_invalid_ast);47 Context.setASTSelection(std::move(StoredSelection));48 return std::move(*CodeRange);49}50