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) const17e5dd7070SpatrickASTSelectionRequirement::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) const32e5dd7070SpatrickExpected<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