@@ -6,6 +6,8 @@ module Ide.Plugin.SignatureHelp (descriptor) where
66import Control.Arrow ((>>>) )
77import Data.Bifunctor (bimap )
88import Data.Function ((&) )
9+ import Data.IntMap (IntMap )
10+ import qualified Data.IntMap as IntMap
911import qualified Data.Map.Strict as M
1012import qualified Data.Set as S
1113import Data.Text (Text )
@@ -30,7 +32,8 @@ import Development.IDE.GHC.Compat (FastStringCompat, Name,
3032 mkRealSrcSpan , ppr ,
3133 sourceNodeInfo )
3234import Development.IDE.GHC.Compat.Util (LexicalFastString (LexicalFastString ))
33- import Development.IDE.Spans.Common (DocMap ,
35+ import Development.IDE.Spans.Common (ArgDocMap , DocMap ,
36+ SpanDoc ,
3437 spanDocToMarkdown )
3538import GHC.Core.Map.Type (deBruijnize )
3639import GHC.Core.Type (FunTyFlag (FTF_T_T ),
@@ -97,25 +100,25 @@ signatureHelpProvider ideState _pluginId (SignatureHelpParams (TextDocumentIdent
97100 argumentNumber <- getArgumentNumber span hieAst
98101 Just (functionName, functionTypes, argumentNumber)
99102 )
100- docMap <- runIdeActionE " signatureHelp.docMap" (shakeExtras ideState) $ do
101- (DKMap docMap _tyThingMap, _positionMapping) <- useWithStaleFastE GetDocMap nfp
102- pure docMap
103+ ( docMap, argDocMap) <- runIdeActionE " signatureHelp.docMap" (shakeExtras ideState) $ do
104+ (DKMap docMap _tyThingMap argDocMap , _positionMapping) <- useWithStaleFastE GetDocMap nfp
105+ pure ( docMap, argDocMap)
103106 case results of
104107 [(_functionName, [] , _argumentNumber)] -> pure $ InR Null
105108 [(functionName, functionTypes, argumentNumber)] ->
106- pure $ InL $ mkSignatureHelp docMap (fromIntegral argumentNumber - 1 ) functionName functionTypes
109+ pure $ InL $ mkSignatureHelp docMap argDocMap (fromIntegral argumentNumber - 1 ) functionName functionTypes
107110 -- TODO(@linj) what does non-singleton list mean?
108111 _ -> pure $ InR Null
109112
110- mkSignatureHelp :: DocMap -> UInt -> Name -> [Type ] -> SignatureHelp
111- mkSignatureHelp docMap argumentNumber functionName functionTypes =
113+ mkSignatureHelp :: DocMap -> ArgDocMap -> UInt -> Name -> [Type ] -> SignatureHelp
114+ mkSignatureHelp docMap argDocMap argumentNumber functionName functionTypes =
112115 SignatureHelp
113- (mkSignatureInformation docMap argumentNumber functionName <$> functionTypes)
116+ (mkSignatureInformation docMap argDocMap argumentNumber functionName <$> functionTypes)
114117 (Just 0 )
115118 (Just $ InL argumentNumber)
116119
117- mkSignatureInformation :: DocMap -> UInt -> Name -> Type -> SignatureInformation
118- mkSignatureInformation docMap argumentNumber functionName functionType =
120+ mkSignatureInformation :: DocMap -> ArgDocMap -> UInt -> Name -> Type -> SignatureInformation
121+ mkSignatureInformation docMap argDocMap argumentNumber functionName functionType =
119122 let functionNameLabelPrefix = printOutputableOneLine (ppr functionName) <> " :: "
120123 mFunctionDoc = case lookupNameEnv docMap functionName of
121124 Nothing -> Nothing
@@ -125,16 +128,25 @@ mkSignatureInformation docMap argumentNumber functionName functionType =
125128 MarkupContent
126129 MarkupKind_Markdown
127130 (T. unlines . spanDocToMarkdown $ spanDoc)
131+ thisArgDocMap = case lookupNameEnv argDocMap functionName of
132+ Nothing -> mempty
133+ Just argumentDocMap' -> argumentDocMap'
128134 in SignatureInformation
129135 (functionNameLabelPrefix <> printOutputableOneLine functionType)
130136 mFunctionDoc
131- (Just $ mkArguments (fromIntegral $ T. length functionNameLabelPrefix) functionType)
137+ (Just $ mkArguments thisArgDocMap (fromIntegral $ T. length functionNameLabelPrefix) functionType)
132138 (Just $ InL argumentNumber)
133139
134- mkArguments :: UInt -> Type -> [ParameterInformation ]
135- mkArguments offset functionType =
136- [ ParameterInformation (InR range) Nothing
137- | range <- bimap (+ offset) (+ offset) <$> findArgumentRanges functionType
140+ mkArguments :: IntMap SpanDoc -> UInt -> Type -> [ParameterInformation ]
141+ mkArguments thisArgDocMap offset functionType =
142+ [ ParameterInformation (InR range) mArgDoc
143+ | (argIndex, range) <- zip [0 .. ] (bimap (+ offset) (+ offset) <$> findArgumentRanges functionType)
144+ , let mArgDoc = case IntMap. lookup argIndex thisArgDocMap of
145+ Nothing -> Nothing
146+ Just spanDoc ->
147+ Just $
148+ InR $
149+ MarkupContent MarkupKind_Markdown (T. unlines . spanDocToMarkdown $ spanDoc)
138150 ]
139151
140152findArgumentRanges :: Type -> [(UInt , UInt )]
0 commit comments