diff --git a/ghcide/bench/hist/Main.hs b/ghcide/bench/hist/Main.hs index 4fabc04da5..865c730aae 100644 --- a/ghcide/bench/hist/Main.hs +++ b/ghcide/bench/hist/Main.hs @@ -11,17 +11,17 @@ bench-results ├── - │  ├── ghc.path - path to ghc used to build the binary - │  ├── ghcide - binary for this version + │ ├── ghc.path - path to ghc used to build the binary + │ ├── ghcide - binary for this version ├─ │ ├── results.csv - aggregated results for all the versions │ └── - │   ├── .gcStats.log - RTS -s output - │   ├── .csv - stats for the experiment - │   ├── .svg - Graph of bytes over elapsed time - │   ├── .diff.svg - idem, including the previous version - │   ├── .log - ghcide-bench output - │   └── results.csv - results of all the experiments for the example + │ ├── .gcStats.log - RTS -s output + │ ├── .csv - stats for the experiment + │ ├── .svg - Graph of bytes over elapsed time + │ ├── .diff.svg - idem, including the previous version + │ ├── .log - ghcide-bench output + │ └── results.csv - results of all the experiments for the example ├── results.csv - aggregated results of all the experiments and versions └── .svg - graph of bytes over elapsed time, for all the included versions diff --git a/ghcide/src/Development/IDE/Core/Compile.hs b/ghcide/src/Development/IDE/Core/Compile.hs index fb519121e8..00ce78e2cd 100644 --- a/ghcide/src/Development/IDE/Core/Compile.hs +++ b/ghcide/src/Development/IDE/Core/Compile.hs @@ -35,7 +35,7 @@ import Development.IDE.Core.Preprocessor import Development.IDE.Core.RuleTypes import Development.IDE.Core.Shake import Development.IDE.GHC.Error -import Development.IDE.GHC.Orphans () +import Development.IDE.GHC.Orphans () import Development.IDE.GHC.Util import Development.IDE.GHC.Warnings import Development.IDE.Spans.Common @@ -43,21 +43,26 @@ import Development.IDE.Types.Diagnostics import Development.IDE.Types.Location import Development.IDE.Types.Options -import Development.IDE.GHC.Compat hiding (loadInterface, - parseHeader, parseModule, - tcRnModule, writeHieFile) -import qualified Development.IDE.GHC.Compat as Compat -import qualified Development.IDE.GHC.Compat as GHC -import qualified Development.IDE.GHC.Compat.Util as Util +import Development.IDE.GHC.Compat hiding + (loadInterface, + parseHeader, + parseModule, + tcRnModule, + writeHieFile) +import qualified Development.IDE.GHC.Compat as Compat +import qualified Development.IDE.GHC.Compat as GHC +import qualified Development.IDE.GHC.Compat.Util as Util import HieDb -import Language.LSP.Types (DiagnosticTag (..)) +import Language.LSP.Types (DiagnosticTag (..)) #if MIN_VERSION_ghc(8,10,0) -import Control.DeepSeq (force, liftRnf, rnf, rwhnf) +import Control.DeepSeq (force, liftRnf, + rnf, rwhnf) #else -import Control.DeepSeq (liftRnf, rnf, rwhnf) +import Control.DeepSeq (liftRnf, rnf, + rwhnf) import ErrUtils #endif @@ -69,59 +74,63 @@ import TcSplice #endif #if MIN_VERSION_ghc(9,2,0) -import qualified GHC.Types.Error as Error +import qualified GHC.Types.Error as Error #endif -import Control.Exception (evaluate) +import Control.Exception (evaluate) import Control.Exception.Safe -import Control.Lens hiding (List) +import Control.Lens hiding (List) import Control.Monad.Except import Control.Monad.Extra import Control.Monad.Trans.Except -import Data.Bifunctor (first, second) -import qualified Data.ByteString as BS -import qualified Data.DList as DL +import Data.Bifunctor (first, second) +import qualified Data.ByteString as BS +import qualified Data.DList as DL import Data.IORef -import qualified Data.IntMap.Strict as IntMap +import qualified Data.IntMap.Strict as IntMap import Data.List.Extra -import qualified Data.Map.Strict as Map +import qualified Data.Map.Strict as Map import Data.Maybe -import qualified Data.Text as T -import Data.Time (UTCTime, getCurrentTime) -import qualified GHC.LanguageExtensions as LangExt +import qualified Data.Text as T +import Data.Time (UTCTime, + getCurrentTime) +import qualified GHC.LanguageExtensions as LangExt import System.Directory import System.FilePath -import System.IO.Extra (fixIO, newTempFileWithin) +import System.IO.Extra (fixIO, + newTempFileWithin) --- GHC API imports -- GHC API imports #if MIN_VERSION_ghc(9,2,0) -import GHC (Anchor (anchor), - EpaComment (EpaComment), - EpaCommentTok (EpaBlockComment, EpaLineComment), - epAnnComments, - priorComments) -import GHC.Hs (LEpaComment) +import GHC (Anchor (anchor), + EpaComment (EpaComment), + EpaCommentTok (EpaBlockComment, EpaLineComment), + epAnnComments, + priorComments) +import GHC.Hs (LEpaComment) #endif -import GHC (GetDocsFailure (..), - mgModSummaries, - parsedSource) +import GHC (GetDocsFailure (..), + mgModSummaries, + parsedSource) import Control.Concurrent.Extra -import Control.Concurrent.STM.Stats hiding (orElse) -import Data.Aeson (toJSON) +import Control.Concurrent.STM.Stats hiding (orElse) +import Data.Aeson (toJSON) import Data.Binary import Data.Coerce import Data.Functor -import qualified Data.HashMap.Strict as HashMap -import Data.IntMap (IntMap) -import Data.Map (Map) -import Data.Tuple.Extra (dupe) -import Data.Unique as Unique -import Development.IDE.Core.Tracing (withTrace) -import Development.IDE.GHC.Compat.Util (emptyUDFM, plusUDFM_C) -import qualified Language.LSP.Server as LSP -import qualified Language.LSP.Types as LSP +import qualified Data.HashMap.Strict as HashMap +import Data.IntMap (IntMap) +import Data.Map (Map) +import Data.Tuple.Extra (dupe) +import Data.Unique as Unique +import Development.IDE.Core.Tracing (withTrace) +import Development.IDE.GHC.Compat.Util (emptyUDFM, + plusUDFM_C, + stringToStringBuffer) +import Language.Haskell.GHC.ExactPrint.Preprocess (stripLinePragmas) +import qualified Language.LSP.Server as LSP +import qualified Language.LSP.Types as LSP import Unsafe.Coerce -- | Given a string buffer, return the string (after preprocessing) and the 'ParsedModule'. @@ -130,7 +139,7 @@ parseModule -> HscEnv -> FilePath -> ModSummary - -> IO (IdeResult ParsedModule) + -> IO (IdeResult ParsedModuleWithExtraComments) parseModule IdeOptions{..} env filename ms = fmap (either (, Nothing) id) $ runExceptT $ do @@ -423,7 +432,7 @@ hideDiag originalFlags (Reason warning, (nfp, _sh, fd)) = (Reason warning, (nfp, HideDiag, fd)) hideDiag _originalFlags t = t --- | Warnings which lead to a diagnostic tag +-- | Warnings which lead to a diagnostic tag unnecessaryDeprecationWarningFlags :: [WarningFlag] unnecessaryDeprecationWarningFlags = [ Opt_WarnUnusedTopBinds @@ -872,69 +881,70 @@ parseFileContents -> (GHC.ParsedSource -> IdePreprocessedSource) -> FilePath -- ^ the filename (for source locations) -> ModSummary - -> ExceptT [FileDiagnostic] IO ([FileDiagnostic], ParsedModule) + -> ExceptT [FileDiagnostic] IO ([FileDiagnostic], ParsedModuleWithExtraComments) parseFileContents env customPreprocessor filename ms = do - let loc = mkRealSrcLoc (Util.mkFastString filename) 1 1 - dflags = ms_hspp_opts ms - contents = fromJust $ ms_hspp_buf ms - case unP Compat.parseModule (initParserState (initParserOpts dflags) contents loc) of - PFailedWithErrorMessages msgs -> throwE $ diagFromErrMsgs "parser" dflags $ msgs dflags - POk pst rdr_module -> - let - hpm_annotations = mkApiAnns pst - (warns, errs) = getMessages' pst dflags - in - do - -- Just because we got a `POk`, it doesn't mean there - -- weren't errors! To clarify, the GHC parser - -- distinguishes between fatal and non-fatal - -- errors. Non-fatal errors are the sort that don't - -- prevent parsing from continuing (that is, a parse - -- tree can still be produced despite the error so that - -- further errors/warnings can be collected). Fatal - -- errors are those from which a parse tree just can't - -- be produced. - unless (null errs) $ - throwE $ diagFromErrMsgs "parser" dflags errs - - -- Ok, we got here. It's safe to continue. - let IdePreprocessedSource preproc_warns errs parsed = customPreprocessor rdr_module - - unless (null errs) $ - throwE $ diagFromStrings "parser" DsError errs - - let preproc_warnings = diagFromStrings "parser" DsWarning preproc_warns - parsed' <- liftIO $ applyPluginsParsedResultAction env dflags ms hpm_annotations parsed - - -- To get the list of extra source files, we take the list - -- that the parser gave us, - -- - eliminate files beginning with '<'. gcc likes to use - -- pseudo-filenames like "" and "" - -- - normalise them (eliminate differences between ./f and f) - -- - filter out the preprocessed source file - -- - filter out anything beginning with tmpdir - -- - remove duplicates - -- - filter out the .hs/.lhs source filename if we have one - -- - let n_hspp = normalise filename - srcs0 = nubOrd $ filter (not . (tmpDir dflags `isPrefixOf`)) - $ filter (/= n_hspp) - $ map normalise - $ filter (not . isPrefixOf "<") - $ map Util.unpackFS - $ srcfiles pst - srcs1 = case ml_hs_file (ms_location ms) of - Just f -> filter (/= normalise f) srcs0 - Nothing -> srcs0 - - -- sometimes we see source files from earlier - -- preprocessing stages that cannot be found, so just - -- filter them out: - srcs2 <- liftIO $ filterM doesFileExist srcs1 - - let pm = ParsedModule ms parsed' srcs2 hpm_annotations - warnings = diagFromErrMsgs "parser" dflags warns - pure (warnings ++ preproc_warnings, pm) + let loc = mkRealSrcLoc (Util.mkFastString filename) 1 1 + dflags = ms_hspp_opts ms + contents = stringBufferToString . fromJust $ ms_hspp_buf ms + (contents', extraComments) = stripLinePragmas contents + case unP Compat.parseModule (initParserState (initParserOpts dflags) (stringToStringBuffer contents') loc) of + PFailedWithErrorMessages msgs -> throwE $ diagFromErrMsgs "parser" dflags $ msgs dflags + POk pst rdr_module -> + let + hpm_annotations = mkApiAnns pst + (warns, errs) = getMessages' pst dflags + in + do + -- Just because we got a `POk`, it doesn't mean there + -- weren't errors! To clarify, the GHC parser + -- distinguishes between fatal and non-fatal + -- errors. Non-fatal errors are the sort that don't + -- prevent parsing from continuing (that is, a parse + -- tree can still be produced despite the error so that + -- further errors/warnings can be collected). Fatal + -- errors are those from which a parse tree just can't + -- be produced. + unless (null errs) $ + throwE $ diagFromErrMsgs "parser" dflags errs + + -- Ok, we got here. It's safe to continue. + let IdePreprocessedSource preproc_warns errs parsed = customPreprocessor rdr_module + + unless (null errs) $ + throwE $ diagFromStrings "parser" DsError errs + + let preproc_warnings = diagFromStrings "parser" DsWarning preproc_warns + parsed' <- liftIO $ applyPluginsParsedResultAction env dflags ms hpm_annotations parsed + + -- To get the list of extra source files, we take the list + -- that the parser gave us, + -- - eliminate files beginning with '<'. gcc likes to use + -- pseudo-filenames like "" and "" + -- - normalise them (eliminate differences between ./f and f) + -- - filter out the preprocessed source file + -- - filter out anything beginning with tmpdir + -- - remove duplicates + -- - filter out the .hs/.lhs source filename if we have one + -- + let n_hspp = normalise filename + srcs0 = nubOrd $ filter (not . (tmpDir dflags `isPrefixOf`)) + $ filter (/= n_hspp) + $ map normalise + $ filter (not . isPrefixOf "<") + $ map Util.unpackFS + $ srcfiles pst + srcs1 = case ml_hs_file (ms_location ms) of + Just f -> filter (/= normalise f) srcs0 + Nothing -> srcs0 + + -- sometimes we see source files from earlier + -- preprocessing stages that cannot be found, so just + -- filter them out: + srcs2 <- liftIO $ filterM doesFileExist srcs1 + + let pm = ParsedModule ms parsed' srcs2 hpm_annotations + warnings = diagFromErrMsgs "parser" dflags warns + pure (warnings ++ preproc_warnings, ParsedModuleWithExtraComments pm extraComments) loadHieFile :: Compat.NameCacheUpdater -> FilePath -> IO GHC.HieFile loadHieFile ncu f = do diff --git a/ghcide/src/Development/IDE/Core/RuleTypes.hs b/ghcide/src/Development/IDE/Core/RuleTypes.hs index 5b14d9b4e8..c80eb12db5 100644 --- a/ghcide/src/Development/IDE/Core/RuleTypes.hs +++ b/ghcide/src/Development/IDE/Core/RuleTypes.hs @@ -1,6 +1,7 @@ -- Copyright (c) 2019 The DAML Authors. All rights reserved. -- SPDX-License-Identifier: Apache-2.0 +{-# LANGUAGE CPP #-} {-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE GADTs #-} @@ -45,6 +46,11 @@ import Development.IDE.Types.Diagnostics import GHC.Serialized (Serialized) import Language.LSP.Types (Int32, NormalizedFilePath) +#if MIN_VERSION_ghc(9,2,0) +import GHC (LEpaComment) +#else +import Language.Haskell.GHC.ExactPrint (Comment) +#endif data LinkableType = ObjectLinkable | BCOLinkable deriving (Eq,Ord,Show, Generic) @@ -70,6 +76,24 @@ type instance RuleResult GetParsedModule = ParsedModule -- all comments included using Opt_KeepRawTokenStream type instance RuleResult GetParsedModuleWithComments = ParsedModule +type instance RuleResult GetParsedModuleWithExtraComments = ParsedModuleWithExtraComments + +data ParsedModuleWithExtraComments = ParsedModuleWithExtraComments !ParsedModule +#if MIN_VERSION_ghc(9,2,0) + ![LEpaComment] +#else + ![Comment] + deriving Show +#endif + +#if MIN_VERSION_ghc(9,2,0) +instance Show ParsedModuleWithExtraComments where + show (ParsedModuleWithExtraComments pm _) = show pm +#endif + +instance NFData ParsedModuleWithExtraComments where + rnf (ParsedModuleWithExtraComments pm _) = deepseq pm () + -- | The dependency information produced by following the imports recursively. -- This rule will succeed even if there is an error, e.g., a module could not be located, -- a module could not be parsed or an import cycle. @@ -356,6 +380,12 @@ data GetParsedModuleWithComments = GetParsedModuleWithComments instance Hashable GetParsedModuleWithComments instance NFData GetParsedModuleWithComments +data GetParsedModuleWithExtraComments = GetParsedModuleWithExtraComments + deriving (Eq, Show, Typeable, Generic) + +instance Hashable GetParsedModuleWithExtraComments +instance NFData GetParsedModuleWithExtraComments + data GetLocatedImports = GetLocatedImports deriving (Eq, Show, Typeable, Generic) instance Hashable GetLocatedImports diff --git a/ghcide/src/Development/IDE/Core/Rules.hs b/ghcide/src/Development/IDE/Core/Rules.hs index ba4bec4e50..1a0832a54c 100644 --- a/ghcide/src/Development/IDE/Core/Rules.hs +++ b/ghcide/src/Development/IDE/Core/Rules.hs @@ -150,6 +150,7 @@ import Control.Concurrent.STM.Stats (atomically) import Language.LSP.Server (LspT) import System.Info.Extra (isWindows) import HIE.Bios.Ghc.Gap (hostIsDynamic) +import Language.Haskell.GHC.ExactPrint (Comment) templateHaskellInstructions :: T.Text templateHaskellInstructions = "https://haskell-language-server.readthedocs.io/en/latest/troubleshooting.html#static-binaries" @@ -281,20 +282,27 @@ mergeParseErrorsHaddock normal haddock = normal ++ -- including keywords, punctuation and comments. -- So it is suitable for use cases where you need a perfect edit. getParsedModuleWithCommentsRule :: Rules () -getParsedModuleWithCommentsRule = +getParsedModuleWithCommentsRule = do -- The parse diagnostics are owned by the GetParsedModule rule -- For this reason, this rule does not produce any diagnostics - defineNoDiagnostics $ \GetParsedModuleWithComments file -> do - ModSummaryResult{msrModSummary = ms} <- use_ GetModSummary file - sess <- use_ GhcSession file - opt <- getIdeOptions + defineNoDiagnostics $ \GetParsedModuleWithExtraComments file -> do + ModSummaryResult{msrModSummary = ms} <- use_ GetModSummary file + sess <- use_ GhcSession file + opt <- getIdeOptions - let ms' = withoutOption Opt_Haddock $ withOption Opt_KeepRawTokenStream ms - modify_dflags <- getModifyDynFlags dynFlagsModifyParser - let ms = ms' { ms_hspp_opts = modify_dflags $ ms_hspp_opts ms' } - reset_ms pm = pm { pm_mod_summary = ms' } + let ms' = withoutOption Opt_Haddock $ withOption Opt_KeepRawTokenStream ms + modify_dflags <- getModifyDynFlags dynFlagsModifyParser + let ms = ms' { ms_hspp_opts = modify_dflags $ ms_hspp_opts ms' } + reset_ms pm = pm { pm_mod_summary = ms' } + + (_, pm) <- liftIO $ getParsedModuleDefinitionWithComments (hscEnv sess) opt file ms + pure $ case pm of + Nothing -> Nothing + Just (ParsedModuleWithExtraComments pm' extraComments) -> + Just $ ParsedModuleWithExtraComments (reset_ms pm') extraComments - liftIO $ fmap (fmap reset_ms) $ snd <$> getParsedModuleDefinition (hscEnv sess) opt file ms + defineNoDiagnostics $ \GetParsedModuleWithComments file -> + Just . (\(ParsedModuleWithExtraComments pm _) -> pm) <$> use_ GetParsedModuleWithExtraComments file getModifyDynFlags :: (DynFlagsModifications -> a) -> Action a getModifyDynFlags f = do @@ -303,17 +311,25 @@ getModifyDynFlags f = do pure $ f $ optModifyDynFlags opts cfg +getParsedModuleDefinitionWithComments + :: HscEnv + -> IdeOptions + -> NormalizedFilePath + -> ModSummary + -> IO ([FileDiagnostic], Maybe ParsedModuleWithExtraComments) +getParsedModuleDefinitionWithComments packageState opt file ms = do + let fp = fromNormalizedFilePath file + parseModule opt packageState fp ms + getParsedModuleDefinition :: HscEnv -> IdeOptions -> NormalizedFilePath - -> ModSummary -> IO ([FileDiagnostic], Maybe ParsedModule) + -> ModSummary + -> IO ([FileDiagnostic], Maybe ParsedModule) getParsedModuleDefinition packageState opt file ms = do - let fp = fromNormalizedFilePath file - (diag, res) <- parseModule opt packageState fp ms - case res of - Nothing -> pure (diag, Nothing) - Just modu -> pure (diag, Just modu) + (diag, pm) <- getParsedModuleDefinitionWithComments packageState opt file ms + pure (diag, (\(ParsedModuleWithExtraComments pm _) -> pm) <$> pm) getLocatedImportsRule :: Rules () getLocatedImportsRule = diff --git a/ghcide/src/Development/IDE/GHC/Compat.hs b/ghcide/src/Development/IDE/GHC/Compat.hs index 76c5c055dd..448803ada9 100644 --- a/ghcide/src/Development/IDE/GHC/Compat.hs +++ b/ghcide/src/Development/IDE/GHC/Compat.hs @@ -187,7 +187,7 @@ pattern PFailedWithErrorMessages msgs mkPlainErrMsgIfPFailed (PFailed _ pst err) = Just (\dflags -> mkPlainErrMsg dflags pst err) mkPlainErrMsgIfPFailed _ = Nothing #endif -{-# COMPLETE PFailedWithErrorMessages #-} +{-# COMPLETE PFailedWithErrorMessages, POk #-} supportsHieFiles :: Bool supportsHieFiles = True diff --git a/ghcide/src/Development/IDE/GHC/ExactPrint.hs b/ghcide/src/Development/IDE/GHC/ExactPrint.hs index 1c258ddd78..4e050ae32d 100644 --- a/ghcide/src/Development/IDE/GHC/ExactPrint.hs +++ b/ghcide/src/Development/IDE/GHC/ExactPrint.hs @@ -47,7 +47,7 @@ module Development.IDE.GHC.ExactPrint where import Control.Applicative (Alternative) -import Control.Arrow (right, (***)) +import Control.Arrow ((***)) import Control.Monad import qualified Control.Monad.Fail as Fail import Control.Monad.IO.Class (MonadIO) @@ -65,7 +65,6 @@ import Data.Monoid (All (All), getAll) import qualified Data.Text as T import Data.Traversable (for) import Development.IDE.Core.RuleTypes -import Development.IDE.Core.Service (runAction) import Development.IDE.Core.Shake import Development.IDE.GHC.Compat hiding (parseImport, parsePattern, @@ -110,15 +109,16 @@ type instance RuleResult GetAnnotatedParsedSource = Annotated ParsedSource -- | Get the latest version of the annotated parse source with comments. getAnnotatedParsedSourceRule :: Rules () getAnnotatedParsedSourceRule = define $ \GetAnnotatedParsedSource nfp -> do - pm <- use GetParsedModuleWithComments nfp + pm <- use GetParsedModuleWithExtraComments nfp return ([], fmap annotateParsedSource pm) +annotateParsedSource :: ParsedModuleWithExtraComments -> Annotated ParsedSource #if MIN_VERSION_ghc(9,2,0) -annotateParsedSource :: ParsedModule -> Annotated ParsedSource -annotateParsedSource (ParsedModule _ ps _ _) = unsafeMkA (makeDeltaAst ps) 0 +annotateParsedSource (ParsedModuleWithExtraComments (ParsedModule _ ps _ _) _) = unsafeMkA (makeDeltaAst ps) 0 #else -annotateParsedSource :: ParsedModule -> Annotated ParsedSource -annotateParsedSource = fixAnns +annotateParsedSource (ParsedModuleWithExtraComments ParsedModule {..} extraComments) = + let ranns = relativiseApiAnnsWithComments extraComments pm_parsed_source pm_annotations + in unsafeMkA pm_parsed_source ranns 0 #endif ------------------------------------------------------------------------------ @@ -471,13 +471,8 @@ instance p ~ GhcPs => ASTElement AnnListItem (HsExpr p) where graft = graftExpr instance p ~ GhcPs => ASTElement AnnListItem (Pat p) where -#if __GLASGOW_HASKELL__ == 808 - parseAST = fmap (fmap $ right $ second dL) . parsePattern - maybeParensAST = dL . parenthesizePat appPrec . unLoc -#else parseAST = parsePattern maybeParensAST = parenthesizePat appPrec -#endif instance p ~ GhcPs => ASTElement AnnListItem (HsType p) where parseAST = parseType @@ -497,16 +492,6 @@ instance ASTElement NameAnn RdrName where ------------------------------------------------------------------------------ -#if !MIN_VERSION_ghc(9,2,0) --- | Dark magic I stole from retrie. No idea what it does. -fixAnns :: ParsedModule -> Annotated ParsedSource -fixAnns ParsedModule {..} = - let ranns = relativiseApiAnns pm_parsed_source pm_annotations - in unsafeMkA pm_parsed_source ranns 0 -#endif - ------------------------------------------------------------------------------- - -- | Given an 'LHSExpr', compute its exactprint annotations. -- Note that this function will throw away any existing annotations (and format) annotate :: (ASTElement l ast, Outputable l) diff --git a/ghcide/src/Development/IDE/GHC/Util.hs b/ghcide/src/Development/IDE/GHC/Util.hs index 4e002b13ec..2ee2a886ec 100644 --- a/ghcide/src/Development/IDE/GHC/Util.hs +++ b/ghcide/src/Development/IDE/GHC/Util.hs @@ -14,6 +14,7 @@ module Development.IDE.GHC.Util( ParseResult(..), runParser, lookupPackageConfig, textToStringBuffer, + stringBufferToString, bytestringToStringBuffer, stringBufferToByteString, moduleImportPath, @@ -52,6 +53,7 @@ import Control.Concurrent import Control.Exception as E import Data.Binary.Put (Put, runPut) import qualified Data.ByteString as BS +import qualified Data.ByteString.Char8 as Char8 import Data.ByteString.Internal (ByteString (..)) import qualified Data.ByteString.Internal as BS import qualified Data.ByteString.Lazy as LBS @@ -116,6 +118,9 @@ lookupPackageConfig unit env = textToStringBuffer :: T.Text -> StringBuffer textToStringBuffer = stringToStringBuffer . T.unpack +stringBufferToString :: StringBuffer -> String +stringBufferToString = Char8.unpack . stringBufferToByteString + runParser :: DynFlags -> String -> P a -> ParseResult a runParser flags str parser = unP parser parseState where diff --git a/ghcide/src/Development/IDE/Plugin/Completions/Logic.hs b/ghcide/src/Development/IDE/Plugin/Completions/Logic.hs index b7a538abad..bd73c5b462 100644 --- a/ghcide/src/Development/IDE/Plugin/Completions/Logic.hs +++ b/ghcide/src/Development/IDE/Plugin/Completions/Logic.hs @@ -384,7 +384,7 @@ cacheDataProducer uri env curMod globalEnv inScopeEnv limports = do -- we don't want to extend import if it's already in scope guard . null $ lookupGRE_Name inScopeEnv n -- or if it doesn't have a real location - loc <- realSpan $ is_dloc spec + loc <- realSpan $ is_dloc spec Map.lookup loc importMap compItem <- toCompItem par curMod (ppr $ is_mod spec) n originalImportDecl let unqual diff --git a/ghcide/src/Development/IDE/Spans/Common.hs b/ghcide/src/Development/IDE/Spans/Common.hs index 0a60120138..df55c78062 100644 --- a/ghcide/src/Development/IDE/Spans/Common.hs +++ b/ghcide/src/Development/IDE/Spans/Common.hs @@ -62,7 +62,7 @@ safeTyThingId _ = Nothing -- Possible documentation for an element in the code data SpanDoc = SpanDocString HsDocString SpanDocUris - | SpanDocText [T.Text] SpanDocUris + | SpanDocText [T.Text] SpanDocUris deriving stock (Eq, Show, Generic) deriving anyclass NFData diff --git a/ghcide/src/Development/IDE/Types/Diagnostics.hs b/ghcide/src/Development/IDE/Types/Diagnostics.hs index 1420995be7..adf87ae88c 100644 --- a/ghcide/src/Development/IDE/Types/Diagnostics.hs +++ b/ghcide/src/Development/IDE/Types/Diagnostics.hs @@ -67,7 +67,7 @@ ideErrorWithSource source sev fp msg = (fp, ShowDiag, LSP.Diagnostic { _tags = Nothing }) --- | Defines whether a particular diagnostic should be reported +-- | Defines whether a particular diagnostic should be reported -- back to the user. -- -- One important use case is "missing signature" code lenses, diff --git a/ghcide/test/data/import-placement/LangPragmaModuleAtTop.expected.hs b/ghcide/test/data/import-placement/LangPragmaModuleAtTop.expected.hs index e7ea2779dd..072a944911 100644 --- a/ghcide/test/data/import-placement/LangPragmaModuleAtTop.expected.hs +++ b/ghcide/test/data/import-placement/LangPragmaModuleAtTop.expected.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Test where import Data.Monoid diff --git a/ghcide/test/data/import-placement/LangPragmaModuleAtTop.hs b/ghcide/test/data/import-placement/LangPragmaModuleAtTop.hs index 52ac5ac564..6f533ffdb2 100644 --- a/ghcide/test/data/import-placement/LangPragmaModuleAtTop.hs +++ b/ghcide/test/data/import-placement/LangPragmaModuleAtTop.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Test where diff --git a/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.expected.hs b/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.expected.hs index 097c3d2c56..4fd15e3211 100644 --- a/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.expected.hs +++ b/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.expected.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Test ( SomeData(..) diff --git a/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.hs b/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.hs index e528c43343..1717cec0e4 100644 --- a/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.hs +++ b/ghcide/test/data/import-placement/LangPragmaModuleExplicitExports.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Test ( SomeData(..) diff --git a/ghcide/test/data/import-placement/LangPragmaModuleWithComment.expected.hs b/ghcide/test/data/import-placement/LangPragmaModuleWithComment.expected.hs index ad8e7aa4f1..507ac0e64d 100644 --- a/ghcide/test/data/import-placement/LangPragmaModuleWithComment.expected.hs +++ b/ghcide/test/data/import-placement/LangPragmaModuleWithComment.expected.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Test ( SomeData(..) diff --git a/ghcide/test/data/import-placement/LangPragmaModuleWithComment.hs b/ghcide/test/data/import-placement/LangPragmaModuleWithComment.hs index bac9db1cd6..d4982cfb0b 100644 --- a/ghcide/test/data/import-placement/LangPragmaModuleWithComment.hs +++ b/ghcide/test/data/import-placement/LangPragmaModuleWithComment.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} module Test ( SomeData(..) diff --git a/ghcide/test/data/import-placement/LanguagePragmaAtTop.expected.hs b/ghcide/test/data/import-placement/LanguagePragmaAtTop.expected.hs index 970f8dee59..1aa022f193 100644 --- a/ghcide/test/data/import-placement/LanguagePragmaAtTop.expected.hs +++ b/ghcide/test/data/import-placement/LanguagePragmaAtTop.expected.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} import Data.Monoid class Semigroup a => SomeData a diff --git a/ghcide/test/data/import-placement/LanguagePragmaAtTop.hs b/ghcide/test/data/import-placement/LanguagePragmaAtTop.hs index 2d679bd537..63fbff5daa 100644 --- a/ghcide/test/data/import-placement/LanguagePragmaAtTop.hs +++ b/ghcide/test/data/import-placement/LanguagePragmaAtTop.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} class Semigroup a => SomeData a diff --git a/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.expected.hs b/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.expected.hs index 3e6fc76050..c6c5bc2d6f 100644 --- a/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.expected.hs +++ b/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.expected.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} import Data.Monoid -- | comment diff --git a/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.hs b/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.hs index df1f85126b..91b7f73ec7 100644 --- a/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.hs +++ b/ghcide/test/data/import-placement/LanguagePragmaAtTopWithComment.hs @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE OverloadedStrings #-} -- | comment class Semigroup a => SomeData a diff --git a/ghcide/test/data/import-placement/MultiLinePragma.expected.hs b/ghcide/test/data/import-placement/MultiLinePragma.expected.hs index ca0b9f28dc..61b333a464 100644 --- a/ghcide/test/data/import-placement/MultiLinePragma.expected.hs +++ b/ghcide/test/data/import-placement/MultiLinePragma.expected.hs @@ -1,6 +1,6 @@ {-# OPTIONS_GHC -Wall #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RecordWildCards, +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards, OverloadedStrings #-} {-# OPTIONS_GHC -Wall, -Wno-unused-imports #-} diff --git a/ghcide/test/data/import-placement/MultiLinePragma.hs b/ghcide/test/data/import-placement/MultiLinePragma.hs index e3e6187193..5f7cd28ecf 100644 --- a/ghcide/test/data/import-placement/MultiLinePragma.hs +++ b/ghcide/test/data/import-placement/MultiLinePragma.hs @@ -1,6 +1,6 @@ {-# OPTIONS_GHC -Wall #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RecordWildCards, +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE RecordWildCards, OverloadedStrings #-} {-# OPTIONS_GHC -Wall, -Wno-unused-imports #-} diff --git a/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.expected.hs b/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.expected.hs index 94ed4397a4..0ca1ee0d8b 100644 --- a/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.expected.hs +++ b/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.expected.hs @@ -1,6 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE RankNTypes #-} import Data.Monoid -- some comment diff --git a/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.hs b/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.hs index 352c2b2763..73afaa048f 100644 --- a/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.hs +++ b/ghcide/test/data/import-placement/MultipleLanguagePragmasNoModuleDeclaration.hs @@ -1,6 +1,6 @@ {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE DataKinds #-} -{-# LANGUAGE RankNTypes #-} +{-# LANGUAGE DataKinds #-} +{-# LANGUAGE RankNTypes #-} -- some comment class Semigroup a => SomeData a diff --git a/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.expected.hs b/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.expected.hs index 912d6a210c..b577520d10 100644 --- a/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.expected.hs +++ b/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.expected.hs @@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} import Data.Monoid @@ -10,7 +10,7 @@ import Data.Monoid class Semigroup a => SomeData a instance SomeData All -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.hs b/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.hs index 9b49dacfba..b6930465f7 100644 --- a/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.hs +++ b/ghcide/test/data/import-placement/OptionsNotAtTopWithSpaces.hs @@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} @@ -9,7 +9,7 @@ class Semigroup a => SomeData a instance SomeData All -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.expected.hs b/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.expected.hs index 55a6c60dbb..dd4e665689 100644 --- a/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.expected.hs +++ b/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.expected.hs @@ -2,7 +2,7 @@ import Data.Monoid class Semigroup a => SomeData a instance SomeData All -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.hs b/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.hs index ad7c01f4e7..213a935640 100644 --- a/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.hs +++ b/ghcide/test/data/import-placement/OptionsPragmaNotAtTop.hs @@ -1,7 +1,7 @@ class Semigroup a => SomeData a instance SomeData All -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.expected.hs b/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.expected.hs index eead1cb55e..c59a58e356 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.expected.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.expected.hs @@ -4,11 +4,11 @@ OPTIONS_GHC -Wno-unrecognised-pragmas #-} -- another comment -- oh -{- multi line +{- multi line comment -} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} import Data.Monoid {- some comment -} @@ -17,7 +17,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.hs b/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.hs index 306af5aa71..6e85ec35cd 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopMultipleComments.hs @@ -4,11 +4,11 @@ OPTIONS_GHC -Wno-unrecognised-pragmas #-} -- another comment -- oh -{- multi line +{- multi line comment -} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} {- some comment -} -- again @@ -16,7 +16,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.expected.hs b/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.expected.hs index 57fc1614be..14b81d5cc0 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.expected.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.expected.hs @@ -3,7 +3,7 @@ {-# OPTIONS_GHC -Wall #-} -- another comment -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} import Data.Monoid {- some comment -} @@ -12,7 +12,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.hs b/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.hs index c50fe08c85..6c41845fd6 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopWithCommentsAtTop.hs @@ -3,7 +3,7 @@ {-# OPTIONS_GHC -Wall #-} -- another comment -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} {- some comment -} @@ -11,7 +11,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.expected.hs b/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.expected.hs index f2525d60e8..9cd6792431 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.expected.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.expected.hs @@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_GHC -Wall #-} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} module Test ( SomeData(..) ) where @@ -13,7 +13,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.hs b/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.hs index 849c029069..e7d4d3a1dd 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopWithImports.hs @@ -1,7 +1,7 @@ {-# LANGUAGE OverloadedStrings #-} {-# OPTIONS_GHC -Wall #-} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} module Test ( SomeData(..) ) where @@ -12,7 +12,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.expected.hs b/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.expected.hs index d62e2e32f1..83dab7649f 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.expected.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.expected.hs @@ -3,7 +3,7 @@ {-# OPTIONS_GHC -Wall #-} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} module Test ( SomeData(..) ) where @@ -16,7 +16,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.hs b/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.hs index 6115d25973..de7c931c6c 100644 --- a/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.hs +++ b/ghcide/test/data/import-placement/PragmaNotAtTopWithModuleDecl.hs @@ -3,7 +3,7 @@ {-# OPTIONS_GHC -Wall #-} -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} module Test ( SomeData(..) ) where @@ -15,7 +15,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.expected.hs b/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.expected.hs index 4c6cbe3917..8979cea6ce 100644 --- a/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.expected.hs +++ b/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.expected.hs @@ -5,7 +5,7 @@ -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} import Data.Monoid @@ -15,7 +15,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.hs b/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.hs index df312b2044..250ca221c0 100644 --- a/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.hs +++ b/ghcide/test/data/import-placement/ShebangNotAtTopWithSpaces.hs @@ -5,7 +5,7 @@ -{-# LANGUAGE TupleSections #-} +{-# LANGUAGE TupleSections #-} @@ -14,7 +14,7 @@ class Semigroup a => SomeData a instance SomeData All #! nix-shell --pure -i runghc -p "haskellPackages.ghcWithPackages (hp: with hp; [ turtle ])" -{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} +{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-} addOne :: Int -> Int addOne x = x + 1 diff --git a/ghcide/test/exe/Main.hs b/ghcide/test/exe/Main.hs index 1189fc1354..978c0602df 100644 --- a/ghcide/test/exe/Main.hs +++ b/ghcide/test/exe/Main.hs @@ -55,12 +55,12 @@ import Development.IDE.Test (Cursor, flushMessages, getInterfaceFilesDir, getStoredKeys, + isReferenceReady, + referenceReady, standardizeQuotes, waitForAction, waitForGC, - waitForTypecheck, - isReferenceReady, - referenceReady) + waitForTypecheck) import Development.IDE.Test.Runfiles import qualified Development.IDE.Types.Diagnostics as Diagnostics import Development.IDE.Types.Location @@ -1812,6 +1812,29 @@ extendImportTests = testGroup "extend import actions" , "f :: Foo" , "f = undefined" ]) + , testSession "shebang inside import declaration" $ template + [("ModuleA.hs", T.unlines + [ "module ModuleA where" + , "data Foo = Foo" + ])] + ("ModuleB.hs", T.unlines + [ "module ModuleB where" + , "import ModuleA" + , "#! a shebang line" + , " ()" + , "f :: Foo" + , "f = undefined" + ]) + (Range (Position 4 4) (Position 4 6)) + ["Add Foo to the import list of ModuleA"] + (T.unlines + [ "module ModuleB where" + , "import ModuleA" + , "#! a shebang line" + , " (Foo)" + , "f :: Foo" + , "f = undefined" + ]) ] where codeActionTitle CodeAction{_title=x} = x @@ -5587,7 +5610,7 @@ bootTests = testGroup "boot" hoverResponseOrReadyMessage <- skipManyTill anyMessage ((Left <$> parseHoverResponse) <|> (Right <$> parseReadyMessage)) _ <- skipManyTill anyMessage $ case hoverResponseOrReadyMessage of - Left _ -> void parseReadyMessage + Left _ -> void parseReadyMessage Right _ -> void parseHoverResponse closeDoc cDoc cdoc <- createDoc cPath "haskell" cSource diff --git a/plugins/hls-splice-plugin/src/Ide/Plugin/Splice.hs b/plugins/hls-splice-plugin/src/Ide/Plugin/Splice.hs index 14ce391783..a5fc75b0de 100644 --- a/plugins/hls-splice-plugin/src/Ide/Plugin/Splice.hs +++ b/plugins/hls-splice-plugin/src/Ide/Plugin/Splice.hs @@ -207,7 +207,7 @@ setupHscEnv ideState fp pm = do liftIO $ runAction "expandTHSplice.fallback.ghcSessionDeps" ideState $ use_ GhcSessionDeps fp - let ps = annotateParsedSource pm + let ps = annotateParsedSource (pm, []) hscEnv0 = hscEnvWithImportPaths hscEnvEq modSum = pm_mod_summary pm hscEnv <- liftIO $ setupDynFlagsForGHCiLike hscEnv0 $ ms_hspp_opts modSum