//===--- Substitution.h - Swift Generic Substitution ASTs -------*- 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 // //===----------------------------------------------------------------------===// // // This file defines the Substitution class. // //===----------------------------------------------------------------------===// #ifndef SWIFT_AST_SUBSTITUTION_H #define SWIFT_AST_SUBSTITUTION_H #include "swift/AST/Type.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/Optional.h" namespace llvm { class raw_ostream; } namespace swift { class GenericEnvironment; class SubstitutionMap; /// Substitution - A substitution into a generic specialization. class Substitution { Type Replacement; ArrayRef Conformance; public: /// The replacement type. Type getReplacement() const { return Replacement; } /// The protocol conformances for the replacement. These appear in the same /// order as Archetype->getConformsTo() for the substituted archetype. const ArrayRef getConformances() const { return Conformance; } Substitution() {} Substitution(Type Replacement, ArrayRef Conformance); /// Checks whether the current substitution is canonical. bool isCanonical() const; /// Get the canonicalized substitution. If wasCanonical is not nullptr, /// store there whether the current substitution was canonical already. Substitution getCanonicalSubstitution(bool *wasCanonical = nullptr) const; bool operator!=(const Substitution &other) const { return !(*this == other); } bool operator==(const Substitution &other) const; void print(llvm::raw_ostream &os, const PrintOptions &PO = PrintOptions()) const; void dump() const; void dump(llvm::raw_ostream &os, unsigned indent = 0) const; }; } // end namespace swift #endif