@@ -14,7 +14,8 @@ module Development.IDE.Plugin.CodeAction
14
14
, matchRegExMultipleImports
15
15
) where
16
16
17
- import Bag (isEmptyBag )
17
+ import Bag (bagToList ,
18
+ isEmptyBag )
18
19
import Control.Applicative ((<|>) )
19
20
import Control.Arrow (second ,
20
21
(>>>) )
@@ -161,27 +162,51 @@ findSigOfDecl pred decls =
161
162
any (pred . unLoc) idsSig
162
163
]
163
164
164
- findSigOfDecl' :: Range -> [LHsDecl p ] -> Either String (Sig p )
165
- findSigOfDecl' range decls = do
165
+ findSigOfDeclRanged :: Range -> [LHsDecl p ] -> Either String (Sig p )
166
+ findSigOfDeclRanged range decls = do
166
167
dec <- findDeclContainingLocE (_start range) decls
167
168
case dec of
168
- L _ (SigD _ sig@ TypeSig ) -> Right sig
169
+ L _ (SigD _ sig@ TypeSig {} ) -> Right sig
169
170
L _ (ValD _ (bind :: HsBind p )) -> findSigOfBind range bind
170
- _ -> Left " Other "
171
+ _ -> Left " findSigOfDeclRanged "
171
172
172
173
findSigOfBind :: Range -> HsBind p -> Either String (Sig p )
173
174
findSigOfBind range bind =
174
175
case bind of
175
176
FunBind {} -> findSigOfLMatch (unLoc $ mg_alts (fun_matches bind))
176
- _ -> Left " Other findSigOfBind"
177
+ _ -> Left " findSigOfBind"
177
178
where
178
- findSigOfLMatch :: [LMatch p (LHsExpr idR )] -> Either String (Sig p )
179
+ findSigOfLMatch :: [LMatch p (LHsExpr p )] -> Either String (Sig p )
179
180
findSigOfLMatch ls = do
180
181
match <- findDeclContainingLocE (_start range) ls
181
- case unLoc (grhssLocalBinds (m_grhss (unLoc match))) of
182
- HsValBinds _ (ValBinds _ _ lsigs) ->
183
- unLoc <$> findDeclContainingLocE (_start range) lsigs
184
- _ -> Left " Other findSigOfLMatch"
182
+ findSigOfGRHSs (m_grhss (unLoc match))
183
+
184
+ findSigOfGRHSs :: GRHSs p (LHsExpr p ) -> Either String (Sig p )
185
+ findSigOfGRHSs grhs = do
186
+ if _start range `isInsideSrcSpan` (getLoc $ grhssLocalBinds grhs)
187
+ then findSigOfBinds range (unLoc (grhssLocalBinds grhs)) -- where clause
188
+ else do
189
+ grhs <- findDeclContainingLocE (_start range) (grhssGRHSs grhs)
190
+ case unLoc grhs of
191
+ GRHS _ _ bd -> findSigOfExpr (unLoc bd)
192
+ _ -> Left " findSigOfGRHSs"
193
+
194
+ findSigOfExpr :: HsExpr p -> Either String (Sig p )
195
+ findSigOfExpr = go
196
+ where
197
+ go (HsLet _ binds _) = findSigOfBinds range (unLoc binds)
198
+ go _ = Left " findSigOfExpr"
199
+
200
+ findSigOfBinds :: Range -> HsLocalBinds p -> Either String (Sig p )
201
+ findSigOfBinds range = go
202
+ where
203
+ go (HsValBinds _ (ValBinds _ binds lsigs)) =
204
+ case unLoc <$> findDeclContainingLocE (_start range) lsigs of
205
+ Right sig' -> Right sig'
206
+ Left _ -> do
207
+ lHsBindLR <- findDeclContainingLocE (_start range) (bagToList binds)
208
+ findSigOfBind range (unLoc lHsBindLR)
209
+ go _ = Left " findSigOfBinds"
185
210
186
211
findDeclContainingLocE :: Position -> [Located a ] -> Either String (Located a )
187
212
findDeclContainingLocE loc ls =
@@ -1096,7 +1121,7 @@ removeRedundantConstraints df (L _ HsModule {hsmodDecls}) Diagnostic{..}
1096
1121
| " Redundant constraint" `T.isInfixOf` _message
1097
1122
, Just typeSignatureName <- findTypeSignatureName _message
1098
1123
, Right (TypeSig _ _ HsWC {hswc_body = HsIB {hsib_body = sig}})
1099
- <- findSigOfDecl' _range hsmodDecls
1124
+ <- findSigOfDeclRanged _range hsmodDecls
1100
1125
, Just redundantConstraintList <- findRedundantConstraints _message
1101
1126
, rewrite <- removeConstraint (pred df redundantConstraintList) sig
1102
1127
= [(actionTitle redundantConstraintList typeSignatureName, rewrite)]
0 commit comments