Skip to content

Commit a522e88

Browse files
committed
Show function documentation in signature help
1 parent 081ea8f commit a522e88

File tree

2 files changed

+40
-10
lines changed

2 files changed

+40
-10
lines changed

plugins/hls-signature-help-plugin/src/Ide/Plugin/SignatureHelp.hs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import qualified Data.Map.Strict as M
1010
import qualified Data.Set as S
1111
import Data.Text (Text)
1212
import qualified Data.Text as T
13-
import Development.IDE (GetHieAst (GetHieAst),
13+
import Development.IDE (DocAndTyThingMap (DKMap),
14+
GetDocMap (GetDocMap),
15+
GetHieAst (GetHieAst),
1416
HieAstResult (HAR, hieAst, hieKind),
1517
HieKind (..),
1618
IdeState (shakeExtras),
@@ -28,6 +30,8 @@ import Development.IDE.GHC.Compat (FastStringCompat, Name,
2830
mkRealSrcSpan, ppr,
2931
sourceNodeInfo)
3032
import Development.IDE.GHC.Compat.Util (LexicalFastString (LexicalFastString))
33+
import Development.IDE.Spans.Common (DocMap,
34+
spanDocToMarkdown)
3135
import GHC.Core.Map.Type (deBruijnize)
3236
import GHC.Core.Type (FunTyFlag (FTF_T_T),
3337
Type, dropForAlls,
@@ -39,6 +43,7 @@ import GHC.Iface.Ext.Types (ContextInfo (Use),
3943
IdentifierDetails (identInfo, identType),
4044
nodeType)
4145
import GHC.Iface.Ext.Utils (smallestContainingSatisfying)
46+
import GHC.Types.Name.Env (lookupNameEnv)
4247
import GHC.Types.SrcLoc (isRealSubspanOf)
4348
import Ide.Plugin.Error (getNormalizedFilePathE)
4449
import Ide.Types (PluginDescriptor (pluginHandlers),
@@ -48,7 +53,9 @@ import Ide.Types (PluginDescriptor (pluginH
4853
mkPluginHandler)
4954
import Language.LSP.Protocol.Message (Method (Method_TextDocumentSignatureHelp),
5055
SMethod (SMethod_TextDocumentSignatureHelp))
51-
import Language.LSP.Protocol.Types (Null (Null),
56+
import Language.LSP.Protocol.Types (MarkupContent (MarkupContent),
57+
MarkupKind (MarkupKind_Markdown),
58+
Null (Null),
5259
ParameterInformation (ParameterInformation),
5360
Position (Position),
5461
SignatureHelp (SignatureHelp),
@@ -74,7 +81,7 @@ descriptor _recorder pluginId =
7481
signatureHelpProvider :: PluginMethodHandler IdeState Method_TextDocumentSignatureHelp
7582
signatureHelpProvider ideState _pluginId (SignatureHelpParams (TextDocumentIdentifier uri) position _mProgreeToken _mContext) = do
7683
nfp <- getNormalizedFilePathE uri
77-
results <- runIdeActionE "signatureHelp" (shakeExtras ideState) $ do
84+
results <- runIdeActionE "signatureHelp.ast" (shakeExtras ideState) $ do
7885
-- TODO(@linj) why HAR {hieAst} may have more than one AST?
7986
(HAR {hieAst, hieKind}, positionMapping) <- useWithStaleFastE GetHieAst nfp
8087
case fromCurrentPosition positionMapping position of
@@ -90,26 +97,37 @@ signatureHelpProvider ideState _pluginId (SignatureHelpParams (TextDocumentIdent
9097
argumentNumber <- getArgumentNumber span hieAst
9198
Just (functionName, functionTypes, argumentNumber)
9299
)
100+
docMap <- runIdeActionE "signatureHelp.docMap" (shakeExtras ideState) $ do
101+
(DKMap docMap _tyThingMap, _positionMapping) <- useWithStaleFastE GetDocMap nfp
102+
pure docMap
93103
case results of
94104
[(_functionName, [], _argumentNumber)] -> pure $ InR Null
95105
[(functionName, functionTypes, argumentNumber)] ->
96-
pure $ InL $ mkSignatureHelp (fromIntegral argumentNumber - 1) functionName functionTypes
106+
pure $ InL $ mkSignatureHelp docMap (fromIntegral argumentNumber - 1) functionName functionTypes
97107
-- TODO(@linj) what does non-singleton list mean?
98108
_ -> pure $ InR Null
99109

100-
mkSignatureHelp :: UInt -> Name -> [Type] -> SignatureHelp
101-
mkSignatureHelp argumentNumber functionName functionTypes =
110+
mkSignatureHelp :: DocMap -> UInt -> Name -> [Type] -> SignatureHelp
111+
mkSignatureHelp docMap argumentNumber functionName functionTypes =
102112
SignatureHelp
103-
(mkSignatureInformation argumentNumber functionName <$> functionTypes)
113+
(mkSignatureInformation docMap argumentNumber functionName <$> functionTypes)
104114
(Just 0)
105115
(Just $ InL argumentNumber)
106116

107-
mkSignatureInformation :: UInt -> Name -> Type -> SignatureInformation
108-
mkSignatureInformation argumentNumber functionName functionType =
117+
mkSignatureInformation :: DocMap -> UInt -> Name -> Type -> SignatureInformation
118+
mkSignatureInformation docMap argumentNumber functionName functionType =
109119
let functionNameLabelPrefix = printOutputableOneLine (ppr functionName) <> " :: "
120+
mFunctionDoc = case lookupNameEnv docMap functionName of
121+
Nothing -> Nothing
122+
Just spanDoc ->
123+
Just $
124+
InR $
125+
MarkupContent
126+
MarkupKind_Markdown
127+
(T.unlines . spanDocToMarkdown $ spanDoc)
110128
in SignatureInformation
111129
(functionNameLabelPrefix <> printOutputableOneLine functionType)
112-
Nothing
130+
mFunctionDoc
113131
(Just $ mkArguments (fromIntegral $ T.length functionNameLabelPrefix) functionType)
114132
(Just $ InL argumentNumber)
115133

plugins/hls-signature-help-plugin/test/Main.hs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,18 @@ main =
286286
[ Nothing,
287287
Just $ SignatureHelp [SignatureInformation "f :: forall a b. (a -> b) %1 -> a -> b" Nothing (Just [ParameterInformation (InR (18,24)) Nothing, ParameterInformation (InR (32,33)) Nothing]) (Just (InL 0)), SignatureInformation "f :: (Integer -> Integer) %1 -> Integer -> Integer" Nothing (Just [ParameterInformation (InR (6,24)) Nothing, ParameterInformation (InR (32,39)) Nothing]) (Just (InL 0))] (Just 0) (Just (InL 0)),
288288
Just $ SignatureHelp [SignatureInformation "f :: forall a b. (a -> b) %1 -> a -> b" Nothing (Just [ParameterInformation (InR (18,24)) Nothing, ParameterInformation (InR (32,33)) Nothing]) (Just (InL 0)), SignatureInformation "f :: (Integer -> b) %1 -> Integer -> b" Nothing (Just [ParameterInformation (InR (6,18)) Nothing, ParameterInformation (InR (26,33)) Nothing]) (Just (InL 0))] (Just 0) (Just (InL 0))
289+
],
290+
mkTest
291+
"function documentation"
292+
[trimming|
293+
-- |The 'f' function does something to a bool value.
294+
f :: Bool -> Bool
295+
f = _
296+
x = f True
297+
^ ^
298+
|]
299+
[ Nothing,
300+
Just $ SignatureHelp [SignatureInformation "f :: Bool -> Bool" (Just $ InR $ MarkupContent MarkupKind_Markdown "\n\nThe `f` function does something to a bool value.\n\n") (Just [ParameterInformation (InR (5,9)) Nothing]) (Just (InL 0))] (Just 0) (Just (InL 0))
289301
]
290302
]
291303

0 commit comments

Comments
 (0)