@@ -8,11 +8,10 @@ module Language.Haskell.Names.ModuleSymbols
88
99import Data.Maybe
1010import Data.Data
11- import Data.Generics.Uniplate.Operations (transform , universe )
1211import qualified Data.Map as Map
1312
14- import Language.Haskell.Exts hiding (DataOrNew (NewType ), PatSyn )
15- import qualified Language.Haskell.Exts as Syntax (DataOrNew (NewType ), Decl ( PatSyn ) )
13+ import Language.Haskell.Exts hiding (DataOrNew (NewType ))
14+ import qualified Language.Haskell.Exts as Syntax (DataOrNew (NewType ))
1615import Language.Haskell.Names.Types
1716import qualified Language.Haskell.Names.GlobalSymbolTable as Global
1817import Language.Haskell.Names.SyntaxUtils
@@ -91,31 +90,11 @@ getTopDeclSymbols impTbl modulename d = (case d of
9190
9291 PatBind _ p _ _ -> [ Value (dropAnn modulename) (dropAnn vn) | vn <- getBound impTbl p ]
9392
94- Syntax. PatSyn _ p _ _ -> fromMaybe [] $ do
95- patSyn <- listToMaybe [ PatSyn (dropAnn modulename) (dropAnn vn) | p' <- universe $ transform dropFields $ transform dropExp p, UnQual _ vn <- varp p' ]
96- let
97- patName = symbolName patSyn
98- patCtor = Constructor (symbolModule patSyn) patName patName
99- fields = [ Selector (symbolModule patSyn) (dropAnn vn) patName [patName] | p' <- universe $ transform dropExp p, UnQual _ vn <- vfield p' ]
100- return (patSyn : patCtor : fields)
101-
102- where
103- varp (PApp _ q _) = [q]
104- varp (PInfixApp _ _ q _) = [q]
105- varp (PRec _ q _) = [q]
106- varp _ = []
107-
108- vfield (PRec _ _ fs) = concatMap get' fs where
109- get' (PFieldPat _ q _) = [q]
110- get' (PFieldPun _ q) = [q]
111- get' _ = []
112- vfield _ = []
113-
114- dropExp (PViewPat _ _ x) = x
115- dropExp x = x
116-
117- dropFields (PRec l q _) = PRec l q []
118- dropFields x = x
93+ PatSyn _ p _ _ -> case patternHead p of
94+ Just patternName -> patternConstructor : patternSelectors where
95+ patternConstructor = PatternConstructor (dropAnn modulename) (dropAnn patternName) Nothing
96+ patternSelectors = [PatternSelector (dropAnn modulename) (dropAnn fn) Nothing (dropAnn patternName) | fn <- patternFields p ]
97+ Nothing -> []
11998
12099 ForImp _ _ _ _ fn _ -> [ Value (dropAnn modulename) (dropAnn fn)]
121100
@@ -174,3 +153,19 @@ qualConDeclNames qualConDecls = do
174153
175154dataOrNewCon :: Syntax. DataOrNew l -> ModuleName () -> Name () -> Symbol
176155dataOrNewCon dataOrNew = case dataOrNew of DataType {} -> Data ; Syntax. NewType {} -> NewType
156+
157+
158+ patternHead :: Pat l -> Maybe (Name l )
159+ patternHead (PApp _ (UnQual _ n) _) = Just n
160+ patternHead (PInfixApp _ _ (UnQual _ n) _) = Just n
161+ patternHead (PRec _ (UnQual _ n) _) = Just n
162+ patternHead _ = Nothing
163+
164+
165+ patternFields :: Pat l -> [Name l ]
166+ patternFields (PRec _ _ fs) = concatMap get' fs where
167+ get' (PFieldPat _ (UnQual _ n) _) = [n]
168+ get' (PFieldPun _ (UnQual _ n)) = [n]
169+ get' _ = []
170+ patternFields _ = []
171+
0 commit comments