-
Notifications
You must be signed in to change notification settings - Fork 32
Expand file tree
/
Copy pathCodeActions.hs
More file actions
78 lines (73 loc) · 3.24 KB
/
Copy pathCodeActions.hs
File metadata and controls
78 lines (73 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# OPTIONS_GHC -Wno-name-shadowing #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
module StaticLS.IDE.CodeActions where
import Control.Error (mapMaybe)
import Control.Monad (join)
import Data.LineCol (LineCol (..))
import Data.Path (AbsPath)
import Data.Rope qualified as Rope
import Data.Set qualified as S
import Language.LSP.Protocol.Types qualified as LSP
import StaticLS.IDE.CodeActions.AddRequiredExtension qualified as AddRequiredExtension
import StaticLS.IDE.CodeActions.AddTypeSig qualified as AddTypeSig
import StaticLS.IDE.CodeActions.AutoImport qualified as AutoImport
import StaticLS.IDE.CodeActions.InsertAssociatedType qualified as InsertAssociatedType
import StaticLS.IDE.CodeActions.InsertCases qualified as InsertCases
import StaticLS.IDE.CodeActions.InsertFields qualified as InsertFields
import StaticLS.IDE.CodeActions.InsertMissingMethods qualified as InsertMissingMethods
import StaticLS.IDE.CodeActions.Parse qualified as Parse
import StaticLS.IDE.CodeActions.RemoveRedundantImports qualified as RemoveRedundantImports
import StaticLS.IDE.CodeActions.Types
import StaticLS.IDE.CodeActions.UseValidHoleFit qualified as UseValidHoleFit
import StaticLS.IDE.Monad
import StaticLS.IDE.SourceEdit (SourceEdit)
import StaticLS.IDE.SourceEdit qualified as SourceEdit
import StaticLS.Monad (StaticLsM)
import StaticLS.ProtoLSP (assistToCodeAction)
getCodeActions ::
LSP.TextDocumentIdentifier ->
LSP.CodeActionContext ->
AbsPath ->
LineCol ->
StaticLsM [LSP.CodeAction]
getCodeActions tdi ctx path lineCol = do
rope <- getSourceRope path
let pos = Rope.lineColToPos rope lineCol
let cx = CodeActionContext {path, pos, lineCol}
typesCodeActions <- AddTypeSig.codeAction cx
importCodeActions <- AutoImport.codeAction cx
removeRedundantImports <- RemoveRedundantImports.codeAction cx
let issues = S.fromList (mapMaybe Parse.actionableIssue ctx._diagnostics)
issueActions <- join <$> traverse (issueToActions tdi) (S.toList issues)
assistActions <-
traverse assistToCodeAction $
typesCodeActions
++ importCodeActions
++ removeRedundantImports
pure $ assistActions ++ issueActions
resolveLazyAssist :: CodeActionMessage -> StaticLsM SourceEdit
resolveLazyAssist (CodeActionMessage {kind, path}) = do
case kind of
AutoImportActionMessage toImport -> AutoImport.resolveLazy path toImport
NoMessage -> do
pure SourceEdit.empty
issueToActions ::
LSP.TextDocumentIdentifier ->
Parse.ActionableIssue ->
StaticLsM [LSP.CodeAction]
issueToActions tdi issue =
case issue of
Parse.MissingMethods (Parse.Ignored diag) methods ->
pure [InsertMissingMethods.codeAction tdi diag methods]
Parse.MissingAssociatedType (Parse.Ignored diag) ty ->
pure [InsertAssociatedType.codeAction tdi diag ty]
Parse.MissingFields (Parse.Ignored diag) ctor ext flds ->
pure [InsertFields.codeAction tdi diag ctor ext flds]
Parse.MissingCasses (Parse.Ignored diag) pats ->
pure [InsertCases.codeAction tdi diag pats]
Parse.RequiredExtension (Parse.Ignored diag) ext ->
pure [AddRequiredExtension.codeAction tdi diag ext]
Parse.TypedHoleFits (Parse.Ignored diag) fits ->
pure $ UseValidHoleFit.codeAction tdi diag <$> fits