blob: ea62585b4d190e2269c9c95a150d6f079f0d9742 [file] [log] [blame]
//===--- 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 http://swift.org/LICENSE.txt for license information
// See http://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 SubstitutionMap {
using ParentType = std::pair<CanType, AssociatedTypeDecl *>;
llvm::DenseMap<TypeBase *, Type> subMap;
llvm::DenseMap<TypeBase *, ArrayRef<ProtocolConformanceRef>> conformanceMap;
llvm::DenseMap<TypeBase *, SmallVector<ParentType, 1>> parentMap;
Optional<ProtocolConformanceRef>
lookupConformance(ProtocolDecl *proto,
ArrayRef<ProtocolConformanceRef> conformances) const;
template<typename Fn>
Optional<ProtocolConformanceRef> forEachParent(CanType type, Fn fn) const;
public:
Optional<ProtocolConformanceRef>
lookupConformance(CanType type, ProtocolDecl *proto) const;
const llvm::DenseMap<TypeBase *, Type> &getMap() const {
return subMap;
}
void addSubstitution(CanType type, Type replacement);
void addConformances(CanType type, ArrayRef<ProtocolConformanceRef> conformances);
void addParent(CanType type, CanType parent,
AssociatedTypeDecl *assocType);
void removeType(CanType type);
};
} // end namespace swift
#endif