-getHsInstHead :: HsType name -> ([HsTyVarBndr name], (name, [HsType name]))
- -- Split up an instance decl type, returning the 'head' part
-
--- In interface fiels, the type of the decl is held like this:
--- forall a. Foo a -> Baz (T a)
--- so we have to strip off function argument types,
--- as well as the bit before the '=>' (which is always
--- empty in interface files)
---
--- The parser ensures the type will have the right shape.
+splitHsInstDeclTy
+ :: Outputable name
+ => HsType name
+ -> ([HsTyVarBndr name], HsContext name, name, [HsType name])
+ -- Split up an instance decl type, returning the pieces
+
+-- In interface files, the instance declaration head is created
+-- by HsTypes.toHsType, which does not guarantee to produce a
+-- HsForAllTy. For example, if we had the weird decl
+-- instance Foo T => Foo [T]
+-- then we'd get the instance type
+-- Foo T -> Foo [T]
+-- So when colleting the instance context, to be on the safe side
+-- we gather predicate arguments
+--
+-- For source code, the parser ensures the type will have the right shape.