never executed always true always false
1 module Conjure.LSP.Handlers.SemanticTokens where
2
3 import Conjure.LSP.Util (ProcessedFile (ProcessedFile), sendErrorMessage, sourcePosToPosition, withProcessedDoc)
4 import Conjure.Language.Lexer (ETok (..), Offsets (..), trueLength)
5 import Conjure.Language.Validator (TagType (..), TaggedToken (TaggedToken), ValidatorState (symbolCategories))
6 import Conjure.Prelude
7 import Control.Lens
8 import Data.Map qualified as M
9 import Language.LSP.Protocol.Lens (HasParams (..), HasTextDocument (..))
10 import Language.LSP.Protocol.Message
11 import Language.LSP.Protocol.Types
12 import Language.LSP.Server (Handlers, LspM, requestHandler)
13
14 semanticTokensHandler :: Handlers (LspM ())
15 semanticTokensHandler = semanticTokensHandlerFull
16
17 semanticTokensHandlerFull :: Handlers (LspM ())
18 semanticTokensHandlerFull = requestHandler SMethod_TextDocumentSemanticTokensFull $ \req res -> do
19 let ps = req ^. params . textDocument
20 withProcessedDoc ps $ \(ProcessedFile _ _ (symbolCategories -> ts) _) -> do
21 let toks = mapMaybe createSemanticToken (sortOn (\(TaggedToken _ (oTrueStart . offsets -> e)) -> e) $ M.elems ts)
22 let sToks = makeSemanticTokens defaultSemanticTokensLegend toks
23 r <- case sToks of
24 Left txt -> sendErrorMessage txt >> return (Right $ InR Null)
25 Right st -> return . Right . InL $ st
26 res r
27
28 createSemanticToken :: TaggedToken -> Maybe SemanticTokenAbsolute
29 createSemanticToken (TaggedToken tt tok) =
30 uncurry (SemanticTokenAbsolute ln col len) <$> symbolType tt
31 where
32 Position ln col = sourcePosToPosition (oSourcePos . offsets $ tok)
33 len = fromInteger . toInteger . trueLength $ tok
34 symbolType :: TagType -> Maybe (SemanticTokenTypes, [SemanticTokenModifiers])
35 symbolType s = case s of
36 TtType -> Just (SemanticTokenTypes_Type, [SemanticTokenModifiers_DefaultLibrary])
37 TtNumber -> Just (SemanticTokenTypes_Number, [])
38 TtBool -> Just (SemanticTokenTypes_Regexp, [])
39 TtDomain -> Just (SemanticTokenTypes_Class, [SemanticTokenModifiers_Abstract])
40 TtEnum -> Just (SemanticTokenTypes_Enum, [SemanticTokenModifiers_Abstract])
41 TtEnumMember -> Just (SemanticTokenTypes_EnumMember, [])
42 TtRecord -> Just (SemanticTokenTypes_Struct, [])
43 TtRecordMember -> Just (SemanticTokenTypes_Property, [SemanticTokenModifiers_Readonly])
44 TtUserFunction -> Just (SemanticTokenTypes_Function, [])
45 TtFunction -> Just (SemanticTokenTypes_Function, [SemanticTokenModifiers_DefaultLibrary])
46 TtAttribute -> Just (SemanticTokenTypes_Variable, [SemanticTokenModifiers_Readonly])
47 TtAAC -> Just (SemanticTokenTypes_Interface, [])
48 TtVariable -> Just (SemanticTokenTypes_Variable, [])
49 TtKeyword -> Just (SemanticTokenTypes_Keyword, [])
50 TtQuantifier -> Just (SemanticTokenTypes_Macro, [])
51 TtSubKeyword -> Just (SemanticTokenTypes_Modifier, [])
52 TtOperator -> Just (SemanticTokenTypes_Operator, [])
53 TtLocal -> Just (SemanticTokenTypes_Parameter, [])
54 TtOther _ -> Nothing