/lib/Sema/ConstraintLocator.cpp

https://gitlab.com/dwiktor/swift · C++ · 240 lines · 181 code · 42 blank · 17 comment · 8 complexity · 0270551a4c173d75fa4a2a8ce1a8037f MD5 · raw file

  1. //===--- ConstraintLocator.cpp - Constraint Locator -----------------------===//
  2. //
  3. // This source file is part of the Swift.org open source project
  4. //
  5. // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
  6. // Licensed under Apache License v2.0 with Runtime Library Exception
  7. //
  8. // See http://swift.org/LICENSE.txt for license information
  9. // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
  10. //
  11. //===----------------------------------------------------------------------===//
  12. //
  13. // This file implements the \c ConstraintLocator class and its related types,
  14. // which is used by the constraint-based type checker to describe how
  15. // a particular constraint was derived.
  16. //
  17. //===----------------------------------------------------------------------===//
  18. #include "ConstraintLocator.h"
  19. #include "ConstraintSystem.h"
  20. #include "swift/AST/Decl.h"
  21. #include "swift/AST/Expr.h"
  22. #include "swift/AST/Types.h"
  23. #include "llvm/ADT/StringExtras.h"
  24. #include "llvm/Support/raw_ostream.h"
  25. using namespace swift;
  26. using namespace constraints;
  27. void ConstraintLocator::Profile(llvm::FoldingSetNodeID &id, Expr *anchor,
  28. ArrayRef<PathElement> path) {
  29. id.AddPointer(anchor);
  30. id.AddInteger(path.size());
  31. for (auto elt : path) {
  32. id.AddInteger(elt.getKind());
  33. switch (elt.getKind()) {
  34. case Archetype:
  35. id.AddPointer(elt.getArchetype()->getCanonicalType().getPointer());
  36. break;
  37. case Requirement:
  38. id.AddPointer(elt.getRequirement());
  39. break;
  40. case Witness:
  41. id.AddPointer(elt.getWitness());
  42. break;
  43. case AssociatedType:
  44. id.AddPointer(elt.getAssociatedType());
  45. break;
  46. case ApplyArgument:
  47. case ApplyFunction:
  48. case FunctionArgument:
  49. case FunctionResult:
  50. case Member:
  51. case MemberRefBase:
  52. case UnresolvedMember:
  53. case SubscriptIndex:
  54. case SubscriptMember:
  55. case SubscriptResult:
  56. case ConstructorMember:
  57. case RvalueAdjustment:
  58. case ClosureResult:
  59. case ParentType:
  60. case InstanceType:
  61. case SequenceIteratorProtocol:
  62. case GeneratorElementType:
  63. case ArrayElementType:
  64. case ScalarToTuple:
  65. case Load:
  66. case GenericArgument:
  67. case InterpolationArgument:
  68. case NamedTupleElement:
  69. case TupleElement:
  70. case ApplyArgToParam:
  71. case OpenedGeneric:
  72. if (unsigned numValues = numNumericValuesInPathElement(elt.getKind())) {
  73. id.AddInteger(elt.getValue());
  74. if (numValues > 1)
  75. id.AddInteger(elt.getValue2());
  76. }
  77. break;
  78. }
  79. }
  80. }
  81. void ConstraintLocator::dump(SourceManager *sm) {
  82. dump(sm, llvm::errs());
  83. llvm::errs() << "\n";
  84. }
  85. void ConstraintLocator::dump(ConstraintSystem *CS) {
  86. dump(&CS->TC.Context.SourceMgr, llvm::errs());
  87. llvm::errs() << "\n";
  88. }
  89. void ConstraintLocator::dump(SourceManager *sm, raw_ostream &out) {
  90. out << "locator@" << (void*) this << " [";
  91. if (anchor) {
  92. out << Expr::getKindName(anchor->getKind());
  93. if (sm) {
  94. out << '@';
  95. anchor->getLoc().print(out, *sm);
  96. }
  97. }
  98. for (auto elt : getPath()) {
  99. out << " -> ";
  100. switch (elt.getKind()) {
  101. case ArrayElementType:
  102. out << "array element";
  103. break;
  104. case Archetype:
  105. out << "archetype '" << elt.getArchetype()->getString() << "'";
  106. break;
  107. case AssociatedType:
  108. out << "associated type '"
  109. << elt.getAssociatedType()->getNameStr() << "'";
  110. break;
  111. case ApplyArgument:
  112. out << "apply argument";
  113. break;
  114. case ApplyFunction:
  115. out << "apply function";
  116. break;
  117. case ApplyArgToParam:
  118. out << "comparing call argument #" << llvm::utostr(elt.getValue())
  119. << " to parameter #" << llvm::utostr(elt.getValue2());
  120. break;
  121. case ClosureResult:
  122. out << "closure result";
  123. break;
  124. case ConstructorMember:
  125. out << "constructor member";
  126. break;
  127. case FunctionArgument:
  128. out << "function argument";
  129. break;
  130. case FunctionResult:
  131. out << "function result";
  132. break;
  133. case GeneratorElementType:
  134. out << "generator element type";
  135. break;
  136. case GenericArgument:
  137. out << "generic argument #" << llvm::utostr(elt.getValue());
  138. break;
  139. case InstanceType:
  140. out << "instance type";
  141. break;
  142. case InterpolationArgument:
  143. out << "interpolation argument #" << llvm::utostr(elt.getValue());
  144. break;
  145. case Load:
  146. out << "load";
  147. break;
  148. case Member:
  149. out << "member";
  150. break;
  151. case MemberRefBase:
  152. out << "member reference base";
  153. break;
  154. case NamedTupleElement:
  155. out << "named tuple element #" << llvm::utostr(elt.getValue());
  156. break;
  157. case UnresolvedMember:
  158. out << "unresolved member";
  159. break;
  160. case ParentType:
  161. out << "parent type";
  162. break;
  163. case RvalueAdjustment:
  164. out << "rvalue adjustment";
  165. break;
  166. case ScalarToTuple:
  167. out << "scalar to tuple";
  168. break;
  169. case SequenceIteratorProtocol:
  170. out << "sequence iterator type";
  171. break;
  172. case SubscriptIndex:
  173. out << "subscript index";
  174. break;
  175. case SubscriptMember:
  176. out << "subscript member";
  177. break;
  178. case SubscriptResult:
  179. out << "subscript result";
  180. break;
  181. case TupleElement:
  182. out << "tuple element #" << llvm::utostr(elt.getValue());
  183. break;
  184. case Requirement:
  185. out << "requirement ";
  186. elt.getRequirement()->dumpRef(out);
  187. break;
  188. case Witness:
  189. out << "witness ";
  190. elt.getWitness()->dumpRef(out);
  191. break;
  192. case OpenedGeneric:
  193. out << "opened generic";
  194. break;
  195. }
  196. }
  197. out << ']';
  198. }