packages feed

paragon-0.1.22: src/Language/Java/Paragon/QuasiQuoter.hs

{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
module Language.Java.Paragon.QuasiQuoter where

--import Language.Haskell.TH.Syntax 

--import qualified Language.Haskell.TH as TH
import Language.Haskell.TH.Quote
import Language.Haskell.TH.Lift
--import Language.Haskell.TH.Lib
import Language.Haskell.Meta.Parse

--import Data.Generics (extQ)
--import Data.Data

import Language.Java.Paragon.Parser
-- import Language.Java.Paragon.Syntax (ambName)
import Language.Java.Paragon.Lexer
import Language.Java.Paragon.Interaction

import Language.Java.Paragon.QuasiQuoter.Lift ()

import Prelude hiding(exp)

import Text.ParserCombinators.Parsec

quasiQuoterModule :: String
quasiQuoterModule = libraryBase ++ ".QuasiQuoter"


fromRight :: Either a b -> b
fromRight (Right res) = res
fromRight _ = panic (quasiQuoterModule ++ ".fromRight") ""


parserQQ :: (Lift a,Show a) => GenParser (L Token) () a -> QuasiQuoter
parserQQ f = QuasiQuoter{ 
               quoteExp  = lift . fromRight . parser f, 
               quotePat  = return .fromRight . parsePat .show . fromRight . parser f,
               quoteType = panic (quasiQuoterModule ++ ".parserQQ: quoteType") "",
               quoteDec  = panic (quasiQuoterModule ++ ".parserQQ: quoteDec" ) ""
             }       

nameQQ, expQQ, typeQQ, stmtQQ, lhsQQ :: QuasiQuoter
nameQQ = parserQQ name
expQQ  = parserQQ exp
typeQQ = parserQQ ttype          
stmtQQ = parserQQ stmt
lhsQQ  = parserQQ lhs

impDeclQQ,
  varDeclQQ, methodBodyQQ, memberDeclQQ, fieldDeclQQ, methodDeclQQ, 
  modifiersQQ, formalParamQQ, blockStmtQQ, classDeclQQ, lockPropQQ :: QuasiQuoter
varDeclQQ    = parserQQ varDecl
methodBodyQQ = parserQQ methodBody 
memberDeclQQ = parserQQ memberDecl
fieldDeclQQ  = parserQQ fieldDecl
methodDeclQQ = parserQQ methodDecl
modifiersQQ  = parserQQ (list modifier)
formalParamQQ = parserQQ formalParam
blockStmtQQ  = parserQQ blockStmt
classDeclQQ  = parserQQ classDecl
lockPropQQ   = parserQQ lockProperties
impDeclQQ    = parserQQ importDecl