//===--- SubstitutionMap.h - Swift Substitution Map ASTs --------*- C++ -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 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 // //===----------------------------------------------------------------------===// // // This file defines the SubstitutionMap class. // // This is a data structure type describing the mapping of abstract types to // replacement types, together with associated conformances to use for deriving // nested types. // // Depending on how the SubstitutionMap is constructed, the abstract types are // either archetypes or interface types. Care must be exercised to only look up // one or the other. // //===----------------------------------------------------------------------===// #ifndef SWIFT_AST_SUBSTITUTION_MAP_H #define SWIFT_AST_SUBSTITUTION_MAP_H #include "swift/AST/ProtocolConformanceRef.h" #include "swift/AST/Type.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/SmallVector.h" namespace swift { class SubstitutableType; class SubstitutionMap { using ParentType = std::pair; llvm::DenseMap subMap; llvm::DenseMap> conformanceMap; llvm::DenseMap> parentMap; Optional lookupConformance(ProtocolDecl *proto, ArrayRef conformances) const; template Optional forEachParent(CanType type, Fn fn) const; public: Optional lookupConformance(CanType type, ProtocolDecl *proto) const; const llvm::DenseMap &getMap() const { return subMap; } /// Retrieve the conformances for the given type. ArrayRef getConformances(CanType type) const; void addSubstitution(CanType type, Type replacement); void addConformances(CanType type, ArrayRef conformances); void addParent(CanType type, CanType parent, AssociatedTypeDecl *assocType); }; } // end namespace swift #endif