13
13
{-# LANGUAGE ScopedTypeVariables #-}
14
14
{-# LANGUAGE TupleSections #-}
15
15
{-# LANGUAGE TypeFamilies #-}
16
- {-# LANGUAGE ViewPatterns #-}
17
16
18
17
-- |
19
18
-- This module provides the core functionality of the plugin.
@@ -28,24 +27,22 @@ import qualified Data.Map as Map
28
27
import Data.Maybe (listToMaybe , mapMaybe )
29
28
import qualified Data.Text as T
30
29
import Development.IDE (Action ,
30
+ GetDocMap (GetDocMap ),
31
31
GetHieAst (GetHieAst ),
32
- GhcSessionDeps (GhcSessionDeps ),
33
32
HieAstResult (HAR , hieAst , hieModule , refMap ),
34
33
IdeState , Priority (.. ),
35
34
Recorder , Rules ,
36
35
WithPriority ,
37
- catchSrcErrors ,
38
36
cmapWithPrio , define ,
39
37
hieKind , ideLogger ,
40
38
logPriority , use_ )
41
- import Development.IDE.Core.Compile (lookupName )
42
39
import Development.IDE.Core.PluginUtils (runActionE ,
43
40
useWithStaleE )
44
41
import Development.IDE.Core.PositionMapping (idDelta , toCurrentRange )
45
42
import Development.IDE.Core.Rules (Log (LogShake ))
43
+ import Development.IDE.Core.RuleTypes (DocAndKindMap (.. ))
46
44
import Development.IDE.Core.Shake (addPersistentRule )
47
45
import Development.IDE.GHC.Compat
48
- import Development.IDE.Types.HscEnvEq (hscEnv )
49
46
import Ide.Plugin.Error (PluginError (PluginInternalError ),
50
47
getNormalizedFilePathE )
51
48
import Ide.Plugin.SemanticTokens.Mappings
@@ -93,30 +90,33 @@ semanticTokensFull state _ param = do
93
90
getSemanticTokensRule :: Recorder (WithPriority Log ) -> Rules ()
94
91
getSemanticTokensRule recorder =
95
92
define (cmapWithPrio LogShake recorder) $ \ GetSemanticTokens nfp -> do
96
- (hscEnv -> hsc) <- use_ GhcSessionDeps nfp
93
+ -- (hscEnv -> hsc) <- use_ GhcSessionDeps nfp
97
94
(HAR {.. }) <- use_ GetHieAst nfp
95
+ (DKMap {getKindMap}) <- use_ GetDocMap nfp
98
96
Just (_, ast) <- return $ listToMaybe $ Map. toList $ getAsts hieAst
99
97
-- get current location from the old ones
100
98
let spanNamesMap = hieAstSpanNames ast
101
99
let names = nameSetElemsStable $ unionNameSets $ Map. elems spanNamesMap
102
100
let localSemanticMap = mkLocalNameSemanticFromAst names (hieKindFunMasksKind hieKind) refMap
103
101
-- get imported name semantic map
104
102
-- liftIO $ putStrLn $ unlines $ fmap showClearName $ nameSetElemsStable nameSet
105
- importedNameSemanticMap <- liftIO $ foldrM (getTypeExclude localSemanticMap hsc ) emptyNameEnv names
103
+ let importedNameSemanticMap = foldr (getTypeExclude localSemanticMap getKindMap ) emptyNameEnv names
106
104
-- let importedNameSemanticMap = computeImportedNameSemanticMap $ nameSetElemsStable nameSet
107
105
let sMap = plusNameEnv_C (<>) importedNameSemanticMap localSemanticMap
108
106
let rangeTokenType = extractSemanticTokensFromNames sMap spanNamesMap
109
107
return ([] , Just $ RangeHsSemanticTokenTypes rangeTokenType)
110
108
where
111
109
-- ignore one already in discovered in local
112
- getTypeExclude localEnv env n nameMap
113
- | n `elemNameEnv` localEnv = pure nameMap
110
+ getTypeExclude :: NameEnv a
111
+ -> NameEnv TyThing
112
+ -> Name
113
+ -> NameEnv HsSemanticTokenType
114
+ -> NameEnv HsSemanticTokenType
115
+ getTypeExclude localEnv kindMap n nameMap
116
+ | n `elemNameEnv` localEnv = nameMap
114
117
| otherwise =
115
- do
116
- tyThing <- lookupImported env n
117
- pure $ maybe nameMap (extendNameEnv nameMap n) (tyThing >>= tyThingSemantic)
118
- lookupImported :: HscEnv -> Name -> IO (Maybe TyThing )
119
- lookupImported env = fmap (fromRight Nothing ) . catchSrcErrors (hsc_dflags env) " span" . lookupName env
118
+ let tyThing = lookupNameEnv kindMap n in
119
+ maybe nameMap (extendNameEnv nameMap n) (tyThing >>= tyThingSemantic)
120
120
121
121
-- | Persistent rule to ensure that semantic tokens doesn't block on startup
122
122
persistentGetSemanticTokensRule :: Rules ()
0 commit comments