Skip to content

Commit 4d32c2a

Browse files
committed
improve hover rendering
1 parent dc807c4 commit 4d32c2a

File tree

1 file changed

+22
-18
lines changed

1 file changed

+22
-18
lines changed

ghcide/src/Development/IDE/Spans/AtPoint.hs

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ import Development.IDE.Spans.Common
3131
import Development.IDE.Types.Options
3232

3333
-- GHC API imports
34-
import FastString (unpackFS)
34+
-- GHC API imports
35+
import FastString (unpackFS, lengthFS)
3536
import IfaceType
3637
import Name
3738
import NameEnv
@@ -173,14 +174,18 @@ documentHighlight hf rf pos = pure highlights
173174
highlights = do
174175
n <- ns
175176
ref <- fromMaybe [] (M.lookup (Right n) rf)
176-
pure $ makeHighlight ref
177-
makeHighlight (sp,dets) =
178-
DocumentHighlight (realSrcSpanToRange sp) (Just $ highlightType $ identInfo dets)
177+
maybeToList (makeHighlight n ref)
178+
makeHighlight n (sp,dets)
179+
| isTvNameSpace (nameNameSpace n) && isBadSpan n sp = Nothing
180+
| otherwise = Just $ DocumentHighlight (realSrcSpanToRange sp) (Just $ highlightType $ identInfo dets)
179181
highlightType s =
180182
if any (isJust . getScopeFromContext) s
181183
then HkWrite
182184
else HkRead
183185

186+
isBadSpan :: Name -> RealSrcSpan -> Bool
187+
isBadSpan n sp = srcSpanStartLine sp /= srcSpanEndLine sp || (srcSpanEndCol sp - srcSpanStartCol sp > lengthFS (occNameFS $ nameOccName n))
188+
184189
gotoTypeDefinition
185190
:: MonadIO m
186191
=> HieDb
@@ -271,30 +276,29 @@ atPoint IdeOptions{} (HAR _ (hf :: HieASTs a) _rf _ kind) (DKMap dm km) pos = li
271276
renderEvidenceTree (T.Node (EvidenceInfo{evidenceDetails=Just (EvLetBind _,_,_)}) [x])
272277
= renderEvidenceTree x
273278
renderEvidenceTree (T.Node (EvidenceInfo{evidenceDetails=Just (EvLetBind _,_,_), ..}) xs)
274-
= hang (text "- Evidence of constraint `" O.<> expandType evidenceType O.<> "`") 2 $
275-
vcat $ text "depending on:" : map renderEvidenceTree' xs
276-
renderEvidenceTree x = renderEvidenceTree' x
279+
= hang (text "Evidence of constraint `" O.<> expandType evidenceType O.<> "`") 2 $
280+
vcat $ text "constructed using:" : map renderEvidenceTree' xs
281+
renderEvidenceTree (T.Node (EvidenceInfo{..}) _)
282+
= hang (text "Evidence of constraint `" O.<> expandType evidenceType O.<> "`") 2 $
283+
vcat $ printDets evidenceSpan evidenceDetails : map (text . T.unpack) (definedAt evidenceVar)
277284

278285
-- renderEvidenceTree' skips let bound evidence variables and prints the children directly
279286
renderEvidenceTree' (T.Node (EvidenceInfo{evidenceDetails=Just (EvLetBind _,_,_)}) xs)
280287
= vcat (map renderEvidenceTree' xs)
281-
renderEvidenceTree' (T.Node (EvidenceInfo{..}) xs)
282-
= hang (text "- Evidence of constraint `" O.<> expandType evidenceType O.<> "`") 2 $
283-
vcat $ map (text . T.unpack) (definedAt evidenceVar)
284-
++ [printDets evidenceSpan evidenceDetails (null xs)]
285-
++ map renderEvidenceTree' xs
286-
287-
printDets :: RealSrcSpan -> Maybe (EvVarSource, Scope, Maybe Span) -> Bool -> SDoc
288-
printDets _ Nothing True = text ""
289-
printDets _ Nothing False = text "constructed using:"
290-
printDets ospn (Just (src,_,mspn)) _ = pprSrc
288+
renderEvidenceTree' (T.Node (EvidenceInfo{..}) _)
289+
= hang (text "- `" O.<> expandType evidenceType O.<> "`") 2 $
290+
vcat $ printDets evidenceSpan evidenceDetails : map (text . T.unpack) (definedAt evidenceVar)
291+
292+
printDets :: RealSrcSpan -> Maybe (EvVarSource, Scope, Maybe Span) -> SDoc
293+
printDets _ Nothing = text "using an external instance"
294+
printDets ospn (Just (src,_,mspn)) = pprSrc
291295
$$ text "at" <+> ppr spn
292296
where
293297
-- Use the bind span if we have one, else use the occurence span
294298
spn = fromMaybe ospn mspn
295299
pprSrc = case src of
296300
-- Users don't know what HsWrappers are
297-
EvWrapperBind -> "bound by type signature or pattern"
301+
EvWrapperBind -> "bound by a context"
298302
_ -> ppr src
299303
#endif
300304

0 commit comments

Comments
 (0)