Add valid refinement substitution suggestions for typed holes
[ghc.git] / compiler / typecheck / TcAnnotations.hs
index 7b3cc65..edf696e 100644 (file)
 
 module TcAnnotations ( tcAnnotations, annCtxt ) where
 
 
 module TcAnnotations ( tcAnnotations, annCtxt ) where
 
+import GhcPrelude
+
 import {-# SOURCE #-} TcSplice ( runAnnotation )
 import Module
 import DynFlags
 import Control.Monad ( when )
 
 import HsSyn
 import {-# SOURCE #-} TcSplice ( runAnnotation )
 import Module
 import DynFlags
 import Control.Monad ( when )
 
 import HsSyn
-import Annotations
 import Name
 import Name
+import Annotations
 import TcRnMonad
 import SrcLoc
 import Outputable
 
 import TcRnMonad
 import SrcLoc
 import Outputable
 
-tcAnnotations :: [LAnnDecl Name] -> TcM [Annotation]
-tcAnnotations anns = mapM tcAnnotation anns
+-- Some platforms don't support the external interpreter, and
+-- compilation on those platforms shouldn't fail just due to
+-- annotations
+#ifndef GHCI
+tcAnnotations :: [LAnnDecl GhcRn] -> TcM [Annotation]
+tcAnnotations anns = do
+  dflags <- getDynFlags
+  case gopt Opt_ExternalInterpreter dflags of
+    True  -> tcAnnotations' anns
+    False -> warnAnns anns
+warnAnns :: [LAnnDecl GhcRn] -> TcM [Annotation]
+--- No GHCI; emit a warning (not an error) and ignore. cf Trac #4268
+warnAnns [] = return []
+warnAnns anns@(L loc _ : _)
+  = do { setSrcSpan loc $ addWarnTc NoReason $
+             (text "Ignoring ANN annotation" <> plural anns <> comma
+             <+> text "because this is a stage-1 compiler without -fexternal-interpreter or doesn't support GHCi")
+       ; return [] }
+#else
+tcAnnotations :: [LAnnDecl GhcRn] -> TcM [Annotation]
+tcAnnotations = tcAnnotations'
+#endif
+
+tcAnnotations' :: [LAnnDecl GhcRn] -> TcM [Annotation]
+tcAnnotations' anns = mapM tcAnnotation anns
 
 
-tcAnnotation :: LAnnDecl Name -> TcM Annotation
+tcAnnotation :: LAnnDecl GhcRn -> TcM Annotation
 tcAnnotation (L loc ann@(HsAnnotation _ provenance expr)) = do
     -- Work out what the full target of this annotation was
     mod <- getModule
 tcAnnotation (L loc ann@(HsAnnotation _ provenance expr)) = do
     -- Work out what the full target of this annotation was
     mod <- getModule
@@ -41,11 +66,12 @@ tcAnnotation (L loc ann@(HsAnnotation _ provenance expr)) = do
       safeHsErr = vcat [ text "Annotations are not compatible with Safe Haskell."
                   , text "See https://ghc.haskell.org/trac/ghc/ticket/10826" ]
 
       safeHsErr = vcat [ text "Annotations are not compatible with Safe Haskell."
                   , text "See https://ghc.haskell.org/trac/ghc/ticket/10826" ]
 
-annProvenanceToTarget :: Module -> AnnProvenance Name -> AnnTarget Name
+annProvenanceToTarget :: Module -> AnnProvenance Name
+                      -> AnnTarget Name
 annProvenanceToTarget _   (ValueAnnProvenance (L _ name)) = NamedTarget name
 annProvenanceToTarget _   (TypeAnnProvenance (L _ name))  = NamedTarget name
 annProvenanceToTarget mod ModuleAnnProvenance             = ModuleTarget mod
 
 annProvenanceToTarget _   (ValueAnnProvenance (L _ name)) = NamedTarget name
 annProvenanceToTarget _   (TypeAnnProvenance (L _ name))  = NamedTarget name
 annProvenanceToTarget mod ModuleAnnProvenance             = ModuleTarget mod
 
-annCtxt :: (OutputableBndrId id) => AnnDecl id -> SDoc
+annCtxt :: (SourceTextX p, OutputableBndrId p) => AnnDecl p -> SDoc
 annCtxt ann
   = hang (text "In the annotation:") 2 (ppr ann)
 annCtxt ann
   = hang (text "In the annotation:") 2 (ppr ann)