Skip to content

Commit 3f5aa28

Browse files
committed
have separate linkDocTo and linkSourceTo
1 parent 43b8a5c commit 3f5aa28

File tree

7 files changed

+59
-24
lines changed

7 files changed

+59
-24
lines changed

ghcide/src/Development/IDE/Core/Rules.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -583,8 +583,8 @@ getDocMapRule recorder =
583583
(tmrTypechecked -> tc, _) <- useWithStale_ TypeCheck file
584584
(hscEnv -> hsc, _) <- useWithStale_ GhcSessionDeps file
585585
(HAR{refMap=rf}, _) <- useWithStale_ GetHieAst file
586-
linkToHackage <- optLinkToHackage <$> getIdeOptions
587-
dkMap <- liftIO $ mkDocMap hsc rf tc linkToHackage
586+
linkTgts <- linkTargets <$> getIdeOptions
587+
dkMap <- liftIO $ mkDocMap hsc rf tc linkTgts
588588
return ([],Just dkMap)
589589

590590
-- | Persistent rule to ensure that hover doesn't block on startup

ghcide/src/Development/IDE/Core/Shake.hs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -449,7 +449,8 @@ getIdeOptions = do
449449
config <- liftIO $ LSP.runLspT env HLS.getClientConfig
450450
return x{optCheckProject = pure $ checkProject config,
451451
optCheckParents = pure $ checkParents config,
452-
optLinkToHackage = linkToHackage config
452+
optLinkSourceTo = linkSourceTo config,
453+
optLinkDocTo = linkDocTo config
453454
}
454455

455456
getIdeOptionsIO :: ShakeExtras -> IO IdeOptions

ghcide/src/Development/IDE/Plugin/Completions.hs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ import Development.IDE.Core.Rules (usePropertyAction)
5656

5757
import qualified Ide.Plugin.Config as Config
5858

59-
import Development.IDE.Types.Options (IdeOptions (optLinkToHackage))
59+
import Development.IDE.Types.Options (IdeOptions (linkTargets))
6060
import qualified GHC.LanguageExtensions as LangExt
6161

6262
data Log = LogShake Shake.Log deriving Show
@@ -138,8 +138,8 @@ resolveCompletion ide _pid comp@CompletionItem{_detail,_documentation,_data_} ur
138138
doc <- case lookupNameEnv dm name of
139139
Just doc -> pure $ spanDocToMarkdown doc
140140
Nothing -> liftIO $ do
141-
lc <- optLinkToHackage <$> getIdeOptionsIO (shakeExtras ide)
142-
spanDocToMarkdown . fst <$> getDocumentationTryGhc (hscEnv sess) lc name
141+
ltgts <- linkTargets <$> getIdeOptionsIO (shakeExtras ide)
142+
spanDocToMarkdown . fst <$> getDocumentationTryGhc (hscEnv sess) ltgts name
143143
typ <- case lookupNameEnv km name of
144144
_ | not needType -> pure Nothing
145145
Just ty -> pure (safeTyThingType ty)

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ mkDocMap
4343
:: HscEnv
4444
-> RefMap a
4545
-> TcGblEnv
46-
-> Bool
46+
-> LinkTargets
4747
-> IO DocAndTyThingMap
48-
mkDocMap env rm this_mod linkToHackage =
48+
mkDocMap env rm this_mod linkTgts =
4949
do
5050
(Just Docs{docs_decls = UniqMap this_docs, docs_args = UniqMap this_arg_docs}) <- extractDocs (hsc_dflags env) this_mod
5151
d <- foldrM getDocs (fmap (\(_, x) -> (map hsDocString x) `SpanDocString` SpanDocUris Nothing Nothing) this_docs) names
@@ -56,7 +56,7 @@ mkDocMap env rm this_mod linkToHackage =
5656
getDocs n nameMap
5757
| maybe True (mod ==) $ nameModule_maybe n = pure nameMap -- we already have the docs in this_docs, or they do not exist
5858
| otherwise = do
59-
(doc, _argDoc) <- getDocumentationTryGhc env linkToHackage n
59+
(doc, _argDoc) <- getDocumentationTryGhc env linkTgts n
6060
pure $ extendNameEnv nameMap n doc
6161
getType n nameMap
6262
| Nothing <- lookupNameEnv nameMap n
@@ -66,7 +66,7 @@ mkDocMap env rm this_mod linkToHackage =
6666
getArgDocs n nameMap
6767
| maybe True (mod ==) $ nameModule_maybe n = pure nameMap
6868
| otherwise = do
69-
(_doc, argDoc) <- getDocumentationTryGhc env linkToHackage n
69+
(_doc, argDoc) <- getDocumentationTryGhc env linkTgts n
7070
pure $ extendNameEnv nameMap n argDoc
7171
names = rights $ S.toList idents
7272
idents = M.keysSet rm
@@ -81,8 +81,8 @@ getDocumentationTryGhc env l2h n =
8181
(fromMaybe (emptySpanDoc, mempty) . listToMaybe <$> getDocumentationsTryGhc env l2h [n])
8282
`catch` (\(_ :: IOEnvFailure) -> pure (emptySpanDoc, mempty))
8383

84-
getDocumentationsTryGhc :: HscEnv -> Bool -> [Name] -> IO [(SpanDoc, IntMap SpanDoc)]
85-
getDocumentationsTryGhc env linkToHackage names = do
84+
getDocumentationsTryGhc :: HscEnv -> LinkTargets -> [Name] -> IO [(SpanDoc, IntMap SpanDoc)]
85+
getDocumentationsTryGhc env linkTgts names = do
8686
resOr <- catchSrcErrors (hsc_dflags env) "docs" $ getDocsBatch env names
8787
case resOr of
8888
Left _ -> return []
@@ -102,10 +102,18 @@ getDocumentationsTryGhc env linkToHackage names = do
102102
doc <- lookupDocHtmlForModule env mod
103103
src <- lookupSrcHtmlForModule env mod
104104
-- If found, the local files are used as hints for the hackage links, this helps with symbols defined in an internal module but re-exported by another.
105-
if linkToHackage
106-
then return ( toHackageDocUriText env mod (takeFileName <$> doc)
107-
, toHackageSrcUriText env mod (takeFileName <$> src))
108-
else pure (toFileUriText doc, toFileUriText src)
105+
let
106+
doc_link = case linkTgts.linkDoc of
107+
LinkToHackage ->
108+
toHackageDocUriText env mod (takeFileName <$> doc)
109+
LinkToLocal ->
110+
toFileUriText doc
111+
src_link = case linkTgts.linkSource of
112+
LinkToHackage ->
113+
toHackageSrcUriText env mod (takeFileName <$> src)
114+
LinkToLocal ->
115+
toFileUriText src
116+
pure (doc_link, src_link)
109117
Nothing -> pure (Nothing, Nothing)
110118

111119
let docUri = (<> "#" <> selector <> printOutputable name) <$> docFu

ghcide/src/Development/IDE/Types/Options.hs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ module Development.IDE.Types.Options
1616
, IdeGhcSession(..)
1717
, OptHaddockParse(..)
1818
, ProgressReportingStyle(..)
19+
, LinkTargets(..)
1920
) where
2021

2122
import Control.Lens
@@ -26,7 +27,8 @@ import Development.IDE.GHC.Compat as GHC
2627
import Development.IDE.Graph
2728
import Development.IDE.Types.Diagnostics
2829
import Ide.Plugin.Config
29-
import Ide.Types (DynFlagsModifications)
30+
import Ide.Types (DynFlagsModifications,
31+
OptLinkTo)
3032
import qualified Language.LSP.Protocol.Lens as L
3133
import qualified Language.LSP.Protocol.Types as LSP
3234

@@ -85,8 +87,21 @@ data IdeOptions = IdeOptions
8587
-- ^ Experimental feature to re-run only the subset of the Shake graph that has changed
8688
, optVerifyCoreFile :: Bool
8789
-- ^ Verify core files after serialization
88-
, optLinkToHackage :: Bool
89-
-- ^ `Documentation` and `Source` link to Hackage, rather than local docs.
90+
, optLinkSourceTo :: OptLinkTo
91+
-- ^ `Source` link to Hackage or local sources.
92+
, optLinkDocTo :: OptLinkTo
93+
-- ^ `Documentation` link to Hackage or local docs.
94+
}
95+
96+
data LinkTargets = LinkTargets
97+
{ linkSource :: !OptLinkTo
98+
, linkDoc :: !OptLinkTo
99+
}
100+
101+
linkTargets :: IdeOptions -> LinkTargets
102+
linkTargets IdeOptions{..} = LinkTargets
103+
{ linkSource = optLinkSourceTo
104+
, linkDoc = optLinkDocTo
90105
}
91106

92107
data OptHaddockParse = HaddockParse | NoHaddockParse
@@ -140,7 +155,8 @@ defaultIdeOptions session = IdeOptions
140155
,optRunSubset = True
141156
,optVerifyCoreFile = False
142157
,optMaxDirtyAge = 100
143-
,optLinkToHackage = False
158+
,optLinkSourceTo = LinkToLocal
159+
,optLinkDocTo = LinkToLocal
144160
}
145161

146162
defaultSkipProgress :: Typeable a => a -> Bool

hls-plugin-api/src/Ide/Plugin/Config.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ parseConfig idePlugins defValue = A.withObject "settings" $ \o ->
4343
<*> o .:? "cabalFormattingProvider" .!= cabalFormattingProvider defValue
4444
<*> o .:? "maxCompletions" .!= maxCompletions defValue
4545
<*> o .:? "sessionLoading" .!= sessionLoading defValue
46-
<*> o .:? "linkToHackage" .!= linkToHackage defValue
46+
<*> o .:? "linkSourceTo" .!= linkSourceTo defValue
47+
<*> o .:? "linkDocTo" .!=
48+
linkDocTo defValue
4749
<*> A.explicitParseFieldMaybe (parsePlugins idePlugins) o "plugin" .!= plugins defValue
4850

4951
-- | Parse the 'PluginConfig'.

hls-plugin-api/src/Ide/Types.hs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,8 @@ data Config =
178178
, cabalFormattingProvider :: !T.Text
179179
, maxCompletions :: !Int
180180
, sessionLoading :: !SessionLoadingPreferenceConfig
181-
, linkToHackage :: !Bool
181+
, linkSourceTo :: !OptLinkTo
182+
, linkDocTo :: !OptLinkTo
182183
, plugins :: !(Map.Map PluginId PluginConfig)
183184
} deriving (Show,Eq)
184185

@@ -190,7 +191,8 @@ instance ToJSON Config where
190191
, "cabalFormattingProvider" .= cabalFormattingProvider
191192
, "maxCompletions" .= maxCompletions
192193
, "sessionLoading" .= sessionLoading
193-
, "linkToHackage" .= linkToHackage
194+
, "linkSourceTo" .= linkSourceTo
195+
, "linkDocTo" .= linkDocTo
194196
, "plugin" .= Map.mapKeysMonotonic (\(PluginId p) -> p) plugins
195197
]
196198

@@ -205,7 +207,8 @@ instance Default Config where
205207
-- this string value needs to kept in sync with the value provided in HlsPlugins
206208
, maxCompletions = 40
207209
, sessionLoading = PreferSingleComponentLoading
208-
, linkToHackage = False
210+
, linkSourceTo = LinkToLocal
211+
, linkDocTo = LinkToLocal
209212
, plugins = mempty
210213
}
211214

@@ -219,6 +222,11 @@ data CheckParents
219222
deriving anyclass (FromJSON, ToJSON)
220223

221224

225+
data OptLinkTo = LinkToHackage | LinkToLocal
226+
deriving stock (Eq, Ord, Show, Enum, Generic)
227+
deriving anyclass (FromJSON, ToJSON)
228+
229+
222230
data SessionLoadingPreferenceConfig
223231
= PreferSingleComponentLoading
224232
-- ^ Always load only a singleComponent when a new component

0 commit comments

Comments
 (0)