//===--- SearchPathOptions.h ------------------------------------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 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_AST_SEARCHPATHOPTIONS_H #define SWIFT_AST_SEARCHPATHOPTIONS_H #include "llvm/ADT/Hashing.h" #include #include namespace swift { /// Options for controlling search path behavior. class SearchPathOptions { public: /// Path to the SDK which is being built against. std::string SDKPath; /// Path(s) which should be searched for modules. /// /// Do not add values to this directly. Instead, use /// \c ASTContext::addSearchPath. std::vector ImportSearchPaths; /// Path(s) to virtual filesystem overlay YAML files. std::vector VFSOverlayFiles; struct FrameworkSearchPath { std::string Path; bool IsSystem = false; FrameworkSearchPath(StringRef path, bool isSystem) : Path(path), IsSystem(isSystem) {} friend bool operator ==(const FrameworkSearchPath &LHS, const FrameworkSearchPath &RHS) { return LHS.Path == RHS.Path && LHS.IsSystem == RHS.IsSystem; } friend bool operator !=(const FrameworkSearchPath &LHS, const FrameworkSearchPath &RHS) { return !(LHS == RHS); } }; /// Path(s) which should be searched for frameworks. /// /// Do not add values to this directly. Instead, use /// \c ASTContext::addSearchPath. std::vector FrameworkSearchPaths; /// Path(s) which should be searched for libraries. /// /// This is used in immediate modes. It is safe to add paths to this directly. std::vector LibrarySearchPaths; /// Path to search for compiler-relative header files. std::string RuntimeResourcePath; /// Path to search for compiler-relative stdlib dylibs. std::string RuntimeLibraryPath; /// Paths to search for stdlib modules. One of these will be compiler-relative. std::vector RuntimeLibraryImportPaths; /// Don't look in for compiler-provided modules. bool SkipRuntimeLibraryImportPaths = false; /// Return a hash code of any components from these options that should /// contribute to a Swift Bridging PCH hash. llvm::hash_code getPCHHashComponents() const { using llvm::hash_value; using llvm::hash_combine; auto Code = hash_value(SDKPath); for (auto Import : ImportSearchPaths) { Code = hash_combine(Code, Import); } for (auto VFSFile : VFSOverlayFiles) { Code = hash_combine(Code, VFSFile); } for (const auto &FrameworkPath : FrameworkSearchPaths) { Code = hash_combine(Code, FrameworkPath.Path); } for (auto LibraryPath : LibrarySearchPaths) { Code = hash_combine(Code, LibraryPath); } Code = hash_combine(Code, RuntimeResourcePath); for (auto RuntimeLibraryImportPath : RuntimeLibraryImportPaths) { Code = hash_combine(Code, RuntimeLibraryImportPath); } return Code; } }; } #endif