hjsmin 0.0.16 → 0.1.0
raw patch · 6 files changed
+298/−217 lines, 6 filesdep +Cabaldep ~language-javascriptPVP ok
version bump matches the API change (PVP)
Dependencies added: Cabal
Dependency ranges changed: language-javascript
API changes (from Hackage documentation)
Files
- README.markdown +3/−2
- Text/Jasmine.hs +16/−14
- Text/Jasmine/Pretty.hs +195/−143
- buildall.sh +2/−3
- hjsmin.cabal +17/−18
- runtests.hs +65/−37
README.markdown view
@@ -28,9 +28,10 @@ Changes ------- -0.0.16 - Fix bug for issue 7, blowing up when calculating if space needed after return+0.1.0 - Major update to work with language-javascript 0.5.1. All changes should be internal.+ Update of build process to make use of Cabal testing support, and Travis CI. -0.0.15 - Fix ambiguous symbols with GHC 7.4.1, from @luite+0.0.15 - Fix GHC 7.4.1 compile compatibility. Patch accepted from github.com/luite 0.0.14 - Allow unicode characters in comments
Text/Jasmine.hs view
@@ -1,13 +1,13 @@ module Text.Jasmine- ( + ( minify- , minifym - , minifyBb - , minifyFile - ) where - + , minifym+ , minifyBb+ , minifyFile+ ) where+ --import Text.Jasmine.Parse-import Language.JavaScript.Parser+import Language.JavaScript.Parser (readJs, parse, JSNode(..)) import Text.Jasmine.Pretty import qualified Blaze.ByteString.Builder as BB import qualified Data.ByteString.Lazy as LB@@ -19,13 +19,13 @@ minifym :: LB.ByteString -> Either String LB.ByteString minifym s = case parse' s of Left msg -> Left (show msg)- Right p -> Right $ BB.toLazyByteString $ renderJS p + Right p -> Right $ BB.toLazyByteString $ renderJS p minifyBb :: LB.ByteString -> Either String BB.Builder minifyBb s = case parse' s of Left msg -> Left (show msg) Right p -> Right (renderJS p)- + minify :: LB.ByteString -> LB.ByteString --minify s = BB.toLazyByteString $ renderJS $ readJs s minify s = BB.toLazyByteString $ renderJS $ readJs (lbToStr s)@@ -35,11 +35,13 @@ minifyFile :: FilePath -> IO LB.ByteString minifyFile filename =- do + do x <- LB.readFile (filename) return $ minify x- -parse' :: S8.ByteString -> Either ParseError JSNode++--parse' :: S8.ByteString -> Either ParseError JSNode+parse'+ :: S8.ByteString -> Either String JSNode parse' input = parse (lbToStr input) "src" lbToStr :: S8.ByteString -> [Char]@@ -48,5 +50,5 @@ _strToLb :: String -> S8.ByteString _strToLb str = S8.pack str - --- EOF ++-- EOF
Text/Jasmine/Pretty.hs view
@@ -6,8 +6,7 @@ import Data.Char import Data.List import Data.Monoid (Monoid, mappend, mempty, mconcat)--- import Text.Jasmine.Parse-import Language.JavaScript.Parser+import Language.JavaScript.Parser (JSNode(..),Node(..),tokenPosnEmpty,readJs,CommentAnnotation(..),TokenPosn(..)) import qualified Blaze.ByteString.Builder as BB import qualified Blaze.ByteString.Builder.Char.Utf8 as BS import qualified Data.ByteString.Lazy as LB@@ -42,112 +41,133 @@ -- --------------------------------------------------------------------- renderJS :: JSNode -> BB.Builder-renderJS (NS node _) = rn node+renderJS (NN node ) = rn node+renderJS (NT node _ _) = rn node rn :: Node -> BB.Builder-rn (JSEmpty l) = (renderJS l)+--rn (JSEmpty l) = (renderJS l)++-- Terminals rn (JSIdentifier s) = text s rn (JSDecimal i) = text i-rn (JSOperator s) = text s-rn (JSExpression xs) = rJS xs+rn (JSLiteral l) = (text l)+rn (JSHexInteger i) = (text $ show i) -- TODO: need to tweak this+rn (JSStringLiteral s l) = empty <> (char s) <> (text l) <> (char s)+rn (JSRegEx s) = (text s) ---rn (JSSourceElements xs) = rJS (map fixBlock $ fixSourceElements xs)-rn (JSSourceElements xs) = rJS (fixSourceElements $ map fixBlock xs)+-- Non Terminals+rn (JSOperator x) = renderJS x+rn (JSExpression xs) = rJS $ fixNew xs ++--rn (JSSourceElements xs) = rJS (fixSourceElements $ map fixBlock xs)+ --rn (JSSourceElementsTop xs)= rJS (fixTop $ map fixBlock $ fixSourceElements xs) rn (JSSourceElementsTop xs)= rJS (fixTop $ fixSourceElements $ map fixBlock xs) -rn (JSFunction s p xs) = (text "function") <+> (renderJS s) <> (text "(") <> (commaList p) <> (text ")") <> (renderJS xs)-rn (JSFunctionBody xs) = (text "{") <> (rJS xs) <> (text "}")-rn (JSFunctionExpression [] p xs) = (text "function") <> (text "(") <> (commaList p) <> (text ")") <> (renderJS xs)-rn (JSFunctionExpression s p xs) = (text "function") <+> (rJS s) <> (text "(") <> (commaList p) <> (text ")") <> (renderJS xs)-rn (JSArguments xs) = (text "(") <> (commaListList $ map fixLiterals xs) <> (text ")")+--rn (JSFunction s p xs) = (text "function") <+> (renderJS s) <> (text "(") <> (rJS p) <> (text ")") <> (renderJS xs)+rn (JSFunction _f s _lb p _rb x) = (text "function") <+> (renderJS s) <> (text "(") <> (rJS $ fixNew p) <> (text ")") <> (renderJS $ fixFnBlock x) -rn (JSBlock x) = (text "{") <> (renderJS x) <> (text "}")+-- rn (JSFunctionBody xs) = (text "{") <> (rJS xs) <> (text "}") -rn (JSIf c (NS (JSLiteral ";") _))= (text "if") <> (text "(") <> (renderJS c) <> (text ")")-rn (JSIf c t) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS $ fixBlock t)+--rn (JSFunctionExpression [] p xs) = (text "function") <> (text "(") <> (rJS p) <> (text ")") <> (renderJS xs)+--rn (JSFunctionExpression s p xs) = (text "function") <+> (rJS s) <> (text "(") <> (rJS p) <> (text ")") <> (renderJS xs)+rn (JSFunctionExpression _f [] _lb p _rb x) = (text "function") <> (text "(") <> (rJS $ fixNew p) <> (text ")") <> (renderJS $ fixFnBlock x)+rn (JSFunctionExpression _f s _lb p _rb x) = (text "function") <+> (rJS s) <> (text "(") <> (rJS $ fixNew p) <> (text ")") <> (renderJS $ fixFnBlock x) -rn (JSIfElse c t (NS (JSLiteral ";") _)) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS t)- <> (text "else")-rn (JSIfElse c t e) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS t)- <> (text "else") <> (spaceOrBlock $ fixBlock e)-rn (JSMemberDot xs y) = (rJS xs) <> (text ".") <> (renderJS y)-rn (JSMemberSquare xs x) = (rJS xs) <> (text "[") <> (renderJS x) <> (text "]")-rn (JSLiteral l) = (text l)-rn (JSStringLiteral s l) = empty <> (char s) <> (text l) <> (char s)-rn (JSUnary l ) = text l-rn (JSArrayLiteral xs) = (text "[") <> (rJS xs) <> (text "]")+--rn (JSArguments xs ) = (text "(") <> (rJSList $ map fixLiterals xs) <> (text ")")+rn (JSArguments _lb xs _rb) = (text "(") <> (rJS $ fixLiterals $ fixNew xs) <> (text ")") -rn (JSBreak [] []) = (text "break")-rn (JSBreak [] _xs) = (text "break") -- <> (rJS xs) -- <> (text ";")-rn (JSBreak is _xs) = (text "break") <+> (rJS is) -- <> (rJS xs)+rn (JSBlock lb xs rb) = (rJS lb) <> (rJS xs) <> (rJS rb) -rn (JSCallExpression "()" xs) = (rJS xs)-rn (JSCallExpression t xs) = (char $ head t) <> (rJS xs) <> (if ((length t) > 1) then (char $ last t) else empty)+rn (JSIf _i _lb c _rb [(NT (JSLiteral ";") _ _)] []) = (text "if") <> (text "(") <> (renderJS c) <> (text ")")+--rn (JSIf _i _lb c _rb t []) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (renderJS $ fixBlock t) +rn (JSIf _i _lb c _rb t []) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (rJS $ fixSourceElements $ map fixBlock t)++rn (JSIf _i _lb c _rb t [_e,(NT (JSLiteral ";") _ _)]) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (rJS $ fixIfBlock t)+ <> (text "else")+rn (JSIf _i _lb c _rb t [_e,e]) = (text "if") <> (text "(") <> (renderJS c) <> (text ")") <> (rJS $ fixIfElse $ fixSourceElements t)+ <> (text "else") <> (spaceOrBlock $ fixBlock e)++++rn (JSMemberDot xs _d y) = (rJS xs) <> (text ".") <> (renderJS y)+rn (JSMemberSquare xs _lb x _rb) = (rJS xs) <> (text "[") <> (renderJS x) <> (text "]")+rn (JSUnary l _s ) = text l+rn (JSArrayLiteral _lb xs _rb) = (text "[") <> (rJS xs) <> (text "]")++rn (JSBreak _b [] as) = (text "break") -- <> (renderJS as)+rn (JSBreak _b is as) = (text "break") <+> (rJS $ fixSourceElements $ map fixFnBlock is) -- <> (renderJS as)++rn (JSCallExpression "()" _os xs _cs) = (rJS xs)+rn (JSCallExpression t _os xs _cs) = (char $ head t) <> (rJS xs) <> (if ((length t) > 1) then (char $ last t) else empty)++ -- No space between 'case' and string literal. TODO: what about expression in parentheses? --rn (JSCase (JSExpression [JSStringLiteral sepa s]) xs) = (text "case") <> (renderJS (JSStringLiteral sepa s))-rn (JSCase (NS (JSExpression [(NS (JSStringLiteral sepa s) s1)]) _) xs) = (text "case") <> (renderJS (NS (JSStringLiteral sepa s) s1))- <> (char ':') <> (renderJS xs)-rn (JSCase e xs) = (text "case") <+> (renderJS e) <> (char ':') <> (renderJS xs) -- <> (text ";");+rn (JSCase _ca (NN (JSExpression [(NT (JSStringLiteral sepa s) s1 c1)])) _c xs) =+ (text "case") <> (renderJS (NT (JSStringLiteral sepa s) s1 c1)) <> (char ':') <> (rJS $ fixSourceElements $ map fixFnBlock xs) -rn (JSCatch i [] s) = (text "catch") <> (char '(') <> (renderJS i) <> (char ')') <> (renderJS s)-rn (JSCatch i c s) = (text "catch") <> (char '(') <> (renderJS i) <>- (text " if ") <> (rJS c) <> (char ')') <> (renderJS s)+rn (JSCase _ca e _c xs) = (text "case") <+> (renderJS e) <> (char ':') <> (rJS $ fixSourceElements $ map fixFnBlock xs) -- <> (text ";"); -rn (JSContinue is) = (text "continue") <> (rJS is) -- <> (char ';')-rn (JSDefault xs) = (text "default") <> (char ':') <> (renderJS xs)-rn (JSDoWhile s e _ms) = (text "do") <> (renderJS s) <> (text "while") <> (char '(') <> (renderJS e) <> (char ')') -- <> (renderJS ms)++rn (JSCatch _c _lb i [] _rb s) = (text "catch") <> (char '(') <> (renderJS i) <> (char ')') <> (renderJS $ fixFnBlock s)+rn (JSCatch _c _lb i c _rb s) = (text "catch") <> (char '(') <> (renderJS i) <>+ (text " if ") <> (rJS $ tail c) <> (char ')') <> (renderJS $ fixFnBlock s)++rn (JSContinue _c is _as) = (text "continue") <> (rJS is) -- <> (char ';')+rn (JSDefault _d _c xs) = (text "default") <> (char ':') <> (rJS $ fixSourceElements xs)++rn (JSDoWhile _d s _w _lb e _rb as) = (text "do") <> (renderJS $ fixFnBlock s) <> (text "while") <> (char '(') <> (renderJS e) <> (char ')') -- <> (renderJS as)++ --rn (JSElementList xs) = rJS xs-rn (JSElision xs) = (char ',') <> (rJS xs)-rn (JSExpressionBinary o e1 e2) = (rJS e1) <> (text o) <> (rJS e2)---rn (JSExpressionBinary o e1 e2) = (text o) <> (rJS e1) <> (rJS e2)-rn (JSExpressionParen e) = (char '(') <> (renderJS e) <> (char ')')-rn (JSExpressionPostfix o e) = (rJS e) <> (text o)-rn (JSExpressionTernary c v1 v2) = (rJS c) <> (char '?') <> (rJS v1) <> (char ':') <> (rJS v2)-rn (JSFinally b) = (text "finally") <> (renderJS b)+--rn (JSElision xs) = (char ',') <> (rJS xs)+rn (JSElision x) = renderJS x -rn (JSFor e1 e2 e3 s) = (text "for") <> (char '(') <> (commaList e1) <> (char ';')+rn (JSExpressionBinary o e1 _op e2) = (rJS e1) <> (text o) <> (rJS e2)+rn (JSExpressionParen _lp e _rp) = (char '(') <> (renderJS e) <> (char ')')+rn (JSExpressionPostfix o e _op) = (rJS e) <> (text o)+rn (JSExpressionTernary c _q v1 _c v2) = (rJS $ fixNew c) <> (char '?') <> (rJS $ fixNew v1) <> (char ':') <> (rJS $ fixNew v2)+rn (JSFinally _f b) = (text "finally") <> (renderJS $ fixFnBlock b)++rn (JSFor _f _lb e1 _s1 e2 _s2 e3 _rb s) = (text "for") <> (char '(') <> (rJS e1) <> (char ';') <> (rJS e2) <> (char ';') <> (rJS e3) <> (char ')') <> (renderJS $ fixBlock s)-rn (JSForIn e1 e2 s) = (text "for") <> (char '(') <> (rJS e1) <+> (text "in")++rn (JSForIn _f _lb e1 _i e2 _rb s) = (text "for") <> (char '(') <> (rJS e1) <+> (text "in") <+> (renderJS e2) <> (char ')') <> (renderJS $ fixBlock s)-rn (JSForVar e1 e2 e3 s) = (text "for") <> (char '(') <> (text "var") <+> (commaList e1) <> (char ';')+rn (JSForVar _f _lb _v e1 _s1 e2 _s3 e3 _rb s) = (text "for") <> (char '(') <> (text "var") <+> (rJS e1) <> (char ';') <> (rJS e2) <> (char ';') <> (rJS e3) <> (char ')') <> (renderJS $ fixBlock s)-rn (JSForVarIn e1 e2 s) = (text "for") <> (char '(') <> (text "var") <+> (renderJS e1) <+> (text "in")+rn (JSForVarIn _f _lb _v e1 _i e2 _rb s) = (text "for") <> (char '(') <> (text "var") <+> (renderJS e1) <+> (text "in") <+> (renderJS e2) <> (char ')') <> (renderJS $ fixBlock s) -rn (JSHexInteger i) = (text $ show i) -- TODO: need to tweak this-rn (JSLabelled l v) = (renderJS l) <> (text ":") <> (rJS $ fixSourceElements [fixBlock v])-rn (JSObjectLiteral xs) = (text "{") <> (commaList xs) <> (text "}")-rn (JSPropertyAccessor s n ps b) = (text s) <+> (renderJS n) <> (char '(') <> (rJS ps) <> (text ")") <> (renderJS b)-rn (JSPropertyNameandValue n vs) = (renderJS n) <> (text ":") <> (rJS vs)-rn (JSRegEx s) = (text s)+rn (JSLabelled l _c v) = (renderJS l) <> (text ":") <> (rJS $ fixSourceElements [fixBlock v]) -rn (JSReturn []) = (text "return")-rn (JSReturn [(NS (JSLiteral ";") _)]) = (text "return;")-rn (JSReturn xs) = (text "return") <> (if (spaceNeeded xs) then (text " ") else (empty)) <> (rJS $ fixSourceElements xs)+rn (JSObjectLiteral _lb xs _rb) = (text "{") <> (rJS xs) <> (text "}")+rn (JSPropertyAccessor s n _lb1 ps _rb1 b) = (renderJS s) <+> (renderJS n) <> (char '(') <> (rJS ps) <> (text ")") <> (renderJS $ fixFnBlock b)+rn (JSPropertyNameandValue n _c vs) = (renderJS n) <> (text ":") <> (rJS $ fixNew vs) -rn (JSThrow e) = (text "throw") <+> (renderJS e)+rn (JSReturn _r [] _as) = (text "return")+rn (JSReturn _r [(NT (JSLiteral ";") _ _)] _as) = (text "return;++foobar+will_never_happen++") -- ++AZ++ get rid of this+rn (JSReturn _r xs as) = (text "return") <> (if (spaceNeeded xs) then (text " ") else (empty)) <> (rJS $ fixSourceElements xs) -- <> (renderJS as) -rn (JSStatementBlock x) = (text "{") <> (renderJS x) <> (text "}")+rn (JSThrow _t e) = (text "throw") <+> (renderJS $ fixBlock e) -rn (JSStatementList xs) = rJS (fixSourceElements $ map fixBlock xs)+rn (JSSwitch _s _lb e _rb x) = (text "switch") <> (char '(') <> (renderJS e) <> (char ')') <> (renderJS $ fixFnBlock x) -rn (JSSwitch e xs) = (text "switch") <> (char '(') <> (renderJS e) <> (char ')') <>- (char '{') <> (rJS $ fixSemis xs) <> (char '}')-rn (JSTry e xs) = (text "try") <> (renderJS e) <> (rJS xs)+rn (JSTry _t e xs) = (text "try") <> (renderJS $ fixFnBlock e) <> (rJS xs) rn (JSVarDecl i []) = (renderJS i)-rn (JSVarDecl i xs) = (renderJS i) <> (text "=") <> (rJS xs)+rn (JSVarDecl i xs) = (renderJS i) <> (rJS $ fixNew xs) -rn (JSVariables kw xs) = (text kw) <+> (commaList xs)+rn (JSVariables kw xs _as) = (renderJS kw) <+> (rJS xs) -rn (JSWhile e (NS (JSLiteral ";") _)) = (text "while") <> (char '(') <> (renderJS e) <> (char ')') -- <> (renderJS s)-rn (JSWhile e s) = (text "while") <> (char '(') <> (renderJS e) <> (char ')') <> (renderJS s)+rn (JSWhile _w _lb e _rb (NT (JSLiteral ";") _ _)) = (text "while") <> (char '(') <> (renderJS e) <> (char ')') -- <> (renderJS s)+rn (JSWhile _w _lb e _rb s) = (text "while") <> (char '(') <> (renderJS e) <> (char ')') <> (renderJS $ fixFnBlock s) -rn (JSWith e s) = (text "with") <> (char '(') <> (renderJS e) <> (char ')') <> (rJS s)+rn (JSWith _w _lb e _rb s) = (text "with") <> (char '(') <> (renderJS e) <> (char ')') <> (rJS s) -- Helper functions rJS :: [JSNode] -> BB.Builder@@ -155,21 +175,21 @@ commaList :: [JSNode] -> BB.Builder commaList [] = empty-commaList xs = (hcat $ (punctuate comma (toDoc xs') ++ trail))- where- -- (xs', trail) = if (last xs == JSLiteral ",") then (init xs, [comma]) else (xs,[])- (xs', trail) = if (x' == JSLiteral ",") then (init xs, [comma]) else (xs,[])- (NS x' _) = last xs+commaList xs = rJS xs -commaListList :: [[JSNode]] -> BB.Builder-commaListList xs = (hcat $ punctuate comma $ map rJS xs)+extractNode :: JSNode -> Node+extractNode (NT x _ _) = x+extractNode (NN x ) = x +--commaListList :: [[JSNode]] -> BB.Builder+--commaListList xs = (hcat $ punctuate comma $ map rJS xs)+ toDoc :: [JSNode] -> [BB.Builder] toDoc xs = map renderJS xs spaceOrBlock :: JSNode -> BB.Builder-spaceOrBlock (NS (JSBlock xs) _) = rn (JSBlock xs)-spaceOrBlock (NS (JSStatementBlock xs) _) = rn (JSStatementBlock xs)+spaceOrBlock (NN (JSBlock lb xs rb)) = rn (JSBlock lb xs rb)+--spaceOrBlock (NN (JSStatementBlock lb xs rb)) = rn (JSStatementBlock lb xs rb) spaceOrBlock x = (text " ") <> (renderJS x) @@ -187,48 +207,56 @@ fixTop [] = [] fixTop xs = if (n == (JSLiteral ";")) then (init xs) else (xs) where- (NS n _) = last xs+ n = extractNode $ last xs +-- The "new" literal always need a space after it+fixNew :: [JSNode] -> [JSNode]+fixNew [] = []+fixNew ((NT (JSLiteral "new") p cs):xs) = (NT (JSLiteral "new ") p cs) : fixNew xs+fixNew (x :xs) = x : fixNew xs+ -- Fix semicolons in output of sourceelements and statementlist fixSourceElements :: [JSNode] -> [JSNode]-fixSourceElements xs = fixSemis $ myFix xs+fixSourceElements xs = fixSemis $ myFix $ fixNew xs myFix :: [JSNode] -> [JSNode] myFix [] = [] + -- Sort out empty IF statements-myFix ((NS (JSIf c (NS (JSStatementBlock (NS (JSStatementList []) s1)) s2)) _s3):xs) = (NS (JSIf c (NS (JSLiteral "") s1)) s2) : myFix (xs)+--myFix ((NN (JSIf i lb c rb (NN (JSStatementBlock _lb (NN (JSStatementList []) ) _rb) ) e)):xs) = (NN (JSIf i lb c rb (NT (JSLiteral "") tokenPosnEmpty []) e) ) : myFix (xs) myFix [x] = [x] -myFix (x:(NS (JSFunction v1 v2 v3) s1):xs) = x : (NS (JSLiteral "\n") s1) : myFix ((NS (JSFunction v1 v2 v3) s1) : xs)+myFix (x:(NN (JSFunction v1 v2 v3 v4 v5 v6) ):xs) = x : (NT (JSLiteral "\n") tokenPosnEmpty []) : myFix ((NN (JSFunction v1 v2 v3 v4 v5 v6) ) : xs)+ -- Messy way, but it works, until the 3rd element arrives .. -- TODO: JSStatementBlock. Damn.-myFix ((NS (JSExpression x) s1):(NS (JSExpression y) s2):xs) = (NS (JSExpression x) s1):(NS (JSLiteral ";") s1):myFix ((NS (JSExpression y) s2):xs)-myFix ((NS (JSExpression x) s1):(NS (JSBlock y) s2):xs) = (NS (JSExpression x) s1):(NS (JSLiteral ";") s1):myFix ((NS (JSBlock y) s2):xs)-myFix ((NS (JSBlock x) s1) :(NS (JSBlock y) s2):xs) = (NS (JSBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSBlock y) s2):xs)-myFix ((NS (JSBlock x) s1) :(NS (JSExpression y) s2):xs) = (NS (JSBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSExpression y) s2):xs)+myFix ((NN (JSExpression x) ):(NN (JSExpression y) ):xs) = (NN (JSExpression x) ):(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSExpression y) ):xs)+myFix ((NN (JSExpression x) ):(NN (JSBlock l y r) ):xs) = (NN (JSExpression x) ):(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSBlock l y r) ):xs)+myFix ((NN (JSBlock x1 x2 x3) ) :(NN (JSBlock y1 y2 y3) ):xs) = (NN (JSBlock x1 x2 x3) ) :(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSBlock y1 y2 y3) ):xs)+myFix ((NN (JSBlock x1 x2 x3) ) :(NN (JSExpression y) ):xs) = (NN (JSBlock x1 x2 x3) ) :(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSExpression y) ):xs) -myFix ((NS (JSExpression x) s1):(NS (JSStatementBlock y) s2):xs) =- (NS (JSExpression x) s1):(NS (JSLiteral ";") s1):myFix ((NS (JSStatementBlock y) s2):xs)-myFix ((NS (JSStatementBlock x) s1) :(NS (JSStatementBlock y) s2):xs) =- (NS (JSStatementBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSStatementBlock y) s2):xs)-myFix ((NS (JSStatementBlock x) s1) :(NS (JSExpression y) s2):xs) =- (NS (JSStatementBlock x) s1) :(NS (JSLiteral ";") s1):myFix ((NS (JSExpression y) s2):xs)+-- myFix ((NN (JSExpression x) ):(NN (JSStatementBlock y1 y2 y3) ):xs) =+-- (NN (JSExpression x) ):(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSStatementBlock y1 y2 y3) ):xs)+-- myFix ((NN (JSStatementBlock x1 x2 x3) ) :(NN (JSStatementBlock y1 y2 y3) ):xs) =+-- (NN (JSStatementBlock x1 x2 x3) ) :(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSStatementBlock y1 y2 y3) ):xs)+-- myFix ((NN (JSStatementBlock x1 x2 x3) ) :(NN (JSExpression y) ):xs) =+-- (NN (JSStatementBlock x1 x2 x3) ) :(NT (JSLiteral ";") tokenPosnEmpty []):myFix ((NN (JSExpression y) ):xs) -- Merge adjacent variable declarations, but only of the same type-myFix ((NS (JSVariables t1 x1s) s1):(NS (JSLiteral l) s2):(NS (JSVariables t2 x2s) s3):xs)- | t1 == t2 = myFix ((NS (JSVariables t1 (x1s++x2s)) s1):xs)- | otherwise = (NS (JSVariables t1 x1s) s1):myFix ((NS (JSLiteral l) s2):(NS (JSVariables t2 x2s) s3):xs)+myFix ((NN (JSVariables t1 x1s a1) ):(NT (JSLiteral l) s2 c2):(NN (JSVariables t2 x2s a2) ):xs)+ | extractNode t1 == extractNode t2 = myFix ((NN (JSVariables t1 (x1s++[(NT (JSLiteral ",") tokenPosnEmpty [])]++x2s) a2) ):xs)+ | otherwise = (NN (JSVariables t1 x1s a1) ):myFix ((NT (JSLiteral l) s2 c2):(NN (JSVariables t2 x2s a2) ):xs) -myFix ((NS (JSVariables t1 x1s) s1):(NS (JSVariables t2 x2s) s2):xs)- | t1 == t2 = myFix ((NS (JSVariables t1 (x1s++x2s)) s1):xs)- | otherwise = (NS (JSVariables t1 x1s) s1):myFix ((NS (JSVariables t2 x2s) s2):xs)+myFix ((NN (JSVariables t1 x1s a1) ):(NN (JSVariables t2 x2s a2) ):xs)+ | extractNode t1 == extractNode t2 = myFix ((NN (JSVariables t1 (x1s++[(NT (JSLiteral ",") tokenPosnEmpty [])]++x2s) a2) ):xs)+ | otherwise = (NN (JSVariables t1 x1s a1) ):myFix ((NN (JSVariables t2 x2s a2) ):xs) -- Merge adjacent semi colons-myFix ((NS (JSLiteral ";") s1):(NS (JSLiteral ";") _s2):xs) = myFix ((NS (JSLiteral ";") s1):xs)-myFix ((NS (JSLiteral ";") s1):(NS (JSLiteral "" ) _s2):xs) = myFix ((NS (JSLiteral "") s1):xs)+myFix ((NT (JSLiteral ";") s1 c1):(NT (JSLiteral ";") _s2 _c2):xs) = myFix ((NT (JSLiteral ";") s1 c1):xs)+myFix ((NT (JSLiteral ";") s1 c1):(NT (JSLiteral "" ) _s2 _c2):xs) = myFix ((NT (JSLiteral "" ) s1 c1):xs) myFix (x:xs) = x : myFix xs@@ -237,57 +265,82 @@ fixLiterals :: [JSNode] -> [JSNode] fixLiterals [] = [] -- Old version-fixLiterals ((NS (JSStringLiteral d1 s1) ss1):(NS (JSExpressionBinary "+" [(NS (JSStringLiteral d2 s2) ss2)] r) ss3):xs)- | d1 == d2 = fixLiterals ((NS (JSStringLiteral d1 (s1++s2)) ss1):(r++xs))- | otherwise = (NS (JSStringLiteral d1 s1) ss1):fixLiterals ((NS (JSExpressionBinary "+" [(NS (JSStringLiteral d2 s2) ss2)] r) ss3):xs)+fixLiterals ((NT (JSStringLiteral d1 s1) ss1 c1):(NN (JSExpressionBinary "+" [(NT (JSStringLiteral d2 s2) ss2 c2)] op r) ):xs)+ | d1 == d2 = fixLiterals ((NT (JSStringLiteral d1 (s1++s2)) ss1 c1):(r++xs))+ | otherwise = (NT (JSStringLiteral d1 s1) ss1 c1):fixLiterals ((NN (JSExpressionBinary "+" [(NT (JSStringLiteral d2 s2) ss2 c2)] op r) ):xs) -fixLiterals ((NS (JSExpressionBinary "+" [(NS (JSStringLiteral d1 s1) ss2)] [(NS (JSStringLiteral d2 s2) ss3)]) ss4):xs)- | d1 == d2 = fixLiterals ((NS (JSStringLiteral d1 (s1++s2)) ss2):xs)- | otherwise = (NS (JSExpressionBinary "+" [(NS (JSStringLiteral d1 s1) ss2)] [(NS (JSStringLiteral d2 s2) ss3)]) ss4):fixLiterals xs+fixLiterals ((NN (JSExpressionBinary "+" [(NT (JSStringLiteral d1 s1) ss2 c2)] o1 [(NT (JSStringLiteral d2 s2) ss3 c3)]) ):xs)+ | d1 == d2 = fixLiterals ((NT (JSStringLiteral d1 (s1++s2)) ss2 c2):xs)+ | otherwise = (NN (JSExpressionBinary "+" [(NT (JSStringLiteral d1 s1) ss2 c2)] o1 [(NT (JSStringLiteral d2 s2) ss3 c3)]) ):fixLiterals xs fixLiterals (x:xs) = x:fixLiterals xs -- Sort out Semicolons fixSemis :: [JSNode] -> [JSNode] --fixSemis xs = fixSemis' $ filter (\x -> x /= JSLiteral ";" && x /= JSLiteral "") xs-fixSemis xs = fixSemis' $ filter (\(NS x _) -> x /= JSLiteral ";" && x /= JSLiteral "") xs+fixSemis xs = fixSemis' $ stripSemis xs +stripSemis :: [JSNode] -> [JSNode]+stripSemis xs = filter (\x -> (extractNode x) /= JSLiteral ";" && (extractNode x) /= JSLiteral "") xs+ fixSemis' :: [JSNode] -> [JSNode] fixSemis' [] = []-fixSemis' [(NS (JSContinue [(NS (JSLiteral ";") _)]) s2)] = [(NS (JSContinue []) s2)]+fixSemis' [(NN (JSContinue c [(NT (JSLiteral ";") _ _)] as) )] = [(NN (JSContinue c [] as) )] fixSemis' [x] = [x]-fixSemis' ((NS (JSIf c (NS (JSReturn [(NS (JSLiteral ";") s1)]) s2) ) s3):xs) =- (NS (JSIf c (NS (JSReturn [(NS (JSLiteral ";") s1)]) s2)) s3):(fixSemis' xs)-fixSemis' ((NS (JSIf c (NS (JSContinue [(NS (JSLiteral ";") s1)]) s2) ) s3):xs) =- (NS (JSIf c (NS (JSContinue [(NS (JSLiteral ";") s1)]) s2)) s3):(fixSemis' xs)-fixSemis' (x:(NS (JSLiteral "\n") s1):xs) = x:(NS (JSLiteral "\n") s1):(fixSemis' xs) -- TODO: is this needed?-fixSemis' ((NS (JSCase e1 ((NS (JSStatementList []) s1))) s2):(NS (JSCase e2 x) s3):xs) =- (NS (JSCase e1 ((NS (JSStatementList []) s1))) s2):fixSemis' ((NS (JSCase e2 x) s3):xs)-fixSemis' (x:xs) = x:(NS (JSLiteral ";") SpanEmpty):fixSemis' xs --- Remove extraneous braces around blocks-fixBlock :: JSNode -> JSNode+fixSemis' ((NN (JSIf i lb c rb [NN (JSBlock [NT (JSLiteral "{") p1 cs1] [] [NT (JSLiteral "}") p2 cs2])] []) ):xs) =+ (NN (JSIf i lb c rb [NN (JSBlock [NT (JSLiteral "{") p1 cs1] [] [NT (JSLiteral "}") p2 cs2])] []) ):(fixSemis' xs) -fixBlock (NS (JSBlock (NS (JSStatementList []) s1) ) _) = (NS (JSLiteral ";") s1)-fixBlock (NS (JSStatementBlock (NS (JSStatementList []) s1) ) _) = (NS (JSLiteral ";") s1)+fixSemis' ((NN (JSIf i lb c rb [(NT (JSLiteral ";") s1 c1)] []) ):xs) =+ (NN (JSIf i lb c rb [(NT (JSLiteral ";") s1 c1)] []) ):(fixSemis' xs) -fixBlock (NS (JSBlock (NS (JSStatementList [x]) _) ) _) = fixBlock x-fixBlock (NS (JSStatementBlock (NS (JSStatementList [x]) _) ) _) = fixBlock x+fixSemis' ((NN (JSIf i lb c rb [(NN (JSReturn r [(NT (JSLiteral ";") s1 c1)] as) )] e) ):xs) =+ (NN (JSIf i lb c rb [(NN (JSReturn r [(NT (JSLiteral ";") s1 c1)] as) )] e) ):(fixSemis' xs) -fixBlock (NS (JSBlock (NS (JSStatementList xs) s1) ) s2) =- fixBlock' (NS (JSBlock (NS (JSStatementList (fixSourceElements xs)) s1)) s2)+fixSemis' ((NN (JSIf i lb c rb [(NN (JSContinue co [(NT (JSLiteral ";") s1 c1)] as) )] e) ):xs) =+ (NN (JSIf i lb c rb [(NN (JSContinue co [(NT (JSLiteral ";") s1 c1)] as) )] e) ):(fixSemis' xs) -fixBlock (NS (JSStatementBlock (NS (JSStatementList xs) s1) ) s2) =- fixBlock' (NS (JSStatementBlock (NS (JSStatementList (fixSourceElements xs)) s1)) s2)+fixSemis' (x:(NT (JSLiteral "\n") s1 c1):xs) = x:(NT (JSLiteral "\n") s1 c1):(fixSemis' xs) -- TODO: is this needed? -fixBlock x = x+fixSemis' ((NN (JSCase ca1 e1 c1 [] ) ):(NN (JSCase ca2 e2 c2 x) ):xs) =+ (NN (JSCase ca1 e1 c1 [] ) ):fixSemis' ((NN (JSCase ca2 e2 c2 x) ):xs) -fixBlock' :: JSNode -> JSNode-fixBlock' (NS (JSBlock (NS (JSStatementList [x]) _)) _) = x-fixBlock' (NS (JSStatementBlock (NS (JSStatementList [x]) _)) _) = x---fixBlock' (JSBlock (JSStatementList [x,JSLiteral ""])) = x -- TODO: fix parser to not emit this case-fixBlock' x = x+fixSemis' (x:xs) = x:(NT (JSLiteral ";") tokenPosnEmpty []):fixSemis' xs +fixIfElse :: [JSNode] -> [JSNode]+fixIfElse [(NN (JSBlock lb xs rb))] = [(NN (JSBlock lb (fixSourceElements xs) rb))]+fixIfElse [x] = [(NN (JSBlock [(NT (JSLiteral "{") tokenPosnEmpty [])] (fixSourceElements [x]) [(NT (JSLiteral "}") tokenPosnEmpty [])]))]+fixIfElse xs = xs++fixFnBlock :: JSNode -> JSNode+-- fixFnBlock (NN (JSBlock lb [] rb)) = (NT (JSLiteral ";") tokenPosnEmpty [])+fixFnBlock (NN (JSBlock lb xs rb)) = (NN (JSBlock lb (fixSourceElements xs) rb))+fixFnBlock x = fixBlock x++fixIfBlock :: [JSNode] -> [JSNode]+fixIfBlock xs =+ case xs' of+ [(NT (JSLiteral ";") p cs)] -> [] -- rely on fixSemis to add this again [(NT (JSLiteral ";") p cs)]+ [(NN (JSBlock lb [] rb))] -> [] -- rely on fixSemis to add this again [(NT (JSLiteral ";") tokenPosnEmpty [])]+ -- [(NN (JSBlock lb [y] rb))] -> [fixBlock y]+ [(NN (JSBlock lb x2s rb))] -> [(NN (JSBlock lb ((fixSourceElements $ map fixBlock x2s)) rb))]+ [x] -> fixSourceElements [x]+ where xs' = stripSemis xs++-- Remove extraneous braces around blocks+fixBlock :: JSNode -> JSNode++fixBlock (NN (JSBlock lb xs rb)) =+ case xs' of+ [] -> (NT (JSLiteral ";") tokenPosnEmpty [])+ -- [(NN (JSExpression [y]))] -> fixBlock (NN (JSExpression [y]))+ -- [(NN (JSExpression xs))] -> (NN (JSBlock lb (fixSourceElements $ map fixBlock xs') rb))+ [x] -> fixBlock x+ _ -> (NN (JSBlock lb (fixSourceElements $ map fixBlock xs') rb))+ where xs' = stripSemis xs++fixBlock x = x+ -- A space is needed if this expression starts with an identifier etc, but not if with a '(' spaceNeeded :: [JSNode] -> Bool spaceNeeded xs =@@ -295,7 +348,7 @@ -- str = show $ rJS xs str = LB.unpack $ BB.toLazyByteString $ rJS xs in- (str /= []) && head str /= (fromIntegral $ ord '(')+ head str /= (fromIntegral $ ord '(') -- --------------------------------------------------------------------- -- Test stuff@@ -305,24 +358,23 @@ --readJs "{{{}}}" _case0 :: JSNode-_case0 = NS (JSSourceElementsTop [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 3})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})--_case01 :: [JSNode]-_case01 = [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList [NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 3})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 3}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})]+_case0 = undefined -- -- readJs "if(x){}{a=2}" _case1 :: JSNode-_case1 = NS (JSSourceElementsTop [NS (JSIf (NS (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 4})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 4})) (NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1}),NS (JSStatementBlock (NS (JSStatementList [NS (JSExpression [NS (JSIdentifier "a") (SpanPoint {span_filename = "", span_row = 1, span_column = 9}),NS (JSOperator "=") (SpanPoint {span_filename = "", span_row = 1, span_column = 10}),NS (JSDecimal "2") (SpanPoint {span_filename = "", span_row = 1, span_column = 11})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 9})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 9}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 8})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})+_case1 = undefined -- _case11 :: [JSNode]-_case11 = [NS (JSIf (NS (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 4})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 4})) (NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1}),NS (JSStatementBlock (NS (JSStatementList [NS (JSExpression [NS (JSIdentifier "a") (SpanPoint {span_filename = "", span_row = 1, span_column = 9}),NS (JSOperator "=") (SpanPoint {span_filename = "", span_row = 1, span_column = 10}),NS (JSDecimal "2") (SpanPoint {span_filename = "", span_row = 1, span_column = 11})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 9})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 9}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 8})]+_case11 = undefined -- [NN (JSIf (NN (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 4})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 4})) (NN (JSStatementBlock (NN (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1}),NN (JSStatementBlock (NN (JSStatementList [NS (JSExpression [NS (JSIdentifier "a") (SpanPoint {span_filename = "", span_row = 1, span_column = 9}),NS (JSOperator "=") (SpanPoint {span_filename = "", span_row = 1, span_column = 10}),NS (JSDecimal "2") (SpanPoint {span_filename = "", span_row = 1, span_column = 11})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 9})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 9}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 8})] _case12 :: JSNode-_case12 = (NS (JSIf (NS (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 4})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 4})) (NS (JSLiteral "") (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))+_case12 = undefined -- (NN (JSIf (NN (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 4})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 4})) (NT (JSLiteral "") (SpanPoint {span_filename = "", span_row = 1, span_column = 6}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 6})) -- readJs "bob:if(x){}\n{a}" _case2 :: JSNode-_case2 = NS (JSSourceElementsTop [NS (JSLabelled (NS (JSIdentifier "bob") (SpanPoint {span_filename = "", span_row = 1, span_column = 1})) (NS (JSIf (NS (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 8})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 8})) (NS (JSStatementBlock (NS (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 10}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 10}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 5}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1}),NS (JSStatementBlock (NS (JSStatementList [NS (JSExpression [NS (JSIdentifier "a") (SpanPoint {span_filename = "", span_row = 2, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 2, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 2, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 2, span_column = 1})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})+_case2 = undefined -- NS (JSSourceElementsTop [NS (JSLabelled (NS (JSIdentifier "bob") (SpanPoint {span_filename = "", span_row = 1, span_column = 1})) (NN (JSIf (NN (JSExpression [NS (JSIdentifier "x") (SpanPoint {span_filename = "", span_row = 1, span_column = 8})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 8})) (NN (JSStatementBlock (NN (JSStatementList []) (SpanPoint {span_filename = "", span_row = 1, span_column = 10}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 10}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 5}))) (SpanPoint {span_filename = "", span_row = 1, span_column = 1}),NN (JSStatementBlock (NN (JSStatementList [NS (JSExpression [NS (JSIdentifier "a") (SpanPoint {span_filename = "", span_row = 2, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 2, span_column = 2})]) (SpanPoint {span_filename = "", span_row = 2, span_column = 2}))) (SpanPoint {span_filename = "", span_row = 2, span_column = 1})]) (SpanPoint {span_filename = "", span_row = 1, span_column = 1})++-- readJs "switch(i){case 1:1;case 2:2}" -- EOF
buildall.sh view
@@ -1,6 +1,5 @@ #!/bin/sh # do a clean build of all, including the tests-cabal clean && cabal configure -fbuildtests && cabal build && cabal haddock--+#cabal clean && cabal configure -fbuildtests && cabal build && cabal haddock+cabal clean && cabal configure --enable-tests && cabal build && cabal test && cabal haddock
hjsmin.cabal view
@@ -1,5 +1,5 @@ name: hjsmin-version: 0.0.16+version: 0.1.0 license: BSD3 license-file: LICENSE author: Alan Zimmerman <alan.zimm@gmail.com>@@ -10,7 +10,7 @@ other syntactic elements, without changing the semantics. category: Web stability: unstable-cabal-version: >= 1.6+cabal-version: >= 1.9.2 build-type: Simple homepage: http://github.com/alanz/hjsmin bug-reports: http://github.com/alanz/hjsmin/issues@@ -19,33 +19,32 @@ TODO.txt, README.markdown, buildall.sh -flag buildtests- description: Build the executable to run unit tests- default: False- library build-depends: base >= 4 && < 5 , bytestring >= 0.9 && < 0.10 , blaze-builder >= 0.2 && < 1 , text >= 0.8 && < 1 , containers >= 0.2 && < 0.5- , language-javascript >= 0.4.4 && < 0.5+ , language-javascript >= 0.5.1 && < 0.6 exposed-modules: Text.Jasmine other-modules: Text.Jasmine.Pretty ghc-options: -Wall -executable runtests- if flag(buildtests)- Buildable: True- cpp-options: -DTEST- build-depends: QuickCheck >= 2 && < 3,- HUnit,- test-framework-hunit,- test-framework - else- Buildable: False- main-is: runtests.hs+Test-Suite test-hjsmin+ Type: exitcode-stdio-1.0+ Main-is: runtests.hs+ build-depends: Cabal >= 1.9.2+ , QuickCheck >= 2 && < 3+ , HUnit+ , test-framework+ , test-framework-hunit+ , base >= 4 && < 5+ , bytestring >= 0.9 && < 0.10+ , blaze-builder >= 0.2 && < 1+ , text >= 0.8 && < 1+ , containers >= 0.2 && < 0.5+ , language-javascript >= 0.5.1 && < 0.6 source-repository head type: git
runtests.hs view
@@ -1,3 +1,4 @@+module Main where import Test.Framework (defaultMain, testGroup, Test) import Test.Framework.Providers.HUnit@@ -34,11 +35,15 @@ , testCase "Unicode" caseUnicode , testCase "Issue3" caseIssue3 , testCase "Issue4" caseIssue4- , testCase "Issue7" caseIssue7+ , testCase "Switch1" caseSwitch1+ , testCase "If1" caseIf1+ , testCase "If2" caseIf2+ , testCase "If3" caseIf3+ , testCase "BootstrapDropdown" caseBootstrapDropdown ] testSuiteMin :: Test-testSuiteMin = testGroup "Text.Jasmine.Pretty"+testSuiteMin = testGroup "Text.Jasmine.Pretty Min" [ testCase "helloWorld" caseMinHelloWorld , testCase "helloWorld2" caseMinHelloWorld2 , testCase "simpleAssignment" caseMinSimpleAssignment@@ -56,7 +61,11 @@ , testCase "Unicode" caseMinUnicode , testCase "MinIssue3" caseMinIssue3 , testCase "MinIssue4" caseMinIssue4- , testCase "MinIssue7" caseMinIssue7+ , testCase "MinSwitch1" caseMinSwitch1+ , testCase "MinIf1" caseMinIf1+ , testCase "MinIf2" caseMinIf2+ , testCase "MinIf3" caseMinIf3+ , testCase "MinBootstrapDropdown" caseMinBootstrapDropdown ] testSuiteFiles :: Test@@ -121,12 +130,11 @@ , testCase "122_jsexec.js" (testFileUnminified "122_jsexec.js") --, testCase "122_jsexec2.js" (testFileUnminified "122_jsexec2.js")- ] srcHelloWorld = "function Hello(a) {}" caseHelloWorld =- "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSFunctionBody [])])"+ "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSBlock ([])),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcHelloWorld) caseMinHelloWorld = -- "function Hello(a){}" @=? (minify (U.fromString srcHelloWorld))@@ -134,7 +142,7 @@ srcHelloWorld2 = "function Hello(a) {b=1}" caseHelloWorld2 =- "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSFunctionBody [JSSourceElements [JSExpression [JSIdentifier \"b\",JSOperator \"=\",JSDecimal \"1\"]]])])"+ "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSBlock ([JSExpression [JSIdentifier \"b\",JSOperator JSLiteral \"=\",JSDecimal \"1\"]])),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcHelloWorld2) caseMinHelloWorld2 = -- "function Hello(a){b=1}" @=? (minify (U.fromString srcHelloWorld2))@@ -142,43 +150,42 @@ srcSimpleAssignment = "a=1;" caseSimpleAssignment =- "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"a\",JSOperator \"=\",JSDecimal \"1\"],JSLiteral \";\"])"+ "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"a\",JSOperator JSLiteral \"=\",JSDecimal \"1\"],JSLiteral \";\",JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcSimpleAssignment) caseMinSimpleAssignment = testMinify "a=1" srcSimpleAssignment srcEmptyFor = "for (i = 0;;){}" caseEmptyFor =- "Right (JSSourceElementsTop [JSFor [JSExpression [JSIdentifier \"i\",JSOperator \"=\",JSDecimal \"0\"]] [] [] (JSStatementBlock (JSStatementList []))])"+ "Right (JSSourceElementsTop [JSFor [JSExpression [JSIdentifier \"i\",JSOperator JSLiteral \"=\",JSDecimal \"0\"]] [] [] (JSBlock ([])),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcEmptyFor) srcFullFor = "for (i = 0;i<10;i++){}" caseFullFor =- "Right (JSSourceElementsTop [JSFor [JSExpression [JSIdentifier \"i\",JSOperator \"=\",JSDecimal \"0\"]] [JSExpression [JSExpressionBinary \"<\" [JSIdentifier \"i\"] [JSDecimal \"10\"]]] [JSExpression [JSExpressionPostfix \"++\" [JSIdentifier \"i\"]]] (JSStatementBlock (JSStatementList []))])"+ "Right (JSSourceElementsTop [JSFor [JSExpression [JSIdentifier \"i\",JSOperator JSLiteral \"=\",JSDecimal \"0\"]] [JSExpression [JSExpressionBinary \"<\" [JSIdentifier \"i\"] [JSDecimal \"10\"]]] [JSExpression [JSExpressionPostfix \"++\" [JSIdentifier \"i\"]]] (JSBlock ([])),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcFullFor) srcForVarFull = "for(var i=0,j=tokens.length;i<j;i++){}" caseForVarFull =- "Right (JSSourceElementsTop [JSForVar [JSVarDecl (JSIdentifier \"i\") [JSDecimal \"0\"],JSVarDecl (JSIdentifier \"j\") [JSMemberDot [JSIdentifier \"tokens\"] (JSIdentifier \"length\")]] [JSExpression [JSExpressionBinary \"<\" [JSIdentifier \"i\"] [JSIdentifier \"j\"]]] [JSExpression [JSExpressionPostfix \"++\" [JSIdentifier \"i\"]]] (JSStatementBlock (JSStatementList []))])"+ "Right (JSSourceElementsTop [JSForVar [JSVarDecl (JSIdentifier \"i\") [JSLiteral \"=\",JSDecimal \"0\"],JSLiteral \",\",JSVarDecl (JSIdentifier \"j\") [JSLiteral \"=\",JSMemberDot [JSIdentifier \"tokens\"] (JSIdentifier \"length\")]] [JSExpression [JSExpressionBinary \"<\" [JSIdentifier \"i\"] [JSIdentifier \"j\"]]] [JSExpression [JSExpressionPostfix \"++\" [JSIdentifier \"i\"]]] (JSBlock ([])),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcForVarFull) srcIfElse1 = "if(a){b=1}else c=2"; caseIfElse1 =- "Right (JSSourceElementsTop [JSIfElse (JSExpression [JSIdentifier \"a\"]) (JSStatementBlock (JSStatementList [JSExpression [JSIdentifier \"b\",JSOperator \"=\",JSDecimal \"1\"]])) (JSExpression [JSIdentifier \"c\",JSOperator \"=\",JSDecimal \"2\"])])"+ "Right (JSSourceElementsTop [JSIf (JSExpression [JSIdentifier \"a\"]) ([JSBlock ([JSExpression [JSIdentifier \"b\",JSOperator JSLiteral \"=\",JSDecimal \"1\"]])]) ([JSLiteral \"else\",JSExpression [JSIdentifier \"c\",JSOperator JSLiteral \"=\",JSDecimal \"2\"]]),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcIfElse1) caseMinIfElse1 = testMinify "if(a){b=1}else c=2" srcIfElse1 srcIfElse2 = "if(a){b=1}else {c=2;d=4}"; caseIfElse2 =- "Right (JSSourceElementsTop [JSIfElse (JSExpression [JSIdentifier \"a\"]) (JSStatementBlock (JSStatementList [JSExpression [JSIdentifier \"b\",JSOperator \"=\",JSDecimal \"1\"]])) (JSStatementBlock (JSStatementList [JSExpression [JSIdentifier \"c\",JSOperator \"=\",JSDecimal \"2\"],JSLiteral \";\",JSExpression [JSIdentifier \"d\",JSOperator \"=\",JSDecimal \"4\"]]))])"+ "Right (JSSourceElementsTop [JSIf (JSExpression [JSIdentifier \"a\"]) ([JSBlock ([JSExpression [JSIdentifier \"b\",JSOperator JSLiteral \"=\",JSDecimal \"1\"]])]) ([JSLiteral \"else\",JSBlock ([JSExpression [JSIdentifier \"c\",JSOperator JSLiteral \"=\",JSDecimal \"2\"],JSLiteral \";\",JSExpression [JSIdentifier \"d\",JSOperator JSLiteral \"=\",JSDecimal \"4\"]])]),JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcIfElse2) caseMinIfElse2 = testMinify "if(a){b=1}else{c=2;d=4}" srcIfElse2 src0_f = "function Hello(a) {ExprArray(1,1);}" case0_f =- -- "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSFunctionBody [JSSourceElements [JSExpression [JSIdentifier \"ExprArray\",JSArguments [[JSDecimal 1],[JSDecimal 1]]],JSLiteral \"\"]])]"- "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSFunctionBody [JSSourceElements [JSExpression [JSIdentifier \"ExprArray\",JSArguments [[JSDecimal \"1\"],[JSDecimal \"1\"]]],JSLiteral \";\"]])])"+ "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Hello\") [JSIdentifier \"a\"] (JSBlock ([JSExpression [JSIdentifier \"ExprArray\",JSArguments [JSDecimal \"1\",JSLiteral \",\",JSDecimal \"1\"]],JSLiteral \";\"])),JSLiteral \"\"])" -- @=? (show $ parseString program src0_f) @=? (showStrippedMaybe $ parseProgram src0_f) caseMin0_f =@@ -192,21 +199,21 @@ "// five\n"++ "five") case01_semi1 =- "Right (JSSourceElementsTop [JSStatementBlock (JSStatementList [JSExpression [JSMemberDot [JSIdentifier \"zero\"] (JSIdentifier \"one1\")],JSLiteral \";\",JSExpression [JSIdentifier \"zero\"]]),JSExpression [JSIdentifier \"one1\"],JSExpression [JSIdentifier \"two\"],JSLiteral \";\",JSExpression [JSIdentifier \"three\"],JSStatementBlock (JSStatementList [JSStatementBlock (JSStatementList [])]),JSExpression [JSIdentifier \"four\"],JSLiteral \";\",JSExpression [JSIdentifier \"five\"]])"+ "Right (JSSourceElementsTop [JSBlock ([JSExpression [JSMemberDot [JSIdentifier \"zero\"] (JSIdentifier \"one1\")],JSLiteral \";\",JSExpression [JSIdentifier \"zero\"]]),JSExpression [JSIdentifier \"one1\"],JSExpression [JSIdentifier \"two\"],JSLiteral \";\",JSExpression [JSIdentifier \"three\"],JSBlock ([JSBlock ([])]),JSExpression [JSIdentifier \"four\"],JSLiteral \";\",JSExpression [JSIdentifier \"five\"],JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram src01_semi1) caseMin01_semi1 = testMinify "{zero.one1;zero};one1;two;three;four;five" src01_semi1 src_min_100_animals = "function Animal(name){if(!name)throw new Error('Must specify an animal name');this.name=name};Animal.prototype.toString=function(){return this.name};o=new Animal(\"bob\");o.toString()==\"bob\"" case_min_100_animals =- "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Animal\") [JSIdentifier \"name\"] (JSFunctionBody [JSSourceElements [JSIf (JSExpression [JSUnary \"!\",JSIdentifier \"name\"]) (JSBlock (JSStatementList [JSThrow (JSExpression [JSLiteral \"new \",JSIdentifier \"Error\",JSArguments [[JSStringLiteral '\\'' \"Must specify an animal name\"]]])])),JSExpression [JSMemberDot [JSLiteral \"this\"] (JSIdentifier \"name\"),JSOperator \"=\",JSIdentifier \"name\"]]]),JSLiteral \";\",JSExpression [JSMemberDot [JSMemberDot [JSIdentifier \"Animal\"] (JSIdentifier \"prototype\")] (JSIdentifier \"toString\"),JSOperator \"=\",JSFunctionExpression [] [] (JSFunctionBody [JSSourceElements [JSReturn [JSExpression [JSMemberDot [JSLiteral \"this\"] (JSIdentifier \"name\")],JSLiteral \"\"]]])],JSLiteral \";\",JSExpression [JSIdentifier \"o\",JSOperator \"=\",JSLiteral \"new \",JSIdentifier \"Animal\",JSArguments [[JSStringLiteral '\"' \"bob\"]]],JSLiteral \";\",JSExpression [JSExpressionBinary \"==\" [JSMemberDot [JSIdentifier \"o\"] (JSIdentifier \"toString\"),JSArguments []] [JSStringLiteral '\"' \"bob\"]]])"+ "Right (JSSourceElementsTop [JSFunction (JSIdentifier \"Animal\") [JSIdentifier \"name\"] (JSBlock ([JSIf (JSExpression [JSUnary \"!\",JSIdentifier \"name\"]) ([JSThrow (JSExpression [JSLiteral \"new\",JSIdentifier \"Error\",JSArguments [JSStringLiteral '\\'' \"Must specify an animal name\"]]),JSLiteral \";\"]) ([]),JSExpression [JSMemberDot [JSLiteral \"this\"] (JSIdentifier \"name\"),JSOperator JSLiteral \"=\",JSIdentifier \"name\"]])),JSLiteral \";\",JSExpression [JSMemberDot [JSMemberDot [JSIdentifier \"Animal\"] (JSIdentifier \"prototype\")] (JSIdentifier \"toString\"),JSOperator JSLiteral \"=\",JSFunctionExpression [] [] (JSBlock ([JSReturn [JSExpression [JSMemberDot [JSLiteral \"this\"] (JSIdentifier \"name\")]] JSLiteral \"\"]))],JSLiteral \";\",JSExpression [JSIdentifier \"o\",JSOperator JSLiteral \"=\",JSLiteral \"new\",JSIdentifier \"Animal\",JSArguments [JSStringLiteral '\"' \"bob\"]],JSLiteral \";\",JSExpression [JSExpressionBinary \"==\" [JSMemberDot [JSIdentifier \"o\"] (JSIdentifier \"toString\"),JSArguments []] [JSStringLiteral '\"' \"bob\"]],JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram src_min_100_animals) caseMin_min_100_animals = testMinify src_min_100_animals src_min_100_animals srcMergeStrings = "throw new TypeError(\"Function.prototype.apply called on\"+\" uncallable object\");" caseMergeStrings =- "Right (JSSourceElementsTop [JSThrow (JSExpression [JSLiteral \"new \",JSIdentifier \"TypeError\",JSArguments [[JSExpressionBinary \"+\" [JSStringLiteral '\"' \"Function.prototype.apply called on\"] [JSStringLiteral '\"' \" uncallable object\"]]]]),JSLiteral \";\"])"+ "Right (JSSourceElementsTop [JSThrow (JSExpression [JSLiteral \"new\",JSIdentifier \"TypeError\",JSArguments [JSExpressionBinary \"+\" [JSStringLiteral '\"' \"Function.prototype.apply called on\"] [JSStringLiteral '\"' \" uncallable object\"]]]),JSLiteral \";\",JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcMergeStrings) caseMinMergeStrings = testMinify "throw new TypeError(\"Function.prototype.apply called on uncallable object\")" srcMergeStrings@@ -219,8 +226,9 @@ testMinify "this.cursor+=match[0].length" srcNestedSquare caseEitherLeft =- Left "UnexpectedToken (MulToken {token_span = (AlexPn 2 1 3,'=',\"*SYNTAX*ERROR*\")})"- -- Left "UnexpectedToken (MulToken {token_span = SpanPoint {span_filename = \"src\", span_row = 1, span_column = 3}})"+ -- Left "UnexpectedToken (MulToken {token_span = (AlexPn 2 1 3,'=',\"*SYNTAX*ERROR*\")})"+ -- Left "\"MulToken {token_span = TokenPn 2 1 3, token_comment = [NoComment]}\""+ Left "\"MulToken {token_span = TokenPn 2 1 3, token_comment = [NoComment]}\"" @=? minifym (LB.fromChunks [(E.encodeUtf8 $ T.pack "a=*SYNTAX*ERROR*")]) caseEitherRight =@@ -228,54 +236,74 @@ srcTrailingCommas = "x={a:1,};y=[d,e,];" caseTrailingCommas =- "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"x\",JSOperator \"=\",JSObjectLiteral [JSPropertyNameandValue (JSIdentifier \"a\") [JSDecimal \"1\"],JSLiteral \",\"]],JSLiteral \";\",JSExpression [JSIdentifier \"y\",JSOperator \"=\",JSArrayLiteral [JSIdentifier \"d\",JSElision [],JSIdentifier \"e\",JSLiteral \",\"]],JSLiteral \";\"])"+ "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"x\",JSOperator JSLiteral \"=\",JSObjectLiteral [JSPropertyNameandValue (JSIdentifier \"a\") [JSDecimal \"1\"],JSLiteral \",\"]],JSLiteral \";\",JSExpression [JSIdentifier \"y\",JSOperator JSLiteral \"=\",JSArrayLiteral [JSIdentifier \"d\",JSElision JSLiteral \",\",JSIdentifier \"e\",JSLiteral \",\"]],JSLiteral \";\",JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcTrailingCommas) caseMinTrailingCommas = testMinify "x={a:1,};y=[d,e,]" srcTrailingCommas srcGetSet = "x={get foo() {return 1},set foo(a) {x=a}}" caseGetSet =- "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"x\",JSOperator \"=\",JSObjectLiteral [JSPropertyAccessor \"get\" (JSIdentifier \"foo\") [] (JSFunctionBody [JSSourceElements [JSReturn [JSExpression [JSDecimal \"1\"],JSLiteral \"\"]]]),JSPropertyAccessor \"set\" (JSIdentifier \"foo\") [JSIdentifier \"a\"] (JSFunctionBody [JSSourceElements [JSExpression [JSIdentifier \"x\",JSOperator \"=\",JSIdentifier \"a\"]]])]]])"+ "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"x\",JSOperator JSLiteral \"=\",JSObjectLiteral [JSPropertyAccessor NT (JSLiteral \"get\") (TokenPn 3 1 4) [NoComment] (JSIdentifier \"foo\") [] (JSBlock ([JSReturn [JSExpression [JSDecimal \"1\"]] JSLiteral \"\"])),JSLiteral \",\",JSPropertyAccessor NT (JSLiteral \"set\") (TokenPn 24 1 25) [NoComment] (JSIdentifier \"foo\") [JSIdentifier \"a\"] (JSBlock ([JSExpression [JSIdentifier \"x\",JSOperator JSLiteral \"=\",JSIdentifier \"a\"]]))]],JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcGetSet) caseMinGetSet = testMinify "x={get foo(){return 1},set foo(a){x=a}}" srcGetSet srcUnicode = "var x = \"שלום\";" caseUnicode =- "Right (JSSourceElementsTop [JSVariables \"var\" [JSVarDecl (JSIdentifier \"x\") [JSStringLiteral '\"' \"\\1513\\1500\\1493\\1501\"]]])"+ "Right (JSSourceElementsTop [JSVariables JSLiteral \"var\" [JSVarDecl (JSIdentifier \"x\") [JSLiteral \"=\",JSStringLiteral '\"' \"\\1513\\1500\\1493\\1501\"]],JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcUnicode) caseMinUnicode = testMinify "var x=\"שלום\"" srcUnicode srcIssue3 = "var myLatlng = new google.maps.LatLng(56.8379100, 60.5806664);" caseIssue3 =- "Right (JSSourceElementsTop [JSVariables \"var\" [JSVarDecl (JSIdentifier \"myLatlng\") [JSLiteral \"new \",JSMemberDot [JSMemberDot [JSIdentifier \"google\"] (JSIdentifier \"maps\")] (JSIdentifier \"LatLng\"),JSArguments [[JSDecimal \"56.8379100\"],[JSDecimal \"60.5806664\"]]]]])"+ "Right (JSSourceElementsTop [JSVariables JSLiteral \"var\" [JSVarDecl (JSIdentifier \"myLatlng\") [JSLiteral \"=\",JSLiteral \"new\",JSMemberDot [JSMemberDot [JSIdentifier \"google\"] (JSIdentifier \"maps\")] (JSIdentifier \"LatLng\"),JSArguments [JSDecimal \"56.8379100\",JSLiteral \",\",JSDecimal \"60.5806664\"]]],JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcIssue3) caseMinIssue3 = testMinify "var myLatlng=new google.maps.LatLng(56.8379100,60.5806664)" srcIssue3 srcIssue4 = "/* * geolocation. пытаемся определить свое местоположение * если не получается то используем defaultLocation * @Param {object} map экземпляр карты * @Param {object LatLng} defaultLocation Координаты центра по умолчанию * @Param {function} callbackAfterLocation Фу-ия которая вызывается после * геолокации. Т.к запрос геолокации асинхронен */x" caseIssue4 =- "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"x\"]])"+ "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"x\"],JSLiteral \"\"])" @=? (showStrippedMaybe $ parseProgram srcIssue4) caseMinIssue4 = testMinify "x" srcIssue4 +srcSwitch1 = "switch(i){case 1:1;case 2:2}"+caseSwitch1 =+ "Right (JSSourceElementsTop [JSSwitch (JSExpression [JSIdentifier \"i\"]) JSBlock ([JSCase (JSExpression [JSDecimal \"1\"]) ([JSExpression [JSDecimal \"1\"],JSLiteral \";\"]),JSCase (JSExpression [JSDecimal \"2\"]) ([JSExpression [JSDecimal \"2\"]])]),JSLiteral \"\"])"+ @=? (showStrippedMaybe $ parseProgram srcSwitch1)+caseMinSwitch1 =+ testMinify "switch(i){case 1:1;case 2:2}" srcSwitch1 ---srcIssue7="var hljs=new function(){function k(){if(k.called){return}k.called=true;var r=document.getElementsByTagName(\"pre\");for(var p=0;p<r.length;p++){}}}();"-srcIssue7="var hljs=new function(){function k(){if(k.called){return}}}();"-caseIssue7 =- "Right (JSSourceElementsTop [JSVariables \"var\" [JSVarDecl (JSIdentifier \"hljs\") [JSLiteral \"new \",JSFunctionExpression [] [] (JSFunctionBody [JSSourceElements [JSFunction (JSIdentifier \"k\") [] (JSFunctionBody [JSSourceElements [JSIf (JSExpression [JSMemberDot [JSIdentifier \"k\"] (JSIdentifier \"called\")]) (JSStatementBlock (JSStatementList [JSReturn [JSLiteral \"\"]]))]])]]),JSArguments []]]])"- @=? (showStrippedMaybe $ parseProgram srcIssue7)-caseMinIssue7 =- testMinify "var hljs=new function(){function k(){if(k.called)return}}()" srcIssue7+srcIf1="if(i>0)consts+=\", \";var t=tokens[i];"+caseIf1 =+ "Right (JSSourceElementsTop [JSIf (JSExpression [JSExpressionBinary \">\" [JSIdentifier \"i\"] [JSDecimal \"0\"]]) ([JSExpression [JSIdentifier \"consts\",JSOperator JSLiteral \"+=\",JSStringLiteral '\"' \", \"],JSLiteral \";\"]) ([]),JSVariables JSLiteral \"var\" [JSVarDecl (JSIdentifier \"t\") [JSLiteral \"=\",JSMemberSquare [JSIdentifier \"tokens\"] (JSExpression [JSIdentifier \"i\"])]],JSLiteral \"\"])"+ @=? (showStrippedMaybe $ parseProgram srcIf1)+caseMinIf1 =+ testMinify "if(i>0)consts+=\", \";var t=tokens[i]" srcIf1 -caseIssue7file =- do- x <- readFile ("./test/parsingonly/issue7.js")- y <- readFile ("./test/parsingonly/issue7.js")- let x' = trim x- testMinify x' y+srcIf2 = "if (getValue)\n execute;\nelse {\n execute;\n}"+caseIf2 =+ "Right (JSSourceElementsTop [JSIf (JSExpression [JSIdentifier \"getValue\"]) ([JSExpression [JSIdentifier \"execute\"],JSLiteral \";\"]) ([JSLiteral \"else\",JSBlock ([JSExpression [JSIdentifier \"execute\"],JSLiteral \";\"])]),JSLiteral \"\"])"+ @=? (showStrippedMaybe $ parseProgram srcIf2)+caseMinIf2 =+ testMinify "if(getValue){execute}else execute" srcIf2++srcIf3 = "if(getValue){execute}else execute"+caseIf3 =+ "Right (JSSourceElementsTop [JSIf (JSExpression [JSIdentifier \"getValue\"]) ([JSExpression [JSIdentifier \"execute\"],JSLiteral \";\"]) ([JSLiteral \"else\",JSBlock ([JSExpression [JSIdentifier \"execute\"],JSLiteral \";\"])]),JSLiteral \"\"])"+ @=? (showStrippedMaybe $ parseProgram srcIf2)+caseMinIf3 =+ testMinify "if(getValue){execute}else execute" srcIf3++srcBootstrapDropdown = "clearMenus()\n!isActive && $parent.toggleClass('open')"+caseBootstrapDropdown =+ "Right (JSSourceElementsTop [JSExpression [JSIdentifier \"clearMenus\",JSArguments []],JSExpression [JSExpressionBinary \"&&\" [JSUnary \"!\",JSIdentifier \"isActive\"] [JSMemberDot [JSIdentifier \"$parent\"] (JSIdentifier \"toggleClass\"),JSArguments [JSStringLiteral '\\'' \"open\"]]],JSLiteral \"\"])"+ @=? (showStrippedMaybe $ parseProgram srcBootstrapDropdown)+caseMinBootstrapDropdown =+ -- Note: jsmin preserves the \n, rather than the semi. A matter of taste, it is the same number of chars.+ testMinify "clearMenus();!isActive&&$parent.toggleClass('open')" srcBootstrapDropdown -- --------------------------------------------------------------------- -- utilities