@@ -9,63 +9,56 @@ module Ide.Plugin.CabalProject where
99
1010import Control.Concurrent.Strict
1111import Control.DeepSeq
12- import Control.Lens ((^.) )
12+ import Control.Lens ((^.) )
1313import Control.Monad.Extra
1414import Control.Monad.IO.Class
15- import Control.Monad.Trans.Class (lift )
16- import Control.Monad.Trans.Maybe (runMaybeT )
17- import qualified Data.ByteString as BS
15+ import Control.Monad.Trans.Class (lift )
16+ import Control.Monad.Trans.Maybe (runMaybeT )
17+ import qualified Data.ByteString as BS
1818import Data.Hashable
19- import Data.HashMap.Strict (HashMap ,
20- toList )
21- import qualified Data.HashMap.Strict as HashMap
22- import qualified Data.List as List
23- import qualified Data.List.NonEmpty as NE
24- import qualified Data.Maybe as Maybe
19+ import Data.HashMap.Strict (HashMap , toList )
20+ import qualified Data.HashMap.Strict as HashMap
21+ import qualified Data.List as List
22+ import qualified Data.List.NonEmpty as NE
23+ import qualified Data.Maybe as Maybe
2524import Data.Proxy
26- import qualified Data.Text ()
27- import qualified Data.Text as T
28- import qualified Data.Text.Encoding as Encoding
29- import Data.Text.Utf16.Rope.Mixed as Rope
30- import Development.IDE as D
31- import Development.IDE.Core.FileStore (getVersionedTextDoc )
25+ import qualified Data.Text ()
26+ import qualified Data.Text as T
27+ import qualified Data.Text.Encoding as Encoding
28+ import Data.Text.Utf16.Rope.Mixed as Rope
29+ import Development.IDE as D
30+ import Development.IDE.Core.FileStore (getVersionedTextDoc )
3231import Development.IDE.Core.PluginUtils
33- import Development.IDE.Core.Shake (restartShakeSession )
34- import qualified Development.IDE.Core.Shake as Shake
35- import Development.IDE.Graph (Key ,
36- alwaysRerun )
37- import Development.IDE.LSP.HoverDefinition (foundHover )
38- import qualified Development.IDE.Plugin.Completions.Logic as Ghcide
39- import Development.IDE.Types.Shake (toKey )
40- import qualified Distribution.CabalSpecVersion as Cabal
41- import qualified Distribution.Fields as Syntax
42- import Distribution.Package (Dependency )
43- import Distribution.PackageDescription (allBuildDepends ,
44- depPkgName ,
45- unPackageName )
46- import Distribution.PackageDescription.Configuration (flattenPackageDescription )
32+ import Development.IDE.Core.Shake (restartShakeSession )
33+ import qualified Development.IDE.Core.Shake as Shake
34+ import Development.IDE.Graph (Key ,
35+ alwaysRerun )
36+ import Development.IDE.LSP.HoverDefinition (foundHover )
37+ import qualified Development.IDE.Plugin.Completions.Logic as Ghcide
38+ import Development.IDE.Types.Shake (toKey )
39+ import qualified Distribution.CabalSpecVersion as Cabal
40+ import qualified Distribution.Fields as Syntax
41+ import Distribution.Package (Dependency )
42+ import Distribution.PackageDescription (allBuildDepends ,
43+ depPkgName ,
44+ unPackageName )
45+ import Distribution.PackageDescription.Configuration (flattenPackageDescription )
4746import Distribution.Parsec.Error
48- import qualified Distribution.Parsec.Position as Syntax
47+ import qualified Distribution.Parsec.Position as Syntax
4948import GHC.Generics
50- import Ide.Plugin.Cabal.Completion.CabalFields as CabalFields
51- import qualified Ide.Plugin.Cabal.Completion.Completer.Types as CompleterTypes
52- import qualified Ide.Plugin.Cabal.Completion.Data as Data
53- import qualified Ide.Plugin.Cabal.Completion.Types as CTypes
54- import Ide.Plugin.Cabal.Orphans ()
55- import qualified Ide.Plugin.CabalProject.Completion.Completions as Completions
56- import Ide.Plugin.CabalProject.Diagnostics as Diagnostics
57- import Ide.Plugin.CabalProject.Parse as Parse
58- import Ide.Plugin.CabalProject.Types as Types
49+ import Ide.Plugin.Cabal.Orphans ()
50+ import Ide.Plugin.CabalProject.Diagnostics as Diagnostics
51+ import Ide.Plugin.CabalProject.Parse as Parse
52+ import Ide.Plugin.CabalProject.Types as Types
5953import Ide.Plugin.Error
6054import Ide.Types
61- import qualified Language.LSP.Protocol.Lens as JL
62- import qualified Language.LSP.Protocol.Message as LSP
55+ import qualified Language.LSP.Protocol.Lens as JL
56+ import qualified Language.LSP.Protocol.Message as LSP
6357import Language.LSP.Protocol.Types
64- import qualified Language.LSP.VFS as VFS
65- import System.FilePath (takeFileName )
58+ import qualified Language.LSP.VFS as VFS
59+ import System.FilePath (takeFileName )
6660import Text.Regex.TDFA
6761
68-
6962data Log
7063 = LogModificationTime NormalizedFilePath FileVersion
7164 | LogShake Shake. Log
@@ -74,8 +67,6 @@ data Log
7467 | LogDocSaved Uri
7568 | LogDocClosed Uri
7669 | LogFOI (HashMap NormalizedFilePath FileOfInterestStatus )
77- | LogCompletionContext CTypes. Context Position
78- | LogCompletions CTypes. Log
7970 deriving (Show )
8071
8172instance Pretty Log where
@@ -100,9 +91,7 @@ descriptor recorder plId =
10091 { pluginRules = cabalProjectRules recorder plId
10192 , pluginHandlers =
10293 mconcat
103- [
104- mkPluginHandler LSP. SMethod_TextDocumentCompletion $ completion recorder
105- ]
94+ []
10695 , pluginNotificationHandlers =
10796 mconcat
10897 [ mkPluginNotificationHandler LSP. SMethod_TextDocumentDidOpen $
@@ -304,49 +293,3 @@ deleteFileOfInterest recorder state f = do
304293 return [toKey IsFileOfInterest f]
305294 where
306295 log' = logWith recorder
307-
308- -- ----------------------------------------------------------------
309- -- Completion
310- -- ----------------------------------------------------------------
311-
312- completion :: Recorder (WithPriority Log ) -> PluginMethodHandler IdeState 'LSP.Method_TextDocumentCompletion
313- completion recorder ide _ complParams = do
314- let TextDocumentIdentifier uri = complParams ^. JL. textDocument
315- position = complParams ^. JL. position
316- mContents <- liftIO $ runAction " cabal-project-plugin.getUriContents" ide $ getUriContents $ toNormalizedUri uri
317- case (,) <$> mContents <*> uriToFilePath' uri of
318- Just (cnts, path) -> do
319- -- We decide on `useWithStale` here, since `useWithStaleFast` often leads to the wrong completions being suggested.
320- -- In case it fails, we still will get some completion results instead of an error.
321- mFields <- liftIO $ runAction " cabal-project-plugin.fields" ide $ useWithStale ParseCabalProjectFields $ toNormalizedFilePath path
322- case mFields of
323- Nothing ->
324- pure . InR $ InR Null
325- Just (fields, _) -> do
326- let lspPrefInfo = Ghcide. getCompletionPrefixFromRope position cnts
327- cabalPrefInfo = Completions. getCabalPrefixInfo path lspPrefInfo
328- let res = computeCompletionsAt recorder ide cabalPrefInfo path fields
329- liftIO $ fmap InL res
330- Nothing -> pure . InR $ InR Null
331-
332- computeCompletionsAt :: Recorder (WithPriority Log ) -> IdeState -> CTypes. CabalPrefixInfo -> FilePath -> [Syntax. Field Syntax. Position ] -> IO [CompletionItem ]
333- computeCompletionsAt recorder ide prefInfo fp fields = do
334- runMaybeT (context fields) >>= \ case
335- Nothing -> pure []
336- Just ctx -> do
337- logWith recorder Debug $ LogCompletionContext ctx pos
338- let completer = Completions. contextToCompleter ctx
339- let completerData = CompleterTypes. CompleterData
340- {
341- cabalPrefixInfo = prefInfo
342- , stanzaName =
343- case fst ctx of
344- CTypes. Stanza _ name -> name
345- _ -> Nothing
346- }
347- completions <- completer completerRecorder completerData
348- pure completions
349- where
350- pos = CTypes. completionCursorPosition prefInfo
351- context fields = Completions. getContext completerRecorder prefInfo fields
352- completerRecorder = cmapWithPrio LogCompletions recorder
0 commit comments