dhall-lsp-server 1.0.8 → 1.0.9
raw patch · 17 files changed
+310/−213 lines, 17 filesdep ~basedep ~dhalldep ~prettyprinter
Dependency ranges changed: base, dhall, prettyprinter
Files
- app/Main.hs +5/−5
- dhall-lsp-server.cabal +6/−10
- doctest/Main.hs +0/−1
- src/Dhall/LSP/Backend/Completion.hs +30/−30
- src/Dhall/LSP/Backend/Dhall.hs +24/−20
- src/Dhall/LSP/Backend/Diagnostics.hs +11/−8
- src/Dhall/LSP/Backend/Formatting.hs +8/−9
- src/Dhall/LSP/Backend/Freezing.hs +28/−11
- src/Dhall/LSP/Backend/Linting.hs +11/−7
- src/Dhall/LSP/Backend/Parsing.hs +24/−13
- src/Dhall/LSP/Backend/ToJSON.hs +5/−6
- src/Dhall/LSP/Backend/Typing.hs +26/−13
- src/Dhall/LSP/Handlers.hs +74/−39
- src/Dhall/LSP/Server.hs +22/−15
- src/Dhall/LSP/State.hs +21/−12
- src/Dhall/LSP/Util.hs +1/−1
- tests/Main.hs +14/−13
app/Main.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE RecordWildCards #-} {-| This module contains the top-level entrypoint and options parsing for the @dhall-lsp-server@ executable -}@@ -7,15 +8,14 @@ ) where -import Options.Applicative (Parser, ParserInfo)-import qualified Options.Applicative import Control.Applicative ((<|>))-import Data.Monoid ((<>))+import Options.Applicative (Parser, ParserInfo) import qualified Data.Version import qualified Dhall.LSP.Server-import qualified Paths_dhall_lsp_server import qualified GHC.IO.Encoding+import qualified Options.Applicative+import qualified Paths_dhall_lsp_server -- | Top-level program options data Options = Options {@@ -64,7 +64,7 @@ ) runCommand :: Options -> IO ()-runCommand Options {..} = do+runCommand Options {..} = if version then printVersion else case command of
dhall-lsp-server.cabal view
@@ -1,8 +1,8 @@ name: dhall-lsp-server-Version: 1.0.8+Version: 1.0.9 cabal-version: 1.12 synopsis: Language Server Protocol (LSP) server for Dhall-homepage: https://github.com/dhall-lang/dhall-haskell/dhall-lsp-server#readme+homepage: https://github.com/dhall-lang/dhall-haskell/tree/master/dhall-lsp-server#readme bug-reports: https://github.com/dhall-lang/dhall-haskell/issues author: panaeon maintainer: Gabriel Gonzalez@@ -50,7 +50,7 @@ , containers >= 0.5.11.0 && < 0.7 , data-default >= 0.7.1.1 && < 0.8 , directory >= 1.2.2.0 && < 1.4- , dhall >= 1.29.0 && < 1.34+ , dhall >= 1.29.0 && < 1.35 , dhall-json >= 1.4 && < 1.8 , filepath >= 1.4.2 && < 1.5 , haskell-lsp >= 0.19.0.0 && < 0.23@@ -61,17 +61,14 @@ , megaparsec >= 7.0.2 && < 8.1 , mtl >= 2.2.2 && < 2.3 , network-uri >= 2.6.1.0 && < 2.7- , prettyprinter >= 1.5.1 && < 1.7+ , prettyprinter >= 1.5.1 && < 1.8 , text >= 1.2.3.0 && < 1.3 , transformers >= 0.5.5.0 && < 0.6 , unordered-containers >= 0.2.9.0 && < 0.3 , uri-encode >= 1.5.0.5 && < 1.6 default-language: Haskell2010 GHC-Options: -Wall -fwarn-incomplete-uni-patterns- if impl(eta)- buildable: False - executable dhall-lsp-server main-is: Main.hs other-modules:@@ -81,13 +78,11 @@ default-extensions: RecordWildCards OverloadedStrings ghc-options: -rtsopts build-depends:- base >=4.7 && <5+ base , dhall-lsp-server , optparse-applicative default-language: Haskell2010 GHC-Options: -Wall -fwarn-incomplete-uni-patterns- if impl(eta)- buildable: False Test-Suite doctest Type: exitcode-stdio-1.0@@ -115,4 +110,5 @@ tasty >= 0.11.2 && < 1.4 , tasty-hspec >= 1.1 && < 1.2 , text >= 0.11 && < 1.3+ Build-Tool-Depends: dhall-lsp-server:dhall-lsp-server Default-Language: Haskell2010
doctest/Main.hs view
@@ -1,6 +1,5 @@ module Main where -import Data.Monoid ((<>)) import System.FilePath ((</>)) import qualified GHC.IO.Encoding
src/Dhall/LSP/Backend/Completion.hs view
@@ -1,32 +1,32 @@ module Dhall.LSP.Backend.Completion where -import Data.List (foldl')-import Data.Text (Text)-import Data.Void (Void, absurd)-import Dhall.Context (Context, insert)-import Dhall.Context (empty, toList)+import Data.List (foldl')+import Data.Text (Text)+import Data.Void (Void, absurd)+import Dhall.Context (Context, empty, insert, toList) import Dhall.LSP.Backend.Diagnostics (Position, positionToOffset)-import Dhall.LSP.Backend.Parsing (holeExpr)-import Dhall.Parser (Src, exprFromText)-import Dhall.TypeCheck (typeWithA, typeOf)-import System.Directory (doesDirectoryExist, listDirectory)-import System.Environment (getEnvironment)-import System.FilePath (takeDirectory, (</>))-import System.Timeout (timeout)+import Dhall.LSP.Backend.Parsing (holeExpr)+import Dhall.Parser (Src, exprFromText)+import Dhall.TypeCheck (typeOf, typeWithA)+import System.Directory (doesDirectoryExist, listDirectory)+import System.Environment (getEnvironment)+import System.FilePath (takeDirectory, (</>))+import System.Timeout (timeout) import Dhall.Core- ( Binding(..)- , Expr(..)- , Var(..)+ ( Binding (..)+ , Expr (..)+ , RecordField (..)+ , Var (..) , normalize- , shift- , subst , pretty , reservedIdentifiers+ , shift+ , subst ) import qualified Data.HashSet as HashSet-import qualified Data.Text as Text+import qualified Data.Text as Text import qualified Dhall.Map import qualified Dhall.Pretty @@ -42,7 +42,7 @@ breakEnd p = (\(l,r) -> (Text.reverse l, Text.reverse r)) . Text.break p . Text.reverse (completionPrefix, completionLeadup) =- breakEnd (`elem` (" \t\n[(,=+*&|}#?>" :: [Char])) text'+ breakEnd (`elem` (" \t\n[(,=+*&|}#?>" :: String)) text' -- | A completion result, optionally annotated with type information. data Completion =@@ -101,8 +101,8 @@ a' = normalize a e' = subst (V x 0) a' e - context' = fmap (shift 1 (V x 0)) $ insert x _A' context- values' = fmap (shift 1 (V x 0)) $ insert x a' values+ context' = shift 1 (V x 0) <$> insert x _A' context+ values' = shift 1 (V x 0) <$> insert x a' values in buildCompletionContext' context' values' e' @@ -111,15 +111,15 @@ , Right _ <- typeWithA absurd context _A = let _A' = normalize _A - context' = fmap (shift 1 (V x 0)) $ insert x _A' context- values' = fmap (shift 1 (V x 0)) $ insert x holeExpr values+ context' = shift 1 (V x 0) <$> insert x _A' context+ values' = shift 1 (V x 0) <$> insert x holeExpr values in buildCompletionContext' context' values' e -- if nothing works, only remember the name (but bind to `holeExpr`) | otherwise =- let context' = fmap (shift 1 (V x 0)) $ insert x holeExpr context- values' = fmap (shift 1 (V x 0)) $ insert x holeExpr values+ let context' = shift 1 (V x 0) <$> insert x holeExpr context+ values' = shift 1 (V x 0) <$> insert x holeExpr values in buildCompletionContext' context' values' e @@ -127,8 +127,8 @@ let _A' | Right _ <- typeWithA absurd context _A = normalize _A | otherwise = holeExpr - context' = fmap (shift 1 (V x 0)) $ insert x _A' context- values' = fmap (shift 1 (V x 0)) $ insert x holeExpr values+ context' = shift 1 (V x 0) <$> insert x _A' context+ values' = shift 1 (V x 0) <$> insert x holeExpr values in buildCompletionContext' context' values' b @@ -136,8 +136,8 @@ let _A' | Right _ <- typeWithA absurd context _A = normalize _A | otherwise = holeExpr - context' = fmap (shift 1 (V x 0)) $ insert x _A' context- values' = fmap (shift 1 (V x 0)) $ insert x holeExpr values+ context' = shift 1 (V x 0) <$> insert x _A' context+ values' = shift 1 (V x 0) <$> insert x holeExpr values in buildCompletionContext' context' values' b @@ -193,7 +193,7 @@ -- complete a record projection by inspecting the record type- completeRecord (Record m) = map toCompletion (Dhall.Map.toList m)+ completeRecord (Record m) = map toCompletion (Dhall.Map.toList $ recordFieldValue <$> m) where toCompletion (name, typ) = Completion (Dhall.Pretty.escapeLabel True name) (Just typ)
src/Dhall/LSP/Backend/Dhall.hs view
@@ -18,31 +18,35 @@ normalize ) where +import Dhall.Core (Expr) import Dhall.Parser (Src)-import Dhall.Core (Expr) -import qualified Dhall.Core as Dhall-import qualified Dhall.Import as Dhall-import qualified Dhall.Parser as Dhall-import qualified Dhall.TypeCheck as Dhall+import Control.Exception (SomeException, catch)+import Control.Monad.Trans.State.Strict (runStateT)+import Data.Bifunctor (first)+import Data.List.NonEmpty (NonEmpty ((:|)))+import Data.Text (Text)+import Data.Void (Void)+import Lens.Family (set, view)+import Network.URI (URI)+import System.FilePath+ ( splitDirectories+ , takeDirectory+ , takeFileName+ ) -import qualified Data.Graph as Graph-import qualified Data.Map.Strict as Map-import qualified Data.Set as Set+import qualified Data.Graph as Graph+import qualified Data.Map.Strict as Map+import qualified Data.Set as Set+import qualified Data.Text as Text+import qualified Dhall.Core as Dhall+import qualified Dhall.Import as Dhall import qualified Dhall.Map-import qualified Network.URI as URI+import qualified Dhall.Parser as Dhall+import qualified Dhall.TypeCheck as Dhall import qualified Language.Haskell.LSP.Types as LSP.Types-import qualified Data.Text as Text+import qualified Network.URI as URI -import Data.List.NonEmpty (NonEmpty((:|)))-import Data.Text (Text)-import Data.Void (Void)-import System.FilePath (splitDirectories, takeFileName, takeDirectory)-import Lens.Family (view, set)-import Control.Exception (SomeException, catch)-import Control.Monad.Trans.State.Strict (runStateT)-import Network.URI (URI)-import Data.Bifunctor (first) -- | A @FileIdentifier@ represents either a local file or a remote url. newtype FileIdentifier = FileIdentifier Dhall.Chained@@ -104,7 +108,7 @@ -- compute the reverse dependencies, i.e. the imports reachable in the transposed graph reachableImports import_ =- map (\(i,_,_) -> i) . map importFromVertex . concat $+ (map ((\ (i, _, _) -> i) . importFromVertex) . concat) $ do vertex <- vertexFromImport import_ return (Graph.reachable graph vertex)
src/Dhall/LSP/Backend/Diagnostics.hs view
@@ -16,22 +16,25 @@ ) where -import Dhall.Parser (SourcedException(..), Src(..), unwrap)-import Dhall.TypeCheck (DetailedTypeError(..), ErrorMessages(..), TypeError(..))-import Dhall.Core (Expr(Note, Embed), subExpressions)+import Dhall.Core (Expr (Embed, Note), subExpressions)+import Dhall.Parser (SourcedException (..), Src (..), unwrap)+import Dhall.TypeCheck+ ( DetailedTypeError (..)+ , ErrorMessages (..)+ , TypeError (..)+ ) -import Dhall.LSP.Util import Dhall.LSP.Backend.Dhall import Dhall.LSP.Backend.Parsing (getImportLink)+import Dhall.LSP.Util -import Control.Lens (toListOf)+import Control.Lens (toListOf) import Control.Monad.Trans.Writer (Writer, execWriter, tell)-import Data.Monoid ((<>))-import Data.Text (Text)+import Data.Text (Text) +import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Text as Text import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty.Text-import qualified Data.List.NonEmpty as NonEmpty import qualified Dhall.Pretty import qualified Dhall.TypeCheck as TypeCheck import qualified Text.Megaparsec as Megaparsec
src/Dhall/LSP/Backend/Formatting.hs view
@@ -1,15 +1,14 @@ module Dhall.LSP.Backend.Formatting (formatExpr, formatExprWithHeader) where -import Dhall.Core (Expr)-import Dhall.Pretty (CharacterSet(..))-import Dhall.Parser (Header(..))-import qualified Dhall.Pretty-import Dhall.Src (Src)+import Data.Text (Text)+import Dhall.Core (Expr)+import Dhall.Parser (Header (..))+import Dhall.Pretty (CharacterSet (..))+import Dhall.Src (Src) -import Data.Monoid ((<>))-import Data.Text (Text)-import qualified Data.Text.Prettyprint.Doc as Pretty-import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty+import qualified Data.Text.Prettyprint.Doc as Pretty+import qualified Data.Text.Prettyprint.Doc.Render.Text as Pretty+import qualified Dhall.Pretty -- | Pretty-print the given Dhall expression. formatExpr :: Pretty.Pretty b => CharacterSet -> Expr Src b -> Text
src/Dhall/LSP/Backend/Freezing.hs view
@@ -5,18 +5,35 @@ stripHash ) where -import Dhall.Parser (Src(..))-import Dhall.Core (Expr(..), Import(..), ImportHashed(..), subExpressions)+import Control.Lens (universeOf)+import Data.Text (Text)+import Dhall.Core+ ( Expr (..)+ , Import (..)+ , ImportHashed (..)+ , subExpressions+ )+import Dhall.LSP.Backend.Dhall+ ( Cache+ , DhallError+ , FileIdentifier+ , hashNormalToCode+ , load+ , normalize+ , typecheck+ )+import Dhall.LSP.Backend.Diagnostics+ ( Range (..)+ , positionFromMegaparsec+ , positionToOffset+ , rangeFromDhall+ , subtractPosition+ )+import Dhall.LSP.Backend.Parsing (getImportHash)+import Dhall.Parser (Src (..)) -import Control.Lens (universeOf)-import Data.Text (Text)-import qualified Data.Text as Text -import Dhall.LSP.Backend.Dhall (FileIdentifier, Cache, DhallError, typecheck,- normalize, hashNormalToCode, load)-import Dhall.LSP.Backend.Diagnostics (Range(..), rangeFromDhall,- positionFromMegaparsec, positionToOffset, subtractPosition)-import Dhall.LSP.Backend.Parsing (getImportHash)+import qualified Data.Text as Text -- | Given an expression (potentially still containing imports) compute its -- 'semantic' hash in the textual representation used to freeze Dhall imports.@@ -28,7 +45,7 @@ Left err -> return (Left err) Right (cache', expr') -> case typecheck expr' of Left err -> return (Left err)- Right (wt,_) -> do+ Right (wt,_) -> return (Right (cache', hashNormalToCode (normalize wt))) stripHash :: Import -> Import
src/Dhall/LSP/Backend/Linting.hs view
@@ -7,18 +7,22 @@ ) where -import Control.Lens (universeOf)-import Data.Maybe (maybeToList)-import Data.Monoid ((<>))-import Data.Text (Text)+import Control.Lens (universeOf)+import Data.Maybe (maybeToList)+import Data.Text (Text)+import Dhall.Core+ ( Binding (..)+ , Expr (..)+ , Import+ , MultiLet (..)+ ) import Dhall.LSP.Backend.Diagnostics-import Dhall.Parser (Src)-import Dhall.Core (Expr(..), Binding(..), MultiLet(..), Import)+import Dhall.Parser (Src) +import qualified Data.List.NonEmpty as NonEmpty import qualified Data.Maybe as Maybe import qualified Dhall.Core as Core import qualified Dhall.Lint as Lint-import qualified Data.List.NonEmpty as NonEmpty data Suggestion = Suggestion { range :: Range,
src/Dhall/LSP/Backend/Parsing.hs view
@@ -11,18 +11,29 @@ ) where -import Data.Text (Text)-import Dhall.Core (Binding(..), Expr(..), Import, Var(..))-import Dhall.Src (Src(..))+import Control.Applicative (optional, (<|>))+import Data.Text (Text)+import Dhall.Core (Binding (..), Expr (..), Import, Var (..)) import Dhall.Parser-import Dhall.Parser.Token hiding (text)-import Dhall.Parser.Expression (getSourcePos, importType_, importHash_, localOnly)-import Text.Megaparsec (try, skipManyTill, lookAhead, anySingle,- notFollowedBy, eof, takeRest)+import Dhall.Parser.Expression+ ( getSourcePos+ , importHash_+ , importType_+ , localOnly+ )+import Dhall.Parser.Token hiding (text)+import Text.Megaparsec+ ( anySingle+ , eof+ , lookAhead+ , notFollowedBy+ , skipManyTill+ , takeRest+ , try+ )+import Text.Megaparsec (SourcePos (..)) -import Control.Applicative (optional, (<|>)) import qualified Text.Megaparsec as Megaparsec-import Text.Megaparsec (SourcePos(..)) -- | Parse the outermost binding in a Src descriptor of a let-block and return -- the rest. Ex. on input `let a = 0 let b = a in b` parses `let a = 0 ` and@@ -78,8 +89,8 @@ getLetIdentifier :: Src -> Src getLetIdentifier src@(Src left _ text) = case Megaparsec.parseMaybe (unParser parseLetIdentifier) text of- Just src' -> src' Nothing -> src+ Just e -> e where parseLetIdentifier = do setSourcePos left _let@@ -147,7 +158,7 @@ getImportLink :: Src -> Src getImportLink src@(Src left _ text) = case Megaparsec.parseMaybe (unParser parseImportLink) text of- Just src' -> src'+ Just v -> v Nothing -> src where parseImportLink = do@@ -171,8 +182,8 @@ binderExprFromText :: Text -> Expr Src Import binderExprFromText txt = case Megaparsec.parseMaybe (unParser parseBinderExpr) (txt <> " ") of- Just e -> e Nothing -> holeExpr+ Just s -> s where -- marks the beginning of the next binder boundary = _let <|> _forall <|> _lambda@@ -239,7 +250,7 @@ -- Try to parse as many binders as possible. Skip malformed input and -- 'closed' binders that are already out of scope at the end of the input.- parseBinderExpr = do+ parseBinderExpr = try (do skipManyTill anySingle (lookAhead boundary) try (do
src/Dhall/LSP/Backend/ToJSON.hs view
@@ -1,13 +1,12 @@ module Dhall.LSP.Backend.ToJSON (CompileError, toJSON) where -import Dhall.JSON as Dhall-import qualified Data.Aeson.Encode.Pretty as Aeson-+import Data.ByteString.Lazy (toStrict)+import Data.Text (Text)+import Data.Text.Encoding (decodeUtf8)+import Dhall.JSON as Dhall import Dhall.LSP.Backend.Dhall -import Data.Text (Text)-import Data.Text.Encoding (decodeUtf8)-import Data.ByteString.Lazy (toStrict)+import qualified Data.Aeson.Encode.Pretty as Aeson -- | Try to convert a given Dhall expression to JSON. toJSON :: WellTyped -> Either CompileError Text
src/Dhall/LSP/Backend/Typing.hs view
@@ -1,19 +1,32 @@ module Dhall.LSP.Backend.Typing (annotateLet, exprAt, srcAt, typeAt) where -import Dhall.Context (Context, insert, empty)-import Dhall.Core (Binding(..), Expr(..), subExpressions, normalize, shift, subst, Var(..))-import Dhall.TypeCheck (typeWithA, TypeError(..))-import Dhall.Parser (Src(..))+import Dhall.Context (Context, empty, insert)+import Dhall.Core+ ( Binding (..)+ , Expr (..)+ , Var (..)+ , normalize+ , shift+ , subExpressions+ , subst+ )+import Dhall.Parser (Src (..))+import Dhall.TypeCheck (TypeError (..), typeWithA) -import Control.Lens (toListOf) import Control.Applicative ((<|>))-import Data.Bifunctor (first)-import Data.Void (absurd, Void)+import Control.Lens (toListOf)+import Data.Bifunctor (first)+import Data.Void (Void, absurd) -import Dhall.LSP.Backend.Parsing (getLetInner, getLetAnnot, getLetIdentifier,- getLamIdentifier, getForallIdentifier)-import Dhall.LSP.Backend.Diagnostics (Position, Range(..), rangeFromDhall)-import Dhall.LSP.Backend.Dhall (WellTyped, fromWellTyped)+import Dhall.LSP.Backend.Dhall (WellTyped, fromWellTyped)+import Dhall.LSP.Backend.Diagnostics (Position, Range (..), rangeFromDhall)+import Dhall.LSP.Backend.Parsing+ ( getForallIdentifier+ , getLamIdentifier+ , getLetAnnot+ , getLetIdentifier+ , getLetInner+ ) -- | Find the type of the subexpression at the given position. Assumes that the -- input expression is well-typed. Also returns the Src descriptor containing@@ -134,14 +147,14 @@ annotateLet' pos ctx' _B -- we need to unfold Notes to make progress-annotateLet' pos ctx (Note _ expr) = do+annotateLet' pos ctx (Note _ expr) = annotateLet' pos ctx expr -- catch-all annotateLet' pos ctx expr = do let subExprs = toListOf subExpressions expr case [ Note src e | (Note src e) <- subExprs, pos `inside` src ] of- (e:[]) -> annotateLet' pos ctx e+ [e] -> annotateLet' pos ctx e _ -> Left "You weren't pointing at a let binder!" -- Make sure all lets in a multilet are annotated with their source information
src/Dhall/LSP/Handlers.hs view
@@ -1,51 +1,86 @@-module Dhall.LSP.Handlers where+{-# LANGUAGE RecordWildCards #-} -import qualified Language.Haskell.LSP.Core as LSP-import qualified Language.Haskell.LSP.Messages as LSP-import qualified Language.Haskell.LSP.Types as J-import qualified Language.Haskell.LSP.Types.Lens as J-import qualified Language.Haskell.LSP.VFS as LSP-import qualified Data.Aeson as J-import qualified Data.Rope.UTF16 as Rope+module Dhall.LSP.Handlers where -import Data.Void (Void)-import Dhall.Core (Expr(Note, Embed), pretty, Import(..), ImportHashed(..), ImportType(..), headers)+import Data.Void (Void)+import Dhall.Core+ ( Expr (Embed, Note)+ , Import (..)+ , ImportHashed (..)+ , ImportType (..)+ , headers+ , pretty+ ) import Dhall.Import (localToPath)-import Dhall.Parser (Src(..))-import Dhall.Pretty (CharacterSet(..))+import Dhall.Parser (Src (..))+import Dhall.Pretty (CharacterSet (..)) -import Dhall.LSP.Backend.Completion (Completion(..), completionQueryAt,- completeEnvironmentImport, completeLocalImport, buildCompletionContext, completeProjections, completeFromContext)-import Dhall.LSP.Backend.Dhall (FileIdentifier, parse, load, typecheck,- fileIdentifierFromFilePath, fileIdentifierFromURI, invalidate, parseWithHeader)-import Dhall.LSP.Backend.Diagnostics (Range(..), Diagnosis(..), explain,- rangeFromDhall, diagnose, embedsWithRanges)-import Dhall.LSP.Backend.Formatting (formatExpr, formatExprWithHeader)-import Dhall.LSP.Backend.Freezing (computeSemanticHash, getImportHashPosition,- stripHash, getAllImportsWithHashPositions)-import Dhall.LSP.Backend.Linting (Suggestion(..), suggest, lint)-import Dhall.LSP.Backend.Parsing (binderExprFromText)-import Dhall.LSP.Backend.Typing (typeAt, annotateLet, exprAt)+import Dhall.LSP.Backend.Completion+ ( Completion (..)+ , buildCompletionContext+ , completeEnvironmentImport+ , completeFromContext+ , completeLocalImport+ , completeProjections+ , completionQueryAt+ )+import Dhall.LSP.Backend.Dhall+ ( FileIdentifier+ , fileIdentifierFromFilePath+ , fileIdentifierFromURI+ , invalidate+ , load+ , parse+ , parseWithHeader+ , typecheck+ )+import Dhall.LSP.Backend.Diagnostics+ ( Diagnosis (..)+ , Range (..)+ , diagnose+ , embedsWithRanges+ , explain+ , rangeFromDhall+ )+import Dhall.LSP.Backend.Formatting (formatExpr, formatExprWithHeader)+import Dhall.LSP.Backend.Freezing+ ( computeSemanticHash+ , getAllImportsWithHashPositions+ , getImportHashPosition+ , stripHash+ )+import Dhall.LSP.Backend.Linting (Suggestion (..), lint, suggest)+import Dhall.LSP.Backend.Parsing (binderExprFromText)+import Dhall.LSP.Backend.Typing (annotateLet, exprAt, typeAt) import Dhall.LSP.State -import Control.Applicative ((<|>))+import Control.Applicative ((<|>)) import Control.Concurrent.MVar-import Control.Lens ((^.), use, uses, assign, modifying)-import Control.Monad (guard, forM)-import Control.Monad.Trans (liftIO)-import Control.Monad.Trans.Except (throwE, catchE, runExceptT)+import Control.Lens (assign, modifying, use, uses, (^.))+import Control.Monad (forM, guard)+import Control.Monad.Trans (liftIO)+import Control.Monad.Trans.Except (catchE, runExceptT, throwE) import Control.Monad.Trans.State.Strict (execStateT)-import Data.Default (def)-import qualified Data.HashMap.Strict as HashMap-import qualified Data.Map.Strict as Map-import Data.Maybe (maybeToList)-import Data.Text (Text, isPrefixOf)-import qualified Data.Text as Text-import qualified Network.URI as URI-import qualified Network.URI.Encode as URI-import Text.Megaparsec (SourcePos(..), unPos)+import Data.Default (def)+import Data.Maybe (maybeToList)+import Data.Text (Text, isPrefixOf) import System.FilePath+import Text.Megaparsec (SourcePos (..), unPos) +import qualified Data.Aeson as J+import qualified Data.HashMap.Strict as HashMap+import qualified Data.Map.Strict as Map+import qualified Data.Rope.UTF16 as Rope+import qualified Data.Text as Text+import qualified Language.Haskell.LSP.Core as LSP+import qualified Language.Haskell.LSP.Messages as LSP+import qualified Language.Haskell.LSP.Types as J+import qualified Language.Haskell.LSP.Types.Lens as J+import qualified Language.Haskell.LSP.VFS as LSP+import qualified Network.URI as URI+import qualified Network.URI.Encode as URI++ -- Workaround to make our single-threaded LSP fit dhall-lsp's API, which -- expects a multi-threaded implementation. Reports errors to the user via the -- LSP `ShowMessage` notification.@@ -488,7 +523,7 @@ (cache', bindersExpr') <- case loadedBinders of- Right (cache', binders) -> do+ Right (cache', binders) -> return (cache', binders) Left _ -> throwE (Log, "Could not complete projection; failed to load binders expression.")
src/Dhall/LSP/Server.hs view
@@ -1,24 +1,31 @@+{-# LANGUAGE RecordWildCards #-}+ {-| This is the entry point for the LSP server. -} module Dhall.LSP.Server(run) where -import Control.Concurrent.MVar-import Control.Lens ((^.))-import Data.Aeson (fromJSON, Result(Success))-import Data.Default-import qualified Language.Haskell.LSP.Control as LSP.Control-import qualified Language.Haskell.LSP.Core as LSP.Core+import Control.Concurrent.MVar+import Control.Lens ((^.))+import Data.Aeson (Result (Success), fromJSON)+import Data.Default+import Data.Text (Text)+import Dhall.LSP.Handlers+ ( completionHandler+ , didOpenTextDocumentNotificationHandler+ , didSaveTextDocumentNotificationHandler+ , documentFormattingHandler+ , documentLinkHandler+ , executeCommandHandler+ , hoverHandler+ , nullHandler+ , wrapHandler+ )+import Dhall.LSP.State -import qualified Language.Haskell.LSP.Types as J+import qualified Language.Haskell.LSP.Control as LSP.Control+import qualified Language.Haskell.LSP.Core as LSP.Core+import qualified Language.Haskell.LSP.Types as J import qualified Language.Haskell.LSP.Types.Lens as J--import Data.Text (Text) import qualified System.Log.Logger--import Dhall.LSP.State-import Dhall.LSP.Handlers (nullHandler, wrapHandler, hoverHandler,- didOpenTextDocumentNotificationHandler, didSaveTextDocumentNotificationHandler,- executeCommandHandler, documentFormattingHandler, documentLinkHandler,- completionHandler) -- | The main entry point for the LSP server. run :: Maybe FilePath -> IO ()
src/Dhall/LSP/State.hs view
@@ -1,20 +1,29 @@+{-# LANGUAGE RecordWildCards #-} {-# LANGUAGE TemplateHaskell #-}+ module Dhall.LSP.State where -import qualified Language.Haskell.LSP.Core as LSP+import Control.Lens.TH (makeLenses)+import Control.Monad.Trans.Except (ExceptT)+import Control.Monad.Trans.State.Strict (StateT)+import Data.Aeson+ ( FromJSON (..)+ , withObject+ , (.!=)+ , (.:)+ , (.:?)+ )+import Data.Default (Default (def))+import Data.Dynamic (Dynamic)+import Data.Map.Strict (Map, empty)+import Data.Text (Text)+import Dhall.LSP.Backend.Dhall (Cache, DhallError, emptyCache)+import Lens.Family (LensLike')++import qualified Language.Haskell.LSP.Core as LSP import qualified Language.Haskell.LSP.Messages as LSP-import qualified Language.Haskell.LSP.Types as J+import qualified Language.Haskell.LSP.Types as J -import Control.Lens.TH (makeLenses)-import Lens.Family (LensLike')-import Data.Aeson (FromJSON(..), withObject, (.:), (.:?), (.!=))-import Data.Map.Strict (Map, empty)-import Data.Default (Default(def))-import Data.Dynamic (Dynamic)-import Dhall.LSP.Backend.Dhall (DhallError, Cache, emptyCache)-import Data.Text (Text)-import Control.Monad.Trans.Except (ExceptT)-import Control.Monad.Trans.State.Strict (StateT) -- Inside a handler we have access to the ServerState. The exception layer -- allows us to fail gracefully, displaying a message to the user via the
src/Dhall/LSP/Util.hs view
@@ -7,8 +7,8 @@ unlines' ) where -import Data.Text import Data.List.NonEmpty+import Data.Text -- | Shorthand for @pack . show@. Useful since we are mostly working with Text -- rather than String.
tests/Main.hs view
@@ -1,23 +1,24 @@ {-# LANGUAGE DuplicateRecordFields #-} {-# LANGUAGE OverloadedStrings #-} -import Control.Monad.IO.Class (liftIO)-import Data.Maybe (fromJust)-import qualified Data.Text as T-import qualified GHC.IO.Encoding+import Control.Monad.IO.Class (liftIO)+import Data.Maybe (fromJust) import Language.Haskell.LSP.Test import Language.Haskell.LSP.Types- ( CompletionItem(..)- , Diagnostic(..)- , DiagnosticSeverity(..)- , Hover(..)- , HoverContents(..)- , MarkupContent(..)- , Position(..)- , Range(..)- )+ ( CompletionItem (..)+ , Diagnostic (..)+ , DiagnosticSeverity (..)+ , Hover (..)+ , HoverContents (..)+ , MarkupContent (..)+ , Position (..)+ , Range (..)+ ) import Test.Tasty import Test.Tasty.Hspec++import qualified Data.Text as T+import qualified GHC.IO.Encoding baseDir :: FilePath -> FilePath baseDir d = "tests/fixtures/" <> d