tipc
A TIP to LLVM compiler
Unifier.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "TipType.h"
4 #include "TipVar.h"
5 #include "TypeConstraint.h"
6 #include "UnionFind.h"
7 #include <set>
8 #include <vector>
9 
19 class Unifier {
20 public:
21  Unifier();
22 
27  explicit Unifier(std::vector<TypeConstraint>);
28 
33  ~Unifier() = default;
34 
38  void unify(std::shared_ptr<TipType> t1, std::shared_ptr<TipType> t2);
39 
42  void add(std::vector<TypeConstraint>);
43 
51  void solve();
52 
59  std::shared_ptr<TipType> inferred(std::shared_ptr<TipType> t);
60 
61  static bool isCons(std::shared_ptr<TipType> type);
62  static bool isMu(std::shared_ptr<TipType> type);
63  static bool isVar(std::shared_ptr<TipType> type);
64  static bool isAlpha(std::shared_ptr<TipType> type);
65  static bool isProperType(std::shared_ptr<TipType> type);
66 
67 private:
68  std::shared_ptr<TipType> close(std::shared_ptr<TipType> type,
69  std::set<std::shared_ptr<TipVar>> visited);
70  void throwUnifyException(std::shared_ptr<TipType> TipType1,
71  std::shared_ptr<TipType> TipType2);
72 
73  std::vector<TypeConstraint> constraints;
74  std::shared_ptr<UnionFind> unionFind;
75 };
Class used to solve type constraints and establish typability.
Definition: Unifier.h:19
static bool isVar(std::shared_ptr< TipType > type)
Definition: Unifier.cpp:309
static bool isProperType(std::shared_ptr< TipType > type)
Definition: Unifier.cpp:313
Unifier()
Definition: Unifier.cpp:43
static bool isMu(std::shared_ptr< TipType > type)
Definition: Unifier.cpp:321
static bool isCons(std::shared_ptr< TipType > type)
Definition: Unifier.cpp:317
void add(std::vector< TypeConstraint >)
Add constraints to this unifier.
Definition: Unifier.cpp:69
~Unifier()=default
Construct an empty Unifier.
std::shared_ptr< TipType > inferred(std::shared_ptr< TipType > t)
Returns the inferred type for a given type.
Definition: Unifier.cpp:294
void solve()
Solve the system of constraints that have presented to this unifier.
Definition: Unifier.cpp:96
static bool isAlpha(std::shared_ptr< TipType > type)
Definition: Unifier.cpp:325
void unify(std::shared_ptr< TipType > t1, std::shared_ptr< TipType > t2)
Attempt to unify the two types.
Definition: Unifier.cpp:121