1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
|
{-# LANGUAGE GADTs, RankNTypes #-}
module Main where
import Text.PrettyPrint.Leijen.Text (hPutDoc)
import Control.Applicative
import Control.Monad
import Language.Javascript.JMacro
import System.Environment
import System.Console.ParseArgs
import System.IO
main = do
args <- parseArgsIO ArgsComplete
[Arg "Scope" (Just 's') (Just "scope") Nothing "Enforce block scoping through global variable renames.",
Arg "Help" (Just 'h') (Just "help") Nothing "",
Arg "Infile" Nothing Nothing (argDataOptional "Input file" ArgtypeString) "Input file",
Arg "Outfile" Nothing Nothing (argDataOptional "Output file" ArgtypeString) "Output file"]
when (gotArg args "Help") $ usageError args "Transforms jmacro code into valid javascript."
let s = gotArg args "Scope"
infile <- getArgStdio args "Infile" ReadMode
outfile <- getArgStdio args "Outfile" WriteMode
either (hPrint stderr) (hPutDoc outfile) . parseIt s =<< hGetContents infile
where
parseIt True = onRight (renderJs . scopify) . parseJM
parseIt False = onRight (renderJs . fixIdent) . parseJM
onRight :: (a -> b) -> Either c a -> Either c b
onRight f (Right x) = Right (f x)
onRight _ (Left x) = (Left x)
fixIdent x = jfromGADT $ composOp go (jtoGADT x) :: JStat
where
go :: forall a. JMGadt a -> JMGadt a
go v = case v of
(JMGStat (DeclStat (StrI ('!':'!':i')) t)) -> JMGStat (DeclStat (StrI i') t)
(JMGStat (DeclStat (StrI ('!':i')) t)) -> JMGStat (DeclStat (StrI i') t)
_ -> composOp go v
|