   }
 }
 
-extension Syntax: Equatable {
+extension Syntax: Hashable {
   /// Determines if two nodes are equal to each other.
   public static func ==(lhs: Syntax, rhs: Syntax) -> Bool {
-    return lhs.data === rhs.data
+    return lhs.hashValue == rhs.hashValue
+  }
+  /// Use reference value as the hashValue for this Syntax
+  public var hashValue: Int {
+    return ObjectIdentifier(data).hashValue
   }
 }
 

  public var root: Syntax {
    return Syntax.make(root: _root,  data: _root)
  }
  
  /// The sequence of indices that correspond to child nodes that are not
  /// missing.
  ///

  public var isExpr: Bool {
    return raw.kind.isExpr
  }

  /// Whether or not this node represents a Declaration.
  public var isDecl: Bool {
    return raw.kind.isDecl
