//===----------------------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #ifndef SWIFT_REFACTORING_EXTRACTEXPRBASE_H #define SWIFT_REFACTORING_EXTRACTEXPRBASE_H #include "swift/AST/ASTContext.h" #include "swift/AST/SourceFile.h" #include "swift/IDE/IDERequests.h" namespace swift { namespace refactoring { using namespace swift::ide; enum class CannotExtractReason { Literal, VoidType, }; class ExtractCheckResult { bool KnownFailure; SmallVector AllReasons; public: ExtractCheckResult() : KnownFailure(true) {} ExtractCheckResult(ArrayRef AllReasons) : KnownFailure(false), AllReasons(AllReasons.begin(), AllReasons.end()) {} bool success() { return success({}); } bool success(ArrayRef ExpectedReasons) { if (KnownFailure) return false; bool Result = true; // Check if any reasons aren't covered by the list of expected reasons // provided by the client. for (auto R : AllReasons) { Result &= llvm::is_contained(ExpectedReasons, R); } return Result; } }; /// Check whether a given range can be extracted. /// Return true on successful condition checking,. /// Return false on failed conditions. ExtractCheckResult checkExtractConditions(const ResolvedRangeInfo &RangeInfo, DiagnosticEngine &DiagEngine); class RefactoringActionExtractExprBase { SourceFile *TheFile; ResolvedRangeInfo RangeInfo; DiagnosticEngine &DiagEngine; const bool ExtractRepeated; StringRef PreferredName; SourceEditConsumer &EditConsumer; ASTContext &Ctx; SourceManager &SM; public: RefactoringActionExtractExprBase(SourceFile *TheFile, ResolvedRangeInfo RangeInfo, DiagnosticEngine &DiagEngine, bool ExtractRepeated, StringRef PreferredName, SourceEditConsumer &EditConsumer) : TheFile(TheFile), RangeInfo(RangeInfo), DiagEngine(DiagEngine), ExtractRepeated(ExtractRepeated), PreferredName(PreferredName), EditConsumer(EditConsumer), Ctx(TheFile->getASTContext()), SM(Ctx.SourceMgr) {} bool performChange(); }; } // namespace refactoring } // namespace swift #endif