@@ -56,18 +56,10 @@ getTopDeclSymbols impTbl modulename d = (case d of
56
56
TypeFamDecl _ dh _ -> [declHeadSymbol TypeFam dh]
57
57
58
58
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])
67
59
68
60
dq = getDeclHeadName dh
69
61
70
- infos = constructorsToInfos modulename dq cons
62
+ infos = constructorsToInfos modulename dq (qualConDeclNames qualConDecls)
71
63
72
64
GDataDecl _ dataOrNew _ dh _ gadtDecls _ -> declHeadSymbol (dataOrNewCon dataOrNew) dh : infos where
73
65
-- FIXME: We shouldn't create selectors for fields with existential type variables!
@@ -99,6 +91,15 @@ getTopDeclSymbols impTbl modulename d = (case d of
99
91
100
92
ForImp _ _ _ _ fn _ -> [ Value (sModuleName modulename) (sName fn)]
101
93
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
+
102
103
_ -> [] )
103
104
where
104
105
declHeadSymbol c dh = c (sModuleName modulename) (sName (getDeclHeadName dh))
@@ -122,5 +123,26 @@ constructorsToInfos modulename typename constructors = conInfos ++ selInfos wher
122
123
constructornames <- maybeToList (Map. lookup (nameToString selectorname) selectorsMap)
123
124
return (Selector (sModuleName modulename) (sName selectorname) (sName typename) (map sName constructornames))
124
125
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
+
125
147
dataOrNewCon :: Syntax. DataOrNew l -> UnAnn. ModuleName -> UnAnn. Name -> Symbol
126
148
dataOrNewCon dataOrNew = case dataOrNew of DataType {} -> Data ; Syntax. NewType {} -> NewType
0 commit comments