@@ -70,12 +70,13 @@ import Control.Monad.State (evalStateT, StateT, get, put)
7070import Control.Monad.Trans.Class (lift )
7171import Data.Foldable (forM_ )
7272import qualified Data.Map as Map
73- import Data.Maybe (fromMaybe )
73+ import Data.Maybe (fromMaybe , isJust )
7474import Data.Traversable (for )
7575import Data.Typeable (Typeable , cast )
7676import qualified Language.Haskell.TH as TH
7777import qualified Language.Haskell.TH.Quote as TH
7878import qualified Language.Haskell.TH.Syntax as TH
79+ import System.Environment (lookupEnv )
7980import System.IO.Unsafe (unsafePerformIO , unsafeDupablePerformIO )
8081import qualified Text.Parsec as Parsec
8182import qualified Text.Parsec.Pos as Parsec
@@ -319,12 +320,22 @@ inlineCode Code{..} = do
319320 void $ emitVerbatim $ out $ directive ++ codeDefs
320321 -- Create and add the FFI declaration.
321322 ffiImportName <- uniqueFfiImportName
322- dec <- if codeFunPtr
323- then
324- TH. forImpD TH. CCall codeCallSafety (" &" ++ codeFunName) ffiImportName [t | FunPtr $(codeType) |]
325- else TH. forImpD TH. CCall codeCallSafety codeFunName ffiImportName codeType
326- TH. addTopDecls [dec]
327- TH. varE ffiImportName
323+ -- Note [ghcide-support]
324+ -- haskell-language-server / ghcide cannot handle code that use
325+ -- `addForeignFile`/`addForeignSource` as we do here; it will result
326+ -- in linker errors during TH evaluations, see:
327+ -- <https://github.com/haskell/haskell-language-server/issues/365#issuecomment-976294466>
328+ -- Thus for GHCIDE, simply generate a call to `error` instead of a call to a foreign import.
329+ usingGhcide <- TH. runIO $ isJust <$> lookupEnv " __GHCIDE__"
330+ if usingGhcide
331+ then do
332+ [e |error "inline-c: A 'usingGhcide' inlineCode stub was evaluated -- this should not happen" :: $(if codeFunPtr then [t| FunPtr $(codeType) |] else codeType) | ]
333+ else do -- Actual foreign function call generation.
334+ dec <- if codeFunPtr
335+ then TH. forImpD TH. CCall codeCallSafety (" &" ++ codeFunName) ffiImportName [t | FunPtr $(codeType) |]
336+ else TH. forImpD TH. CCall codeCallSafety codeFunName ffiImportName codeType
337+ TH. addTopDecls [dec]
338+ TH. varE ffiImportName
328339
329340uniqueCName :: Maybe String -> TH. Q String
330341uniqueCName mbPostfix = do
0 commit comments