diff --git a/cabal.project b/cabal.project index 5ad04de72b..9577b08cea 100644 --- a/cabal.project +++ b/cabal.project @@ -1,6 +1,7 @@ packages: ./ ghcide + hls-plugin-api source-repository-package type: git diff --git a/exe/Main.hs b/exe/Main.hs index 9d0adb69fc..dfecd730ad 100644 --- a/exe/Main.hs +++ b/exe/Main.hs @@ -1,66 +1,13 @@ -- Copyright (c) 2019 The DAML Authors. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 -{-# LANGUAGE CPP #-} -- To get precise GHC version -{-# LANGUAGE TemplateHaskell #-} -{-# OPTIONS_GHC -Wno-dodgy-imports #-} -- GHC no longer exports def in GHC 8.6 and above -{-# LANGUAGE DeriveGeneric #-} -{-# LANGUAGE LambdaCase #-} -{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RecordWildCards #-} -{-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE TupleSections #-} -{-# LANGUAGE TypeFamilies #-} -{-# LANGUAGE ViewPatterns #-} - module Main(main) where -import Arguments -import Control.Concurrent.Extra -import Control.Monad.Extra -import Data.Default -import qualified Data.HashSet as HashSet -import Data.List.Extra -import qualified Data.Map.Strict as Map -import Data.Maybe -import qualified Data.Text as T -import qualified Data.Text.IO as T -import Development.IDE.Core.Debouncer -import Development.IDE.Core.FileStore -import Development.IDE.Core.OfInterest -import Development.IDE.Core.RuleTypes -import Development.IDE.Core.Rules -import Development.IDE.Core.Service -import Development.IDE.Core.Shake -import Development.IDE.LSP.LanguageServer -import Development.IDE.LSP.Protocol -import Development.IDE.Plugin -import Development.IDE.Session -import Development.IDE.Types.Diagnostics -import Development.IDE.Types.Location -import Development.IDE.Types.Logger -import Development.IDE.Types.Options -import HIE.Bios.Cradle -import qualified Language.Haskell.LSP.Core as LSP -import Ide.Logger -import Ide.Plugin -import Ide.Version -import Ide.Plugin.Config -import Ide.Types (IdePlugins, ipMap) -import Language.Haskell.LSP.Messages -import Language.Haskell.LSP.Types -import qualified System.Directory.Extra as IO -import System.Exit -import System.FilePath -import System.IO -import qualified System.Log.Logger as L -import System.Time.Extra - --- --------------------------------------------------------------------- --- ghcide partialhandlers -import Development.IDE.Plugin.CodeAction as CodeAction -import Development.IDE.Plugin.Completions as Completions -import Development.IDE.LSP.HoverDefinition as HoverDefinition +import Ide.Arguments (Arguments(..), LspArguments(..), getArguments) +import Ide.Main (defaultMain) +import Ide.Types (IdePlugins) -- haskell-language-server plugins import Ide.Plugin.Eval as Eval @@ -77,12 +24,11 @@ import Ide.Plugin.Retrie as Retrie import Ide.Plugin.Brittany as Brittany #endif import Ide.Plugin.Pragmas as Pragmas +import Ide.Plugin (pluginDescToIdePlugins) -- --------------------------------------------------------------------- - - -- | The plugins configured for use in this instance of the language -- server. -- These can be freely added or removed to tailor the available @@ -95,19 +41,10 @@ idePlugins includeExamples = pluginDescToIdePlugins allPlugins then basePlugins ++ examplePlugins else basePlugins basePlugins = - [ - -- applyRefactDescriptor "applyrefact" - -- , haddockDescriptor "haddock" - -- , hareDescriptor "hare" - -- , hsimportDescriptor "hsimport" - -- , liquidDescriptor "liquid" - -- , packageDescriptor "package" - GhcIde.descriptor "ghcide" + [ GhcIde.descriptor "ghcide" , Pragmas.descriptor "pragmas" , Floskell.descriptor "floskell" , Fourmolu.descriptor "fourmolu" - -- , genericDescriptor "generic" - -- , ghcmodDescriptor "ghcmod" , Ormolu.descriptor "ormolu" , StylishHaskell.descriptor "stylish-haskell" , Retrie.descriptor "retrie" @@ -120,144 +57,17 @@ idePlugins includeExamples = pluginDescToIdePlugins allPlugins examplePlugins = [Example.descriptor "eg" ,Example2.descriptor "eg2" - -- ,hfaAlignDescriptor "hfaa" ] -ghcIdePlugins :: T.Text -> IdePlugins -> (Plugin Config, [T.Text]) -ghcIdePlugins pid ps = (asGhcIdePlugin ps, allLspCmdIds' pid ps) - -- --------------------------------------------------------------------- main :: IO () main = do - -- WARNING: If you write to stdout before runLanguageServer - -- then the language server will not work args <- getArguments "haskell-language-server" - hlsVer <- haskellLanguageServerVersion - case args of - ProbeToolsMode -> do - programsOfInterest <- findProgramVersions - putStrLn hlsVer - putStrLn "Tool versions found on the $PATH" - putStrLn $ showProgramVersionOfInterest programsOfInterest - - VersionMode PrintVersion -> - putStrLn hlsVer - - VersionMode PrintNumericVersion -> - putStrLn haskellLanguageServerNumericVersion - - LspMode lspArgs -> do - {- see WARNING above -} - hPutStrLn stderr hlsVer - runLspMode lspArgs - -runLspMode :: LspArguments -> IO () -runLspMode lspArgs@LspArguments {..} = do - LSP.setupLogger argsLogFile ["hls", "hie-bios"] - $ if argsDebugOn then L.DEBUG else L.INFO - - -- lock to avoid overlapping output on stdout - lock <- newLock - let logger p = Logger $ \pri msg -> when (pri >= p) $ withLock lock $ - T.putStrLn $ T.pack ("[" ++ upper (show pri) ++ "] ") <> msg - - whenJust argsCwd IO.setCurrentDirectory - - dir <- IO.getCurrentDirectory - - pid <- getPid - let - idePlugins' = idePlugins argsExamplePlugin - (ps, commandIds) = ghcIdePlugins pid idePlugins' - plugins = Completions.plugin <> CodeAction.plugin <> - Plugin mempty HoverDefinition.setHandlersDefinition <> - ps - options = def { LSP.executeCommandCommands = Just commandIds - , LSP.completionTriggerCharacters = Just "." - } - - if argLSP then do - t <- offsetTime - hPutStrLn stderr "Starting (haskell-language-server)LSP server..." - hPutStrLn stderr $ " with arguments: " <> show lspArgs - hPutStrLn stderr $ " with plugins: " <> show (Map.keys $ ipMap idePlugins') - hPutStrLn stderr $ " in directory: " <> dir - hPutStrLn stderr "If you are seeing this in a terminal, you probably should have run ghcide WITHOUT the --lsp option!" - - runLanguageServer options (pluginHandler plugins) getInitialConfig getConfigFromNotification $ \getLspId event vfs caps wProg wIndefProg _getConfig _rootPath -> do - t <- t - hPutStrLn stderr $ "Started LSP server in " ++ showDuration t - sessionLoader <- loadSession dir - -- config <- fromMaybe defaultLspConfig <$> getConfig - let options = (defaultIdeOptions sessionLoader) - { optReportProgress = clientSupportsProgress caps - , optShakeProfiling = argsShakeProfiling - , optTesting = IdeTesting argsTesting - , optThreads = argsThreads - -- , optCheckParents = checkParents config - -- , optCheckProject = checkProject config - } - debouncer <- newAsyncDebouncer - initialise caps (mainRule >> pluginRules plugins) - getLspId event wProg wIndefProg hlsLogger debouncer options vfs - else do - -- GHC produces messages with UTF8 in them, so make sure the terminal doesn't error - hSetEncoding stdout utf8 - hSetEncoding stderr utf8 - - putStrLn $ "(haskell-language-server)Ghcide setup tester in " ++ dir ++ "." - putStrLn "Report bugs at https://github.com/haskell/haskell-language-server/issues" - programsOfInterest <- findProgramVersions - putStrLn "" - putStrLn "Tool versions found on the $PATH" - putStrLn $ showProgramVersionOfInterest programsOfInterest - - putStrLn $ "\nStep 1/4: Finding files to test in " ++ dir - files <- expandFiles (argFiles ++ ["." | null argFiles]) - -- LSP works with absolute file paths, so try and behave similarly - files <- nubOrd <$> mapM IO.canonicalizePath files - putStrLn $ "Found " ++ show (length files) ++ " files" - - putStrLn "\nStep 2/4: Looking for hie.yaml files that control setup" - cradles <- mapM findCradle files - let ucradles = nubOrd cradles - let n = length ucradles - putStrLn $ "Found " ++ show n ++ " cradle" ++ ['s' | n /= 1] - putStrLn "\nStep 3/4: Initializing the IDE" - vfs <- makeVFSHandle - debouncer <- newAsyncDebouncer - let dummyWithProg _ _ f = f (const (pure ())) - sessionLoader <- loadSession dir - ide <- initialise def mainRule (pure $ IdInt 0) (showEvent lock) dummyWithProg (const (const id)) (logger Info) debouncer (defaultIdeOptions sessionLoader) vfs - - putStrLn "\nStep 4/4: Type checking the files" - setFilesOfInterest ide $ HashSet.fromList $ map toNormalizedFilePath' files - results <- runAction "User TypeCheck" ide $ uses TypeCheck (map toNormalizedFilePath' files) - let (worked, failed) = partition fst $ zip (map isJust results) files - when (failed /= []) $ - putStr $ unlines $ "Files that failed:" : map ((++) " * " . snd) failed - - let files xs = let n = length xs in if n == 1 then "1 file" else show n ++ " files" - putStrLn $ "\nCompleted (" ++ files worked ++ " worked, " ++ files failed ++ " failed)" - unless (null failed) (exitWith $ ExitFailure (length failed)) - -expandFiles :: [FilePath] -> IO [FilePath] -expandFiles = concatMapM $ \x -> do - b <- IO.doesFileExist x - if b then return [x] else do - let recurse "." = True - recurse x | "." `isPrefixOf` takeFileName x = False -- skip .git etc - recurse x = takeFileName x `notElem` ["dist","dist-newstyle"] -- cabal directories - files <- filter (\x -> takeExtension x `elem` [".hs",".lhs"]) <$> IO.listFilesInside (return . recurse) x - when (null files) $ - fail $ "Couldn't find any .hs/.lhs files inside directory: " ++ x - return files + let withExamples = + case args of + LspMode (LspArguments{..}) -> argsExamplePlugin + _ -> False --- | Print an LSP event. -showEvent :: Lock -> FromServerMessage -> IO () -showEvent _ (EventFileDiagnostics _ []) = return () -showEvent lock (EventFileDiagnostics (toNormalizedFilePath' -> file) diags) = - withLock lock $ T.putStrLn $ showDiagnosticsColored $ map (file,ShowDiag,) diags -showEvent lock e = withLock lock $ print e + defaultMain args (idePlugins withExamples) diff --git a/exe/Wrapper.hs b/exe/Wrapper.hs index cdcea7cb04..4d262f4b44 100644 --- a/exe/Wrapper.hs +++ b/exe/Wrapper.hs @@ -3,7 +3,6 @@ -- https://github.com/alanz/vscode-hie-server module Main where -import Arguments import Control.Monad.Extra import Data.Foldable import Data.List @@ -11,6 +10,7 @@ import Data.Void import HIE.Bios import HIE.Bios.Environment import HIE.Bios.Types +import Ide.Arguments import Ide.Version import System.Directory import System.Environment diff --git a/haskell-language-server.cabal b/haskell-language-server.cabal index 509e4d4221..8ead3a824c 100644 --- a/haskell-language-server.cabal +++ b/haskell-language-server.cabal @@ -1,304 +1,264 @@ -cabal-version: 2.2 -category: Development -name: haskell-language-server -version: 0.4.0.0 -synopsis: LSP server for GHC -description: Please see the README on GitHub at -homepage: https://github.com/haskell/haskell-language-server#readme -bug-reports: https://github.com/haskell/haskell-language-server/issues -author: Alan Zimmerman -maintainer: alan.zimm@gmail.com -copyright: Alan Zimmerman -license: Apache-2.0 -license-file: LICENSE -build-type: Simple +cabal-version: 2.2 +category: Development +name: haskell-language-server +version: 0.4.0.0 +synopsis: LSP server for GHC +description: + Please see the README on GitHub at + +homepage: https://github.com/haskell/haskell-language-server#readme +bug-reports: https://github.com/haskell/haskell-language-server/issues +author: Alan Zimmerman +maintainer: alan.zimm@gmail.com +copyright: Alan Zimmerman +license: Apache-2.0 +license-file: LICENSE +build-type: Simple extra-source-files: - README.md - ChangeLog.md - include/ghc-api-version.h + README.md + ChangeLog.md + include/ghc-api-version.h flag agpl - Description: Enable AGPL dependencies - Default: True - Manual: True + description: Enable AGPL dependencies + default: True + manual: True flag pedantic - Description: Enable -Werror - Default: False - Manual: True + description: Enable -Werror + default: False + manual: True source-repository head - type: git + type: git location: https://github.com/haskell/haskell-language-server common agpl if flag(agpl) - cpp-options: - -DAGPL + cpp-options: -DAGPL + +common common-deps + build-depends: + , base >=4.12 && <5 + , directory + , extra + , filepath + , text library - import: agpl + import: agpl, common-deps exposed-modules: - Ide.Logger - Ide.Plugin - Ide.Plugin.Config - Ide.Plugin.Eval - Ide.Plugin.Example - Ide.Plugin.Example2 - Ide.Plugin.Fourmolu - Ide.Plugin.GhcIde - Ide.Plugin.ImportLens - Ide.Plugin.Ormolu - Ide.Plugin.Pragmas - Ide.Plugin.Retrie - Ide.Plugin.Floskell - Ide.Plugin.Formatter - Ide.Plugin.StylishHaskell - Ide.PluginUtils - Ide.Types - Ide.Version - other-modules: - Paths_haskell_language_server - hs-source-dirs: - src + Ide.Arguments + Ide.Main + Ide.Version + + other-modules: Paths_haskell_language_server + autogen-modules: Paths_haskell_language_server + hs-source-dirs: src build-depends: - base >=4.12 && <5 - , aeson - , binary - , bytestring , containers , data-default - , deepseq - , Diff - , directory - , extra - , filepath - , floskell == 0.10.* - , fourmolu ^>= 0.1 , ghc - , ghc-boot-th - , ghcide >= 0.1 + , ghcide , gitrev - , hashable - , haskell-lsp == 0.22.* - , hie-bios >= 0.6.1 && < 0.8 + , haskell-lsp ^>=0.22 + , hie-bios >=0.6.1 && <0.8 + , hls-plugin-api , hslogger - , lens - , ormolu ^>= 0.1.2 + , optparse-applicative , optparse-simple , process - , regex-tdfa >= 1.3.1.0 - , retrie >= 0.1.1.0 - , safe-exceptions - , shake >= 0.17.5 - , stylish-haskell == 0.11.* - , temporary - , text - , time - , transformers , unordered-containers - include-dirs: - include - if os(windows) - build-depends: Win32 - else - build-depends: unix - if flag(agpl) - build-depends: - brittany - exposed-modules: - Ide.Plugin.Brittany - ghc-options: - -Wall - -Wredundant-constraints - -Wno-name-shadowing + ghc-options: -Wall -Wredundant-constraints -Wno-name-shadowing + if flag(pedantic) - ghc-options: -Werror + ghc-options: -Werror default-language: Haskell2010 executable haskell-language-server - import: agpl - main-is: Main.hs - hs-source-dirs: - exe + import: agpl, common-deps + main-is: Main.hs + hs-source-dirs: exe plugins/default/src other-modules: - Arguments - Paths_haskell_language_server - autogen-modules: - Paths_haskell_language_server + Ide.Plugin.Eval + Ide.Plugin.Example + Ide.Plugin.Example2 + Ide.Plugin.Floskell + Ide.Plugin.Fourmolu + Ide.Plugin.ImportLens + Ide.Plugin.Ormolu + Ide.Plugin.Pragmas + Ide.Plugin.Retrie + Ide.Plugin.StylishHaskell + ghc-options: - -threaded - -Wall - -Wno-name-shadowing - -Wredundant-constraints - -- allow user RTS overrides - -rtsopts - -- disable idle GC - -- disable parallel GC - -- increase nursery size - "-with-rtsopts=-I0 -qg -A128M" + -threaded -Wall -Wno-name-shadowing -Wredundant-constraints + -- allow user RTS overrides + -rtsopts + -- disable idle GC + -- disable parallel GC + -- increase nursery size + "-with-rtsopts=-I0 -qg -A128M" if flag(pedantic) - ghc-options: -Werror + ghc-options: -Werror build-depends: - base >=4.7 && <5 + , aeson , binary + , bytestring , containers - , data-default - , directory - , extra - , filepath - , process + , deepseq + , floskell ^>=0.10 + , fourmolu ^>=0.1 , ghc - -------------------------------------------------------------- - , ghcide - , gitrev + , ghc-boot-th + , ghcide >=0.1 , hashable - , haskell-lsp - , hie-bios , haskell-language-server - , hslogger - , optparse-applicative + , haskell-lsp ^>=0.22 + , hls-plugin-api + , lens + , ormolu ^>=0.1.2 + , regex-tdfa + , retrie >=0.1.1.0 , safe-exceptions - , shake >= 0.17.5 - , text + , shake >=0.17.5 + , stylish-haskell ^>=0.11 + , temporary , time + , transformers , unordered-containers + + if flag(agpl) + build-depends: brittany + other-modules: Ide.Plugin.Brittany + + include-dirs: include default-language: Haskell2010 executable haskell-language-server-wrapper - import: agpl - main-is: Wrapper.hs - hs-source-dirs: - exe - other-modules: - Arguments - Paths_haskell_language_server - autogen-modules: - Paths_haskell_language_server + import: agpl, common-deps + main-is: Wrapper.hs + hs-source-dirs: exe + other-modules: Paths_haskell_language_server + autogen-modules: Paths_haskell_language_server ghc-options: - -threaded - -Wall - -Wno-name-shadowing - -Wredundant-constraints - -- allow user RTS overrides - -rtsopts - -- disable idle GC - -- disable parallel GC - -- increase nursery size - "-with-rtsopts=-I0 -qg -A128M" + -threaded -Wall -Wno-name-shadowing -Wredundant-constraints + -- allow user RTS overrides + -rtsopts + -- disable idle GC + -- disable parallel GC + -- increase nursery size + "-with-rtsopts=-I0 -qg -A128M" if flag(pedantic) - ghc-options: -Werror + ghc-options: -Werror + build-depends: - base - , directory - , extra - , filepath - , gitrev , ghc , ghc-paths - , hie-bios + , gitrev , haskell-language-server + , hie-bios , optparse-applicative + , optparse-simple , process - default-language: Haskell2010 + + default-language: Haskell2010 -- This common stanza simulates a previous private lib -- We removed it due to issues with stack when loading the project using a stack based hie.yaml -- See https://github.com/haskell/haskell-language-server/issues/114 common hls-test-utils - import: agpl - hs-source-dirs: test/utils - other-modules: Test.Hls.Util - build-depends: base - , haskell-language-server - , haskell-lsp - , hie-bios - , aeson - , blaze-markup - , containers - , data-default - , directory - , filepath - , hslogger - , hspec - , hspec-core - , lsp-test >= 0.11.0.4 - , stm - , tasty-hunit - , temporary - , text - , transformers - , unordered-containers - , yaml - ghc-options: -Wall -Wredundant-constraints + import: agpl, common-deps + hs-source-dirs: test/utils + other-modules: Test.Hls.Util + build-depends: + , aeson + , blaze-markup + , containers + , data-default + , haskell-lsp + , hie-bios + , hls-plugin-api + , hslogger + , hspec + , hspec-core + , lsp-test >=0.11.0.4 + , stm + , tasty-hunit + , temporary + , transformers + , unordered-containers + , yaml + + ghc-options: -Wall -Wredundant-constraints + if flag(pedantic) - ghc-options: -Werror - default-language: Haskell2010 + ghc-options: -Werror + + default-language: Haskell2010 test-suite func-test - import: agpl, hls-test-utils - type: exitcode-stdio-1.0 - default-language: Haskell2010 - build-tool-depends: haskell-language-server:haskell-language-server - , ghcide:ghcide-test-preprocessor - build-depends: base >=4.7 && <5 - , aeson - , bytestring - , data-default - , directory - , filepath - , haskell-language-server - , haskell-lsp - , haskell-lsp-types - , lens - , lsp-test >= 0.11.0.4 - , tasty - , tasty-ant-xml >= 1.1.6 - , tasty-expected-failure - , tasty-golden - , tasty-hunit - , tasty-rerun - , text - , unordered-containers - hs-source-dirs: test/functional - main-is: Main.hs - other-modules: Command - , Completion - , Deferred - , Definition - , Diagnostic - , Eval - , Format - , FunctionalBadProject - , FunctionalCodeAction - , FunctionalLiquid - , HieBios - , Highlight - , Progress - , Reference - , Rename - , Symbol - , TypeDefinition - ghc-options: -Wall - -Wno-name-shadowing - -threaded -rtsopts -with-rtsopts=-N + import: agpl, common-deps, hls-test-utils + type: exitcode-stdio-1.0 + default-language: Haskell2010 + build-tool-depends: + haskell-language-server:haskell-language-server -any, + ghcide:ghcide-test-preprocessor -any + + build-depends: + , bytestring + , data-default + , lens + , tasty + , tasty-ant-xml >=1.1.6 + , tasty-expected-failure + , tasty-golden + , tasty-rerun + + hs-source-dirs: test/functional + main-is: Main.hs + other-modules: + Command + Completion + Deferred + Definition + Diagnostic + Eval + Format + FunctionalBadProject + FunctionalCodeAction + FunctionalLiquid + HieBios + Highlight + Progress + Reference + Rename + Symbol + TypeDefinition + + ghc-options: + -Wall -Wno-name-shadowing -threaded -rtsopts -with-rtsopts=-N + if flag(pedantic) - ghc-options: -Werror -Wredundant-constraints + ghc-options: -Werror -Wredundant-constraints test-suite wrapper-test - import: agpl, hls-test-utils - type: exitcode-stdio-1.0 - build-tool-depends: haskell-language-server:haskell-language-server-wrapper - default-language: Haskell2010 - build-depends: base == 4.* - , directory - , process - , tasty - , tasty-hunit - , tasty-ant-xml >= 1.1.6 - hs-source-dirs: test/wrapper - main-is: Main.hs - ghc-options: -Wall + import: agpl, hls-test-utils + type: exitcode-stdio-1.0 + build-tool-depends: + haskell-language-server:haskell-language-server-wrapper -any + + default-language: Haskell2010 + build-depends: + , base + , directory + , process + , tasty + , tasty-ant-xml >=1.1.6 + + hs-source-dirs: test/wrapper + main-is: Main.hs + ghc-options: -Wall diff --git a/hie.yaml.cbl b/hie.yaml.cbl index fb92662e1b..b0d041f795 100644 --- a/hie.yaml.cbl +++ b/hie.yaml.cbl @@ -36,3 +36,6 @@ cradle: - path: "./ghcide/exe" component: "ghcide:exe:ghcide" + + - path: "./hls-plugin-api/src" + component: "hls-plugin-api:lib:hls-plugin-api" diff --git a/hie.yaml.stack b/hie.yaml.stack index 54f5f3abb0..f69db343ae 100644 --- a/hie.yaml.stack +++ b/hie.yaml.stack @@ -36,3 +36,6 @@ cradle: - path: "./ghcide/exe" component: "ghcide:exe:ghcide" + + - path: "./hls-plugin-api/src" + component: "hls-plugin-api:lib:hls-plugin-api" diff --git a/hls-plugin-api/LICENSE b/hls-plugin-api/LICENSE new file mode 100644 index 0000000000..261eeb9e9f --- /dev/null +++ b/hls-plugin-api/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/hls-plugin-api/hls-plugin-api.cabal b/hls-plugin-api/hls-plugin-api.cabal new file mode 100644 index 0000000000..8e9a8c5ed3 --- /dev/null +++ b/hls-plugin-api/hls-plugin-api.cabal @@ -0,0 +1,53 @@ +cabal-version: 2.2 +name: hls-plugin-api +version: 0.4.0.0 +synopsis: Haskell Language Server API for plugin communication +description: Please see README.md +license: Apache-2.0 +license-file: LICENSE +author: Many,TBD when we release +maintainer: alan.zimm@gmail.com (for now) +copyright: Alan Zimmerman +category: Web +build-type: Simple + +flag pedantic + description: Enable -Werror + default: False + manual: True + +library + exposed-modules: + Ide.Logger + Ide.Plugin + Ide.Plugin.Config + Ide.Plugin.Formatter + Ide.Plugin.GhcIde + Ide.PluginUtils + Ide.Types + + hs-source-dirs: src + build-depends: + , aeson + , base >=4.12 && <5 + , containers + , data-default + , Diff + , ghc + , ghc-boot-th + , ghcide >=0.1 + , haskell-lsp ^>=0.22 + , hslogger + , lens + , process + , regex-tdfa >=1.3.1.0 + , shake >=0.17.5 + , text + , unordered-containers + + ghc-options: -Wall -Wredundant-constraints -Wno-name-shadowing + + if flag(pedantic) + ghc-options: -Werror + + default-language: Haskell2010 diff --git a/src/Ide/Logger.hs b/hls-plugin-api/src/Ide/Logger.hs similarity index 100% rename from src/Ide/Logger.hs rename to hls-plugin-api/src/Ide/Logger.hs diff --git a/src/Ide/Plugin.hs b/hls-plugin-api/src/Ide/Plugin.hs similarity index 100% rename from src/Ide/Plugin.hs rename to hls-plugin-api/src/Ide/Plugin.hs diff --git a/src/Ide/Plugin/Config.hs b/hls-plugin-api/src/Ide/Plugin/Config.hs similarity index 100% rename from src/Ide/Plugin/Config.hs rename to hls-plugin-api/src/Ide/Plugin/Config.hs diff --git a/src/Ide/Plugin/Formatter.hs b/hls-plugin-api/src/Ide/Plugin/Formatter.hs similarity index 100% rename from src/Ide/Plugin/Formatter.hs rename to hls-plugin-api/src/Ide/Plugin/Formatter.hs diff --git a/src/Ide/Plugin/GhcIde.hs b/hls-plugin-api/src/Ide/Plugin/GhcIde.hs similarity index 100% rename from src/Ide/Plugin/GhcIde.hs rename to hls-plugin-api/src/Ide/Plugin/GhcIde.hs diff --git a/src/Ide/PluginUtils.hs b/hls-plugin-api/src/Ide/PluginUtils.hs similarity index 100% rename from src/Ide/PluginUtils.hs rename to hls-plugin-api/src/Ide/PluginUtils.hs diff --git a/src/Ide/Types.hs b/hls-plugin-api/src/Ide/Types.hs similarity index 100% rename from src/Ide/Types.hs rename to hls-plugin-api/src/Ide/Types.hs diff --git a/src/Ide/Plugin/Brittany.hs b/plugins/default/src/Ide/Plugin/Brittany.hs similarity index 100% rename from src/Ide/Plugin/Brittany.hs rename to plugins/default/src/Ide/Plugin/Brittany.hs diff --git a/src/Ide/Plugin/Eval.hs b/plugins/default/src/Ide/Plugin/Eval.hs similarity index 100% rename from src/Ide/Plugin/Eval.hs rename to plugins/default/src/Ide/Plugin/Eval.hs diff --git a/src/Ide/Plugin/Example.hs b/plugins/default/src/Ide/Plugin/Example.hs similarity index 100% rename from src/Ide/Plugin/Example.hs rename to plugins/default/src/Ide/Plugin/Example.hs diff --git a/src/Ide/Plugin/Example2.hs b/plugins/default/src/Ide/Plugin/Example2.hs similarity index 100% rename from src/Ide/Plugin/Example2.hs rename to plugins/default/src/Ide/Plugin/Example2.hs diff --git a/src/Ide/Plugin/Floskell.hs b/plugins/default/src/Ide/Plugin/Floskell.hs similarity index 100% rename from src/Ide/Plugin/Floskell.hs rename to plugins/default/src/Ide/Plugin/Floskell.hs diff --git a/src/Ide/Plugin/Fourmolu.hs b/plugins/default/src/Ide/Plugin/Fourmolu.hs similarity index 100% rename from src/Ide/Plugin/Fourmolu.hs rename to plugins/default/src/Ide/Plugin/Fourmolu.hs diff --git a/src/Ide/Plugin/ImportLens.hs b/plugins/default/src/Ide/Plugin/ImportLens.hs similarity index 100% rename from src/Ide/Plugin/ImportLens.hs rename to plugins/default/src/Ide/Plugin/ImportLens.hs diff --git a/src/Ide/Plugin/Ormolu.hs b/plugins/default/src/Ide/Plugin/Ormolu.hs similarity index 100% rename from src/Ide/Plugin/Ormolu.hs rename to plugins/default/src/Ide/Plugin/Ormolu.hs diff --git a/src/Ide/Plugin/Pragmas.hs b/plugins/default/src/Ide/Plugin/Pragmas.hs similarity index 100% rename from src/Ide/Plugin/Pragmas.hs rename to plugins/default/src/Ide/Plugin/Pragmas.hs diff --git a/src/Ide/Plugin/Retrie.hs b/plugins/default/src/Ide/Plugin/Retrie.hs similarity index 100% rename from src/Ide/Plugin/Retrie.hs rename to plugins/default/src/Ide/Plugin/Retrie.hs diff --git a/src/Ide/Plugin/StylishHaskell.hs b/plugins/default/src/Ide/Plugin/StylishHaskell.hs similarity index 100% rename from src/Ide/Plugin/StylishHaskell.hs rename to plugins/default/src/Ide/Plugin/StylishHaskell.hs diff --git a/exe/Arguments.hs b/src/Ide/Arguments.hs similarity index 99% rename from exe/Arguments.hs rename to src/Ide/Arguments.hs index 9ca5568829..eaf2e95e44 100644 --- a/exe/Arguments.hs +++ b/src/Ide/Arguments.hs @@ -7,7 +7,7 @@ {-# LANGUAGE ViewPatterns #-} {-# OPTIONS_GHC -Wno-dodgy-imports #-} -- GHC no longer exports def in GHC 8.6 and above -module Arguments +module Ide.Arguments ( Arguments(..) , LspArguments(..) , PrintVersion(..) diff --git a/src/Ide/Main.hs b/src/Ide/Main.hs new file mode 100644 index 0000000000..4364fd757c --- /dev/null +++ b/src/Ide/Main.hs @@ -0,0 +1,200 @@ +-- Copyright (c) 2019 The DAML Authors. All rights reserved. +-- SPDX-License-Identifier: Apache-2.0 +{-# LANGUAGE CPP #-} -- To get precise GHC version +{-# LANGUAGE TemplateHaskell #-} +{-# OPTIONS_GHC -Wno-dodgy-imports #-} -- GHC no longer exports def in GHC 8.6 and above +{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE LambdaCase #-} +{-# LANGUAGE NamedFieldPuns #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE ViewPatterns #-} + +module Ide.Main(defaultMain, runLspMode) where + +import Control.Concurrent.Extra +import Control.Monad.Extra +import Data.Default +import qualified Data.HashSet as HashSet +import Data.List.Extra +import qualified Data.Map.Strict as Map +import Data.Maybe +import qualified Data.Text as T +import qualified Data.Text.IO as T +import Development.IDE.Core.Debouncer +import Development.IDE.Core.FileStore +import Development.IDE.Core.OfInterest +import Development.IDE.Core.RuleTypes +import Development.IDE.Core.Rules +import Development.IDE.Core.Service +import Development.IDE.Core.Shake +import Development.IDE.LSP.LanguageServer +import Development.IDE.LSP.Protocol +import Development.IDE.Plugin +import Development.IDE.Session +import Development.IDE.Types.Diagnostics +import Development.IDE.Types.Location +import Development.IDE.Types.Logger +import Development.IDE.Types.Options +import HIE.Bios.Cradle +import qualified Language.Haskell.LSP.Core as LSP +import Ide.Arguments +import Ide.Logger +import Ide.Plugin +import Ide.Version +import Ide.Plugin.Config +import Ide.Types (IdePlugins, ipMap) +import Language.Haskell.LSP.Messages +import Language.Haskell.LSP.Types +import qualified System.Directory.Extra as IO +import System.Exit +import System.FilePath +import System.IO +import qualified System.Log.Logger as L +import System.Time.Extra + +-- --------------------------------------------------------------------- +-- ghcide partialhandlers +import Development.IDE.Plugin.CodeAction as CodeAction +import Development.IDE.Plugin.Completions as Completions +import Development.IDE.LSP.HoverDefinition as HoverDefinition + +-- --------------------------------------------------------------------- + +ghcIdePlugins :: T.Text -> IdePlugins -> (Plugin Config, [T.Text]) +ghcIdePlugins pid ps = (asGhcIdePlugin ps, allLspCmdIds' pid ps) + +defaultMain :: Arguments -> IdePlugins -> IO () +defaultMain args idePlugins = do + -- WARNING: If you write to stdout before runLanguageServer + -- then the language server will not work + + hlsVer <- haskellLanguageServerVersion + case args of + ProbeToolsMode -> do + programsOfInterest <- findProgramVersions + putStrLn hlsVer + putStrLn "Tool versions found on the $PATH" + putStrLn $ showProgramVersionOfInterest programsOfInterest + + VersionMode PrintVersion -> + putStrLn hlsVer + + VersionMode PrintNumericVersion -> + putStrLn haskellLanguageServerNumericVersion + + LspMode lspArgs -> do + {- see WARNING above -} + hPutStrLn stderr hlsVer + runLspMode lspArgs idePlugins + +runLspMode :: LspArguments -> IdePlugins -> IO () +runLspMode lspArgs@LspArguments{..} idePlugins = do + LSP.setupLogger argsLogFile ["hls", "hie-bios"] + $ if argsDebugOn then L.DEBUG else L.INFO + + -- lock to avoid overlapping output on stdout + lock <- newLock + let logger p = Logger $ \pri msg -> when (pri >= p) $ withLock lock $ + T.putStrLn $ T.pack ("[" ++ upper (show pri) ++ "] ") <> msg + + whenJust argsCwd IO.setCurrentDirectory + + dir <- IO.getCurrentDirectory + + pid <- getPid + let + (ps, commandIds) = ghcIdePlugins pid idePlugins + plugins = Completions.plugin <> CodeAction.plugin <> + Plugin mempty HoverDefinition.setHandlersDefinition <> + ps + options = def { LSP.executeCommandCommands = Just commandIds + , LSP.completionTriggerCharacters = Just "." + } + + if argLSP then do + t <- offsetTime + hPutStrLn stderr "Starting (haskell-language-server)LSP server..." + hPutStrLn stderr $ " with arguments: " <> show lspArgs + hPutStrLn stderr $ " with plugins: " <> show (Map.keys $ ipMap idePlugins) + hPutStrLn stderr $ " in directory: " <> dir + hPutStrLn stderr "If you are seeing this in a terminal, you probably should have run ghcide WITHOUT the --lsp option!" + + runLanguageServer options (pluginHandler plugins) getInitialConfig getConfigFromNotification $ \getLspId event vfs caps wProg wIndefProg _getConfig _rootPath -> do + t <- t + hPutStrLn stderr $ "Started LSP server in " ++ showDuration t + sessionLoader <- loadSession dir + -- config <- fromMaybe defaultLspConfig <$> getConfig + let options = (defaultIdeOptions sessionLoader) + { optReportProgress = clientSupportsProgress caps + , optShakeProfiling = argsShakeProfiling + , optTesting = IdeTesting argsTesting + , optThreads = argsThreads + -- , optCheckParents = checkParents config + -- , optCheckProject = checkProject config + } + debouncer <- newAsyncDebouncer + initialise caps (mainRule >> pluginRules plugins) + getLspId event wProg wIndefProg hlsLogger debouncer options vfs + else do + -- GHC produces messages with UTF8 in them, so make sure the terminal doesn't error + hSetEncoding stdout utf8 + hSetEncoding stderr utf8 + + putStrLn $ "(haskell-language-server)Ghcide setup tester in " ++ dir ++ "." + putStrLn "Report bugs at https://github.com/haskell/haskell-language-server/issues" + programsOfInterest <- findProgramVersions + putStrLn "" + putStrLn "Tool versions found on the $PATH" + putStrLn $ showProgramVersionOfInterest programsOfInterest + + putStrLn $ "\nStep 1/4: Finding files to test in " ++ dir + files <- expandFiles (argFiles ++ ["." | null argFiles]) + -- LSP works with absolute file paths, so try and behave similarly + files <- nubOrd <$> mapM IO.canonicalizePath files + putStrLn $ "Found " ++ show (length files) ++ " files" + + putStrLn "\nStep 2/4: Looking for hie.yaml files that control setup" + cradles <- mapM findCradle files + let ucradles = nubOrd cradles + let n = length ucradles + putStrLn $ "Found " ++ show n ++ " cradle" ++ ['s' | n /= 1] + putStrLn "\nStep 3/4: Initializing the IDE" + vfs <- makeVFSHandle + debouncer <- newAsyncDebouncer + let dummyWithProg _ _ f = f (const (pure ())) + sessionLoader <- loadSession dir + ide <- initialise def mainRule (pure $ IdInt 0) (showEvent lock) dummyWithProg (const (const id)) (logger Info) debouncer (defaultIdeOptions sessionLoader) vfs + + putStrLn "\nStep 4/4: Type checking the files" + setFilesOfInterest ide $ HashSet.fromList $ map toNormalizedFilePath' files + results <- runAction "User TypeCheck" ide $ uses TypeCheck (map toNormalizedFilePath' files) + let (worked, failed) = partition fst $ zip (map isJust results) files + when (failed /= []) $ + putStr $ unlines $ "Files that failed:" : map ((++) " * " . snd) failed + + let files xs = let n = length xs in if n == 1 then "1 file" else show n ++ " files" + putStrLn $ "\nCompleted (" ++ files worked ++ " worked, " ++ files failed ++ " failed)" + unless (null failed) (exitWith $ ExitFailure (length failed)) + +expandFiles :: [FilePath] -> IO [FilePath] +expandFiles = concatMapM $ \x -> do + b <- IO.doesFileExist x + if b then return [x] else do + let recurse "." = True + recurse x | "." `isPrefixOf` takeFileName x = False -- skip .git etc + recurse x = takeFileName x `notElem` ["dist","dist-newstyle"] -- cabal directories + files <- filter (\x -> takeExtension x `elem` [".hs",".lhs"]) <$> IO.listFilesInside (return . recurse) x + when (null files) $ + fail $ "Couldn't find any .hs/.lhs files inside directory: " ++ x + return files + +-- | Print an LSP event. +showEvent :: Lock -> FromServerMessage -> IO () +showEvent _ (EventFileDiagnostics _ []) = return () +showEvent lock (EventFileDiagnostics (toNormalizedFilePath' -> file) diags) = + withLock lock $ T.putStrLn $ showDiagnosticsColored $ map (file,ShowDiag,) diags +showEvent lock e = withLock lock $ print e diff --git a/stack-8.10.1.yaml b/stack-8.10.1.yaml index e815f9324f..888d60fcf8 100644 --- a/stack-8.10.1.yaml +++ b/stack-8.10.1.yaml @@ -3,6 +3,7 @@ resolver: nightly-2020-08-08 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack-8.10.2.yaml b/stack-8.10.2.yaml index 2148d2d766..24f8f1168e 100644 --- a/stack-8.10.2.yaml +++ b/stack-8.10.2.yaml @@ -4,6 +4,7 @@ compiler: ghc-8.10.2 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack-8.6.4.yaml b/stack-8.6.4.yaml index 896254b08e..2cc17eaec7 100644 --- a/stack-8.6.4.yaml +++ b/stack-8.6.4.yaml @@ -4,6 +4,7 @@ compiler: ghc-8.6.4 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack-8.6.5.yaml b/stack-8.6.5.yaml index 605591b432..c54455901a 100644 --- a/stack-8.6.5.yaml +++ b/stack-8.6.5.yaml @@ -3,6 +3,7 @@ resolver: lts-14.27 # Last 8.6.5 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack-8.8.2.yaml b/stack-8.8.2.yaml index 131969fa4c..6d4016291f 100644 --- a/stack-8.8.2.yaml +++ b/stack-8.8.2.yaml @@ -3,6 +3,7 @@ resolver: lts-15.3 # Last 8.8.2 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack-8.8.3.yaml b/stack-8.8.3.yaml index c52d3afe2a..71878ec4bc 100644 --- a/stack-8.8.3.yaml +++ b/stack-8.8.3.yaml @@ -3,6 +3,7 @@ resolver: lts-16.5 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack-8.8.4.yaml b/stack-8.8.4.yaml index 08ce987d48..9b0522a21a 100644 --- a/stack-8.8.4.yaml +++ b/stack-8.8.4.yaml @@ -4,6 +4,7 @@ compiler: ghc-8.8.4 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock diff --git a/stack.yaml b/stack.yaml index 605591b432..c54455901a 100644 --- a/stack.yaml +++ b/stack.yaml @@ -3,6 +3,7 @@ resolver: lts-14.27 # Last 8.6.5 packages: - . - ./ghcide/ +- ./hls-plugin-api ghc-options: "$everything": -haddock