@@ -10,7 +10,9 @@ import qualified Data.Map.Strict as M
1010import qualified Data.Set as S
1111import Data.Text (Text )
1212import 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 )
3032import Development.IDE.GHC.Compat.Util (LexicalFastString (LexicalFastString ))
33+ import Development.IDE.Spans.Common (DocMap ,
34+ spanDocToMarkdown )
3135import GHC.Core.Map.Type (deBruijnize )
3236import 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 )
4145import GHC.Iface.Ext.Utils (smallestContainingSatisfying )
46+ import GHC.Types.Name.Env (lookupNameEnv )
4247import GHC.Types.SrcLoc (isRealSubspanOf )
4348import Ide.Plugin.Error (getNormalizedFilePathE )
4449import Ide.Types (PluginDescriptor (pluginHandlers ),
@@ -48,7 +53,9 @@ import Ide.Types (PluginDescriptor (pluginH
4853 mkPluginHandler )
4954import 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 =
7481signatureHelpProvider :: PluginMethodHandler IdeState Method_TextDocumentSignatureHelp
7582signatureHelpProvider 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
0 commit comments