@@ -15,7 +15,8 @@ module Development.IDE.Plugin.CodeAction
15
15
, matchRegExMultipleImports
16
16
) where
17
17
18
- import Bag (isEmptyBag )
18
+ import Bag (bagToList ,
19
+ isEmptyBag )
19
20
import Control.Applicative ((<|>) )
20
21
import Control.Arrow (second ,
21
22
(>>>) )
@@ -179,27 +180,51 @@ findSigOfDecl pred decls =
179
180
any (pred . unLoc) idsSig
180
181
]
181
182
182
- findSigOfDecl' :: Range -> [LHsDecl p ] -> Either String (Sig p )
183
- findSigOfDecl' range decls = do
183
+ findSigOfDeclRanged :: Range -> [LHsDecl p ] -> Either String (Sig p )
184
+ findSigOfDeclRanged range decls = do
184
185
dec <- findDeclContainingLocE (_start range) decls
185
186
case dec of
186
187
L _ (SigD _ sig@ (TypeSig {})) -> Right sig
187
188
L _ (ValD _ (bind :: HsBind p )) -> findSigOfBind range bind
188
- _ -> Left " Other "
189
+ _ -> Left " findSigOfDeclRanged "
189
190
190
191
findSigOfBind :: Range -> HsBind p -> Either String (Sig p )
191
192
findSigOfBind range bind =
192
193
case bind of
193
194
FunBind {} -> findSigOfLMatch (unLoc $ mg_alts (fun_matches bind))
194
- _ -> Left " Other findSigOfBind"
195
+ _ -> Left " findSigOfBind"
195
196
where
196
- findSigOfLMatch :: [LMatch p (LHsExpr idR )] -> Either String (Sig p )
197
+ findSigOfLMatch :: [LMatch p (LHsExpr p )] -> Either String (Sig p )
197
198
findSigOfLMatch ls = do
198
199
match <- findDeclContainingLocE (_start range) ls
199
- case unLoc (grhssLocalBinds (m_grhss (unLoc match))) of
200
- HsValBinds _ (ValBinds _ _ lsigs) ->
201
- unLoc <$> findDeclContainingLocE (_start range) lsigs
202
- _ -> Left " Other findSigOfLMatch"
200
+ findSigOfGRHSs (m_grhss (unLoc match))
201
+
202
+ findSigOfGRHSs :: GRHSs p (LHsExpr p ) -> Either String (Sig p )
203
+ findSigOfGRHSs grhs = do
204
+ if (_start range) `isInsideSrcSpan` (getLoc $ grhssLocalBinds grhs)
205
+ then findSigOfBinds range (unLoc (grhssLocalBinds grhs)) -- where clause
206
+ else do
207
+ grhs <- findDeclContainingLocE (_start range) (grhssGRHSs grhs)
208
+ case unLoc grhs of
209
+ GRHS _ _ bd -> findSigOfExpr (unLoc bd)
210
+ _ -> Left " findSigOfGRHSs"
211
+
212
+ findSigOfExpr :: HsExpr p -> Either String (Sig p )
213
+ findSigOfExpr = go
214
+ where
215
+ go (HsLet _ binds _) = findSigOfBinds range (unLoc binds)
216
+ go _ = Left " findSigOfExpr"
217
+
218
+ findSigOfBinds :: Range -> HsLocalBinds p -> Either String (Sig p )
219
+ findSigOfBinds range = go
220
+ where
221
+ go (HsValBinds _ (ValBinds _ binds lsigs)) =
222
+ case unLoc <$> findDeclContainingLocE (_start range) lsigs of
223
+ Right sig' -> Right sig'
224
+ Left _ -> do
225
+ lHsBindLR <- findDeclContainingLocE (_start range) (bagToList binds)
226
+ findSigOfBind range (unLoc lHsBindLR)
227
+ go _ = Left " findSigOfBinds"
203
228
204
229
findDeclContainingLocE :: Position -> [Located a ] -> Either String (Located a )
205
230
findDeclContainingLocE loc ls =
@@ -1114,7 +1139,7 @@ removeRedundantConstraints df m Diagnostic{..}
1114
1139
, True <- " Redundant constraint" `T.isInfixOf` _message
1115
1140
, Just typeSignatureName <- findTypeSignatureName _message
1116
1141
, Right (TypeSig _ _ HsWC {hswc_body = HsIB {hsib_body = sig}})
1117
- <- findSigOfDecl' _range hsmodDecls
1142
+ <- findSigOfDeclRanged _range hsmodDecls
1118
1143
, Just redundantConstraintList <- findRedundantConstraints _message
1119
1144
, rewrite' <- removeConstraint (pred df redundantConstraintList) sig
1120
1145
= [(actionTitle redundantConstraintList typeSignatureName, [rewrite'])]
0 commit comments