% % (c) The University of Glasgow 2006 % (c) The AQUA Project, Glasgow University, 1993-1998 % \section[TcAnnotations]{Typechecking annotations} \begin{code} module TcAnnotations ( tcAnnotations ) where import HsSyn import Annotations import Name import TcRnMonad import SrcLoc import Outputable #ifdef GHCI import Module import TcExpr import {-# SOURCE #-} TcSplice ( runAnnotation ) import FastString #endif \end{code} \begin{code} tcAnnotations :: [LAnnDecl Name] -> TcM [Annotation] tcAnnotations = mapM tcAnnotation tcAnnotation :: LAnnDecl Name -> TcM Annotation #ifndef GHCI -- TODO: modify lexer so ANN pragmas are parsed as comments in a stage1 compiler, so developers don't see this error tcAnnotation (L _ (HsAnnotation _ expr)) = pprPanic "Cant do annotations without GHCi" (ppr expr) #else tcAnnotation ann@(L loc (HsAnnotation provenance expr)) = do -- Work out what the full target of this annotation was mod <- getModule let target = annProvenanceToTarget mod provenance -- Run that annotation and construct the full Annotation data structure setSrcSpan loc $ addErrCtxt (annCtxt ann) $ addExprErrCtxt expr $ runAnnotation target expr annProvenanceToTarget :: Module -> AnnProvenance Name -> AnnTarget Name annProvenanceToTarget _ (ValueAnnProvenance name) = NamedTarget name annProvenanceToTarget _ (TypeAnnProvenance name) = NamedTarget name annProvenanceToTarget mod ModuleAnnProvenance = ModuleTarget mod annCtxt :: OutputableBndr id => LAnnDecl id -> SDoc annCtxt ann = hang (ptext (sLit "In the annotation:")) 2 (ppr ann) #endif \end{code}