@@ -64,12 +64,13 @@ import Control.Monad.State (evalStateT, StateT, get, put)
6464import Control.Monad.Trans.Class (lift )
6565import Data.Foldable (forM_ )
6666import qualified Data.Map as Map
67- import Data.Maybe (fromMaybe )
67+ import Data.Maybe (fromMaybe , isJust )
6868import Data.Traversable (for )
6969import Data.Typeable (Typeable , cast )
7070import qualified Language.Haskell.TH as TH
7171import qualified Language.Haskell.TH.Quote as TH
7272import qualified Language.Haskell.TH.Syntax as TH
73+ import System.Environment (lookupEnv )
7374import System.IO.Unsafe (unsafePerformIO , unsafeDupablePerformIO )
7475import qualified Text.Parsec as Parsec
7576import qualified Text.Parsec.Pos as Parsec
@@ -298,12 +299,22 @@ inlineCode Code{..} = do
298299 void $ emitVerbatim $ out $ directive ++ codeDefs
299300 -- Create and add the FFI declaration.
300301 ffiImportName <- uniqueFfiImportName
301- dec <- if codeFunPtr
302- then
303- TH. forImpD TH. CCall codeCallSafety (" &" ++ codeFunName) ffiImportName [t | FunPtr $(codeType) |]
304- else TH. forImpD TH. CCall codeCallSafety codeFunName ffiImportName codeType
305- TH. addTopDecls [dec]
306- TH. varE ffiImportName
302+ -- Note [ghcide-support]
303+ -- haskell-language-server / ghcide cannot handle code that use
304+ -- `addForeignFile`/`addForeignSource` as we do here; it will result
305+ -- in linker errors during TH evaluations, see:
306+ -- <https://github.com/haskell/haskell-language-server/issues/365#issuecomment-976294466>
307+ -- Thus for GHCIDE, simply generate a call to `error` instead of a call to a foreign import.
308+ usingGhcide <- TH. runIO $ isJust <$> lookupEnv " __GHCIDE__"
309+ if usingGhcide
310+ then do
311+ [e |error "inline-c: A 'usingGhcide' inlineCode stub was evaluated -- this should not happen" :: $(if codeFunPtr then [t| FunPtr $(codeType) |] else codeType) | ]
312+ else do -- Actual foreign function call generation.
313+ dec <- if codeFunPtr
314+ then TH. forImpD TH. CCall codeCallSafety (" &" ++ codeFunName) ffiImportName [t | FunPtr $(codeType) |]
315+ else TH. forImpD TH. CCall codeCallSafety codeFunName ffiImportName codeType
316+ TH. addTopDecls [dec]
317+ TH. varE ffiImportName
307318
308319uniqueCName :: Maybe String -> TH. Q String
309320uniqueCName mbPostfix = do
0 commit comments