@@ -56,18 +56,10 @@ getTopDeclSymbols impTbl modulename d = (case d of
5656 TypeFamDecl _ dh _ -> [declHeadSymbol TypeFam dh]
5757
5858 DataDecl _ dataOrNew _ dh qualConDecls _ -> declHeadSymbol (dataOrNewCon dataOrNew) dh : infos where
59- cons :: [(Name l ,[Name l ])]
60- cons = do -- list monad
61- QualConDecl _ _ _ conDecl <- qualConDecls
62- case conDecl of
63- ConDecl _ n _ -> return (n, [] )
64- InfixConDecl _ _ n _ -> return (n, [] )
65- RecDecl _ n fields ->
66- return (n , [f | FieldDecl _ fNames _ <- fields, f <- fNames])
6759
6860 dq = getDeclHeadName dh
6961
70- infos = constructorsToInfos modulename dq cons
62+ infos = constructorsToInfos modulename dq (qualConDeclNames qualConDecls)
7163
7264 GDataDecl _ dataOrNew _ dh _ gadtDecls _ -> declHeadSymbol (dataOrNewCon dataOrNew) dh : infos where
7365 -- FIXME: We shouldn't create selectors for fields with existential type variables!
@@ -99,6 +91,15 @@ getTopDeclSymbols impTbl modulename d = (case d of
9991
10092 ForImp _ _ _ _ fn _ -> [ Value (sModuleName modulename) (sName fn)]
10193
94+ DataInsDecl _ _ typ qualConDecls _ -> constructorsToInfos modulename (typeOuterName typ) (qualConDeclNames qualConDecls)
95+
96+ GDataInsDecl _ _ typ _ gadtDecls _ -> constructorsToInfos modulename (typeOuterName typ) cons where
97+ -- FIXME: We shouldn't create selectors for fields with existential type variables!
98+ cons :: [(Name l ,[Name l ])]
99+ cons = do -- list monad
100+ GadtDecl _ cn (fromMaybe [] -> fields) _ty <- gadtDecls
101+ return (cn , [f | FieldDecl _ fNames _ <- fields, f <- fNames])
102+
102103 _ -> [] )
103104 where
104105 declHeadSymbol c dh = c (sModuleName modulename) (sName (getDeclHeadName dh))
@@ -122,5 +123,26 @@ constructorsToInfos modulename typename constructors = conInfos ++ selInfos wher
122123 constructornames <- maybeToList (Map. lookup (nameToString selectorname) selectorsMap)
123124 return (Selector (sModuleName modulename) (sName selectorname) (sName typename) (map sName constructornames))
124125
126+ typeOuterName :: Type l -> Name l
127+ typeOuterName t = case t of
128+ TyForall _ _ _ typ -> typeOuterName typ
129+ TyApp _ typ _ -> typeOuterName typ
130+ TyCon _ qname -> qNameToName qname
131+ TyParen _ typ -> typeOuterName typ
132+ TyInfix _ _ qname _ -> qNameToName qname
133+ TyKind _ typ _ -> typeOuterName typ
134+ TyBang _ _ typ -> typeOuterName typ
135+ _ -> error " illegal data family in data instance"
136+
137+ qualConDeclNames :: [QualConDecl l ] -> [(Name l ,[Name l ])]
138+ qualConDeclNames qualConDecls = do
139+ QualConDecl _ _ _ conDecl <- qualConDecls
140+ case conDecl of
141+ ConDecl _ n _ -> return (n, [] )
142+ InfixConDecl _ _ n _ -> return (n, [] )
143+ RecDecl _ n fields ->
144+ return (n , [f | FieldDecl _ fNames _ <- fields, f <- fNames])
145+
146+
125147dataOrNewCon :: Syntax. DataOrNew l -> UnAnn. ModuleName -> UnAnn. Name -> Symbol
126148dataOrNewCon dataOrNew = case dataOrNew of DataType {} -> Data ; Syntax. NewType {} -> NewType
0 commit comments