+
+hsPatNeedsParens :: Pat a -> Bool
+hsPatNeedsParens (WildPat {}) = False
+hsPatNeedsParens (VarPat {}) = False
+hsPatNeedsParens (VarPatOut {}) = True
+hsPatNeedsParens (LazyPat {}) = False
+hsPatNeedsParens (BangPat {}) = False
+hsPatNeedsParens (CoPat {}) = True
+hsPatNeedsParens (ParPat {}) = False
+hsPatNeedsParens (AsPat {}) = False
+hsPatNeedsParens (ViewPat {}) = True
+hsPatNeedsParens (SigPatIn {}) = True
+hsPatNeedsParens (SigPatOut {}) = True
+hsPatNeedsParens (TuplePat {}) = False
+hsPatNeedsParens (ListPat {}) = False
+hsPatNeedsParens (PArrPat {}) = False
+hsPatNeedsParens (ConPatIn _ ds) = conPatNeedsParens ds
+hsPatNeedsParens (ConPatOut {}) = True
+hsPatNeedsParens (LitPat {}) = False
+hsPatNeedsParens (NPat {}) = False
+hsPatNeedsParens (NPlusKPat {}) = True
+hsPatNeedsParens (QuasiQuotePat {}) = True
+hsPatNeedsParens (TypePat {}) = False
+
+conPatNeedsParens :: HsConDetails a b -> Bool
+conPatNeedsParens (PrefixCon args) = not (null args)
+conPatNeedsParens (InfixCon {}) = False
+conPatNeedsParens (RecCon {}) = False