+
+ Report generated by HLint
+v3.6.1
+ - a tool to suggest improvements to your Haskell code.
+
+
+
+src/Language/JavaScript/Parser/AST.hs:556:36-59: Warning: Use <>
+Found
+
"JSAstProgram " ++ ss xs
+Perhaps
+
"JSAstProgram " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:557:35-57: Warning: Use <>
+Found
+
"JSAstModule " ++ ss xs
+Perhaps
+
"JSAstModule " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:558:37-69: Warning: Use <>
+Found
+
"JSAstStatement (" ++ ss s ++ ")"
+Perhaps
+
"JSAstStatement (" <> (ss s ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:558:59-69: Warning: Use <>
+Found
+
ss s ++ ")"
+Perhaps
+
(ss s <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:559:38-71: Warning: Use <>
+Found
+
"JSAstExpression (" ++ ss e ++ ")"
+Perhaps
+
"JSAstExpression (" <> (ss e ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:559:61-71: Warning: Use <>
+Found
+
ss e ++ ")"
+Perhaps
+
(ss e <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:560:35-65: Warning: Use <>
+Found
+
"JSAstLiteral (" ++ ss e ++ ")"
+Perhaps
+
"JSAstLiteral (" <> (ss e ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:560:55-65: Warning: Use <>
+Found
+
ss e ++ ")"
+Perhaps
+
(ss e <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:566:36-63: Warning: Use <>
+Found
+
"JSStatementBlock " ++ ss xs
+Perhaps
+
"JSStatementBlock " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:567:34-60: Warning: Use <>
+Found
+
"JSBreak" ++ commaIf (ss s)
+Perhaps
+
"JSBreak" <> commaIf (ss s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:568:40-84: Warning: Use <>
+Found
+
"JSBreak " ++ singleQuote n ++ commaIf (ss s)
+Perhaps
+
"JSBreak " <> (singleQuote n ++ commaIf (ss s))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:568:54-84: Warning: Use <>
+Found
+
singleQuote n ++ commaIf (ss s)
+Perhaps
+
(singleQuote n <> commaIf (ss s))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:569:37-89: Warning: Use <>
+Found
+
"JSClass " ++ ssid n ++ " (" ++ ss h ++ ") " ++ ss xs
+Perhaps
+
"JSClass " <> (ssid n ++ " (" ++ ss h ++ ") " ++ ss xs)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:569:51-89: Warning: Use <>
+Found
+
ssid n ++ " (" ++ ss h ++ ") " ++ ss xs
+Perhaps
+
(ssid n <> (" (" ++ ss h ++ ") " ++ ss xs))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:569:61-89: Warning: Use <>
+Found
+
" (" ++ ss h ++ ") " ++ ss xs
+Perhaps
+
(" (" <> (ss h ++ ") " ++ ss xs))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:569:69-89: Warning: Use <>
+Found
+
ss h ++ ") " ++ ss xs
+Perhaps
+
(ss h <> (") " ++ ss xs))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:569:77-89: Warning: Use <>
+Found
+
") " ++ ss xs
+Perhaps
+
(") " <> ss xs)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:570:37-66: Warning: Use <>
+Found
+
"JSContinue" ++ commaIf (ss s)
+Perhaps
+
"JSContinue" <> commaIf (ss s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:571:43-90: Warning: Use <>
+Found
+
"JSContinue " ++ singleQuote n ++ commaIf (ss s)
+Perhaps
+
"JSContinue " <> (singleQuote n ++ commaIf (ss s))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:571:60-90: Warning: Use <>
+Found
+
singleQuote n ++ commaIf (ss s)
+Perhaps
+
(singleQuote n <> commaIf (ss s))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:572:30-51: Warning: Use <>
+Found
+
"JSConstant " ++ ss xs
+Perhaps
+
"JSConstant " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:573:43-107: Warning: Use <>
+Found
+
"JSDoWhile (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSDoWhile (" <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:573:60-107: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:573:69-107: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:573:78-107: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:573:87-107: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:573:96-107: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:49-124: Warning: Use <>
+Found
+
"JSFor "
+ ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
"JSFor "
+ <>
+ (ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:61-124: Warning: Use <>
+Found
+
ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x1s
+ <> (" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:71-124: Warning: Use <>
+Found
+
" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:78-124: Warning: Use <>
+Found
+
ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x2s <> (" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:88-124: Warning: Use <>
+Found
+
" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:95-124: Warning: Use <>
+Found
+
ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x3s <> (" (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:105-124: Warning: Use <>
+Found
+
" (" ++ ss x4 ++ ")"
+Perhaps
+
(" (" <> (ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:574:113-124: Warning: Use <>
+Found
+
ss x4 ++ ")"
+Perhaps
+
(ss x4 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:575:41-102: Warning: Use <>
+Found
+
"JSForIn " ++ ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForIn " <> (ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:575:55-102: Warning: Use <>
+Found
+
ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1s <> (" (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:575:65-102: Warning: Use <>
+Found
+
" (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:575:73-102: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:575:82-102: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:575:91-102: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:55-133: Warning: Use <>
+Found
+
"JSForVar "
+ ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
"JSForVar "
+ <>
+ (ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:70-133: Warning: Use <>
+Found
+
ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x1s
+ <> (" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:80-133: Warning: Use <>
+Found
+
" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:87-133: Warning: Use <>
+Found
+
ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x2s <> (" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:97-133: Warning: Use <>
+Found
+
" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:104-133: Warning: Use <>
+Found
+
ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x3s <> (" (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:114-133: Warning: Use <>
+Found
+
" (" ++ ss x4 ++ ")"
+Perhaps
+
(" (" <> (ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:576:122-133: Warning: Use <>
+Found
+
ss x4 ++ ")"
+Perhaps
+
(ss x4 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:577:46-111: Warning: Use <>
+Found
+
"JSForVarIn (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForVarIn ("
+ <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:577:64-111: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:577:73-111: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:577:82-111: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:577:91-111: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:577:100-111: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:55-133: Warning: Use <>
+Found
+
"JSForLet "
+ ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
"JSForLet "
+ <>
+ (ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:70-133: Warning: Use <>
+Found
+
ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x1s
+ <> (" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:80-133: Warning: Use <>
+Found
+
" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:87-133: Warning: Use <>
+Found
+
ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x2s <> (" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:97-133: Warning: Use <>
+Found
+
" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:104-133: Warning: Use <>
+Found
+
ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x3s <> (" (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:114-133: Warning: Use <>
+Found
+
" (" ++ ss x4 ++ ")"
+Perhaps
+
(" (" <> (ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:578:122-133: Warning: Use <>
+Found
+
ss x4 ++ ")"
+Perhaps
+
(ss x4 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:579:46-111: Warning: Use <>
+Found
+
"JSForLetIn (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForLetIn ("
+ <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:579:64-111: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:579:73-111: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:579:82-111: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:579:91-111: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:579:100-111: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:580:46-111: Warning: Use <>
+Found
+
"JSForLetOf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForLetOf ("
+ <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:580:64-111: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:580:73-111: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:580:82-111: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:580:91-111: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:580:100-111: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:57-137: Warning: Use <>
+Found
+
"JSForConst "
+ ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
"JSForConst "
+ <>
+ (ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:74-137: Warning: Use <>
+Found
+
ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x1s
+ <> (" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:84-137: Warning: Use <>
+Found
+
" " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:91-137: Warning: Use <>
+Found
+
ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x2s <> (" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:101-137: Warning: Use <>
+Found
+
" " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(" " <> (ss x3s ++ " (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:108-137: Warning: Use <>
+Found
+
ss x3s ++ " (" ++ ss x4 ++ ")"
+Perhaps
+
(ss x3s <> (" (" ++ ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:118-137: Warning: Use <>
+Found
+
" (" ++ ss x4 ++ ")"
+Perhaps
+
(" (" <> (ss x4 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:581:126-137: Warning: Use <>
+Found
+
ss x4 ++ ")"
+Perhaps
+
(ss x4 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:582:48-115: Warning: Use <>
+Found
+
"JSForConstIn ("
+ ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForConstIn ("
+ <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:582:68-115: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:582:77-115: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:582:86-115: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:582:95-115: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:582:104-115: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:583:48-115: Warning: Use <>
+Found
+
"JSForConstOf ("
+ ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForConstOf ("
+ <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:583:68-115: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:583:77-115: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:583:86-115: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:583:95-115: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:583:104-115: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:584:41-102: Warning: Use <>
+Found
+
"JSForOf " ++ ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForOf " <> (ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:584:55-102: Warning: Use <>
+Found
+
ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1s <> (" (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:584:65-102: Warning: Use <>
+Found
+
" (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:584:73-102: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:584:82-102: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:584:91-102: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:585:46-111: Warning: Use <>
+Found
+
"JSForVarOf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSForVarOf ("
+ <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:585:64-111: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:585:73-111: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:585:82-111: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:585:91-111: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:585:100-111: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:586:41-103: Warning: Use <>
+Found
+
"JSFunction " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSFunction " <> (ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:586:58-103: Warning: Use <>
+Found
+
ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ssid n <> (" " ++ ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:586:68-103: Warning: Use <>
+Found
+
" " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" " <> (ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:586:75-103: Warning: Use <>
+Found
+
ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss pl <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:586:84-103: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:586:92-103: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:587:48-115: Warning: Use <>
+Found
+
"JSAsyncFunction "
+ ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSAsyncFunction "
+ <> (ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:587:70-115: Warning: Use <>
+Found
+
ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ssid n <> (" " ++ ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:587:80-115: Warning: Use <>
+Found
+
" " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" " <> (ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:587:87-115: Warning: Use <>
+Found
+
ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss pl <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:587:96-115: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:587:104-115: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:588:44-107: Warning: Use <>
+Found
+
"JSGenerator " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSGenerator " <> (ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:588:62-107: Warning: Use <>
+Found
+
ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ssid n <> (" " ++ ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:588:72-107: Warning: Use <>
+Found
+
" " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" " <> (ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:588:79-107: Warning: Use <>
+Found
+
ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss pl <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:588:88-107: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:588:96-107: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:589:31-72: Warning: Use <>
+Found
+
"JSIf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ")"
+Perhaps
+
"JSIf (" <> (ss x1 ++ ") (" ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:589:43-72: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:589:52-72: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:589:61-72: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:590:41-104: Warning: Use <>
+Found
+
"JSIfElse (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
"JSIfElse (" <> (ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:590:57-104: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:590:66-104: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:590:75-104: Warning: Use <>
+Found
+
ss x2 ++ ") (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> (") (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:590:84-104: Warning: Use <>
+Found
+
") (" ++ ss x3 ++ ")"
+Perhaps
+
(") (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:590:93-104: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:591:30-77: Warning: Use <>
+Found
+
"JSLabelled (" ++ ss x1 ++ ") (" ++ ss x2 ++ ")"
+Perhaps
+
"JSLabelled (" <> (ss x1 ++ ") (" ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:591:48-77: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:591:57-77: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:591:66-77: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:592:25-41: Warning: Use <>
+Found
+
"JSLet " ++ ss xs
+Perhaps
+
"JSLet " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:594:36-98: Warning: Use <>
+Found
+
ss l ++ (let x = ss s in if not (null x) then "," ++ x else "")
+Perhaps
+
ss l <> (let x = ss s in if not (null x) then "," ++ x else "")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:594:82-89: Warning: Use <>
+Found
+
"," ++ x
+Perhaps
+
"," <> x
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:41-158: Warning: Use <>
+Found
+
"JSOpAssign ("
+ ++
+ ss op
+ ++
+ ","
+ ++
+ ss lhs
+ ++
+ ","
+ ++
+ ss rhs ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
"JSOpAssign ("
+ <>
+ (ss op
+ ++
+ ","
+ ++
+ ss lhs
+ ++
+ ","
+ ++
+ ss rhs
+ ++ (let x = ss s in if not (null x) then ")," ++ x else ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:59-158: Warning: Use <>
+Found
+
ss op
+ ++
+ ","
+ ++
+ ss lhs
+ ++
+ ","
+ ++
+ ss rhs ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(ss op
+ <>
+ (","
+ ++
+ ss lhs
+ ++
+ ","
+ ++
+ ss rhs
+ ++ (let x = ss s in if not (null x) then ")," ++ x else ")")))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:68-158: Warning: Use <>
+Found
+
","
+ ++
+ ss lhs
+ ++
+ ","
+ ++
+ ss rhs ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(","
+ <>
+ (ss lhs
+ ++
+ ","
+ ++
+ ss rhs
+ ++ (let x = ss s in if not (null x) then ")," ++ x else ")")))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:75-158: Warning: Use <>
+Found
+
ss lhs
+ ++
+ ","
+ ++
+ ss rhs ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(ss lhs
+ <>
+ (","
+ ++
+ ss rhs
+ ++ (let x = ss s in if not (null x) then ")," ++ x else ")")))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:85-158: Warning: Use <>
+Found
+
","
+ ++
+ ss rhs ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(","
+ <>
+ (ss rhs
+ ++ (let x = ss s in if not (null x) then ")," ++ x else ")")))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:92-158: Warning: Use <>
+Found
+
ss rhs ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(ss rhs
+ <> (let x = ss s in if not (null x) then ")," ++ x else ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:595:140-148: Warning: Use <>
+Found
+
")," ++ x
+Perhaps
+
")," <> x
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:596:33-144: Warning: Use <>
+Found
+
"JSMethodCall ("
+ ++
+ ss e
+ ++
+ ",JSArguments "
+ ++
+ ss a ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
"JSMethodCall ("
+ <>
+ (ss e
+ ++
+ ",JSArguments "
+ ++
+ ss a ++ (let x = ss s in if not (null x) then ")," ++ x else ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:596:53-144: Warning: Use <>
+Found
+
ss e
+ ++
+ ",JSArguments "
+ ++
+ ss a ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(ss e
+ <>
+ (",JSArguments "
+ ++
+ ss a ++ (let x = ss s in if not (null x) then ")," ++ x else ")")))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:596:61-144: Warning: Use <>
+Found
+
",JSArguments "
+ ++
+ ss a ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(",JSArguments "
+ <>
+ (ss a
+ ++ (let x = ss s in if not (null x) then ")," ++ x else ")")))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:596:80-144: Warning: Use <>
+Found
+
ss a ++ (let x = ss s in if not (null x) then ")," ++ x else ")")
+Perhaps
+
(ss a <> (let x = ss s in if not (null x) then ")," ++ x else ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:596:126-134: Warning: Use <>
+Found
+
")," ++ x
+Perhaps
+
")," <> x
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:597:33-67: Warning: Use <>
+Found
+
"JSReturn " ++ ss me ++ " " ++ ss s
+Perhaps
+
"JSReturn " <> (ss me ++ " " ++ ss s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:597:48-67: Warning: Use <>
+Found
+
ss me ++ " " ++ ss s
+Perhaps
+
(ss me <> (" " ++ ss s))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:597:57-67: Warning: Use <>
+Found
+
" " ++ ss s
+Perhaps
+
(" " <> ss s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:598:31-49: Warning: Use <>
+Found
+
"JSReturn " ++ ss s
+Perhaps
+
"JSReturn " <> ss s
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:599:44-80: Warning: Use <>
+Found
+
"JSSwitch (" ++ ss x ++ ") " ++ ss x2
+Perhaps
+
"JSSwitch (" <> (ss x ++ ") " ++ ss x2)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:599:60-80: Warning: Use <>
+Found
+
ss x ++ ") " ++ ss x2
+Perhaps
+
(ss x <> (") " ++ ss x2))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:599:68-80: Warning: Use <>
+Found
+
") " ++ ss x2
+Perhaps
+
(") " <> ss x2)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:600:24-49: Warning: Use <>
+Found
+
"JSThrow (" ++ ss x ++ ")"
+Perhaps
+
"JSThrow (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:600:39-49: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:601:30-89: Warning: Use <>
+Found
+
"JSTry (" ++ ss xt1 ++ "," ++ ss xtc ++ "," ++ ss xtf ++ ")"
+Perhaps
+
"JSTry (" <> (ss xt1 ++ "," ++ ss xtc ++ "," ++ ss xtf ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:601:43-89: Warning: Use <>
+Found
+
ss xt1 ++ "," ++ ss xtc ++ "," ++ ss xtf ++ ")"
+Perhaps
+
(ss xt1 <> ("," ++ ss xtc ++ "," ++ ss xtf ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:601:53-89: Warning: Use <>
+Found
+
"," ++ ss xtc ++ "," ++ ss xtf ++ ")"
+Perhaps
+
("," <> (ss xtc ++ "," ++ ss xtf ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:601:60-89: Warning: Use <>
+Found
+
ss xtc ++ "," ++ ss xtf ++ ")"
+Perhaps
+
(ss xtc <> ("," ++ ss xtf ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:601:70-89: Warning: Use <>
+Found
+
"," ++ ss xtf ++ ")"
+Perhaps
+
("," <> (ss xtf ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:601:77-89: Warning: Use <>
+Found
+
ss xtf ++ ")"
+Perhaps
+
(ss xtf <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:602:30-51: Warning: Use <>
+Found
+
"JSVariable " ++ ss xs
+Perhaps
+
"JSVariable " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:603:34-78: Warning: Use <>
+Found
+
"JSWhile (" ++ ss x1 ++ ") (" ++ ss x2 ++ ")"
+Perhaps
+
"JSWhile (" <> (ss x1 ++ ") (" ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:603:49-78: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:603:58-78: Warning: Use <>
+Found
+
") (" ++ ss x2 ++ ")"
+Perhaps
+
(") (" <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:603:67-78: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:604:34-76: Warning: Use <>
+Found
+
"JSWith (" ++ ss x1 ++ ") (" ++ ss x ++ ")"
+Perhaps
+
"JSWith (" <> (ss x1 ++ ") (" ++ ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:604:48-76: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:604:57-76: Warning: Use <>
+Found
+
") (" ++ ss x ++ ")"
+Perhaps
+
(") (" <> (ss x ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:604:66-76: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:607:36-61: Warning: Use <>
+Found
+
"JSArrayLiteral " ++ ss xs
+Perhaps
+
"JSArrayLiteral " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:608:40-103: Warning: Use <>
+Found
+
"JSOpAssign (" ++ ss op ++ "," ++ ss lhs ++ "," ++ ss rhs ++ ")"
+Perhaps
+
"JSOpAssign (" <> (ss op ++ "," ++ ss lhs ++ "," ++ ss rhs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:608:58-103: Warning: Use <>
+Found
+
ss op ++ "," ++ ss lhs ++ "," ++ ss rhs ++ ")"
+Perhaps
+
(ss op <> ("," ++ ss lhs ++ "," ++ ss rhs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:608:67-103: Warning: Use <>
+Found
+
"," ++ ss lhs ++ "," ++ ss rhs ++ ")"
+Perhaps
+
("," <> (ss lhs ++ "," ++ ss rhs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:608:74-103: Warning: Use <>
+Found
+
ss lhs ++ "," ++ ss rhs ++ ")"
+Perhaps
+
(ss lhs <> ("," ++ ss rhs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:608:84-103: Warning: Use <>
+Found
+
"," ++ ss rhs ++ ")"
+Perhaps
+
("," <> (ss rhs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:608:91-103: Warning: Use <>
+Found
+
ss rhs ++ ")"
+Perhaps
+
(ss rhs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:609:32-58: Warning: Use <>
+Found
+
"JSAwaitExpresson " ++ ss e
+Perhaps
+
"JSAwaitExpresson " <> ss e
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:610:37-100: Warning: Use <>
+Found
+
"JSCallExpression (" ++ ss ex ++ ",JSArguments " ++ ss xs ++ ")"
+Perhaps
+
"JSCallExpression (" <> (ss ex ++ ",JSArguments " ++ ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:610:61-100: Warning: Use <>
+Found
+
ss ex ++ ",JSArguments " ++ ss xs ++ ")"
+Perhaps
+
(ss ex <> (",JSArguments " ++ ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:610:70-100: Warning: Use <>
+Found
+
",JSArguments " ++ ss xs ++ ")"
+Perhaps
+
(",JSArguments " <> (ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:610:89-100: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:611:40-94: Warning: Use <>
+Found
+
"JSCallExpressionDot (" ++ ss ex ++ "," ++ ss xs ++ ")"
+Perhaps
+
"JSCallExpressionDot (" <> (ss ex ++ "," ++ ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:611:67-94: Warning: Use <>
+Found
+
ss ex ++ "," ++ ss xs ++ ")"
+Perhaps
+
(ss ex <> ("," ++ ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:611:76-94: Warning: Use <>
+Found
+
"," ++ ss xs ++ ")"
+Perhaps
+
("," <> (ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:611:83-94: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:612:47-104: Warning: Use <>
+Found
+
"JSCallExpressionSquare (" ++ ss ex ++ "," ++ ss xs ++ ")"
+Perhaps
+
"JSCallExpressionSquare (" <> (ss ex ++ "," ++ ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:612:77-104: Warning: Use <>
+Found
+
ss ex ++ "," ++ ss xs ++ ")"
+Perhaps
+
(ss ex <> ("," ++ ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:612:86-104: Warning: Use <>
+Found
+
"," ++ ss xs ++ ")"
+Perhaps
+
("," <> (ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:612:93-104: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:613:45-107: Warning: Use <>
+Found
+
"JSClassExpression " ++ ssid n ++ " (" ++ ss h ++ ") " ++ ss xs
+Perhaps
+
"JSClassExpression " <> (ssid n ++ " (" ++ ss h ++ ") " ++ ss xs)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:613:69-107: Warning: Use <>
+Found
+
ssid n ++ " (" ++ ss h ++ ") " ++ ss xs
+Perhaps
+
(ssid n <> (" (" ++ ss h ++ ") " ++ ss xs))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:613:79-107: Warning: Use <>
+Found
+
" (" ++ ss h ++ ") " ++ ss xs
+Perhaps
+
(" (" <> (ss h ++ ") " ++ ss xs))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:613:87-107: Warning: Use <>
+Found
+
ss h ++ ") " ++ ss xs
+Perhaps
+
(ss h <> (") " ++ ss xs))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:613:95-107: Warning: Use <>
+Found
+
") " ++ ss xs
+Perhaps
+
(") " <> ss xs)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:614:24-54: Warning: Use <>
+Found
+
"JSDecimal " ++ singleQuote (s)
+Perhaps
+
"JSDecimal " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:615:34-79: Warning: Use <>
+Found
+
"JSExpression [" ++ ss l ++ "," ++ ss r ++ "]"
+Perhaps
+
"JSExpression [" <> (ss l ++ "," ++ ss r ++ "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:615:54-79: Warning: Use <>
+Found
+
ss l ++ "," ++ ss r ++ "]"
+Perhaps
+
(ss l <> ("," ++ ss r ++ "]"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:615:62-79: Warning: Use <>
+Found
+
"," ++ ss r ++ "]"
+Perhaps
+
("," <> (ss r ++ "]"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:615:69-79: Warning: Use <>
+Found
+
ss r ++ "]"
+Perhaps
+
(ss r <> "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:616:38-107: Warning: Use <>
+Found
+
"JSExpressionBinary ("
+ ++ ss op ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
"JSExpressionBinary ("
+ <> (ss op ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:616:64-107: Warning: Use <>
+Found
+
ss op ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
(ss op <> ("," ++ ss x2 ++ "," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:616:73-107: Warning: Use <>
+Found
+
"," ++ ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ "," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:616:80-107: Warning: Use <>
+Found
+
ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> ("," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:616:89-107: Warning: Use <>
+Found
+
"," ++ ss x3 ++ ")"
+Perhaps
+
("," <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:616:96-107: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:617:38-73: Warning: Use <>
+Found
+
"JSExpressionParen (" ++ ss x ++ ")"
+Perhaps
+
"JSExpressionParen (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:617:63-73: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:618:36-90: Warning: Use <>
+Found
+
"JSExpressionPostfix (" ++ ss op ++ "," ++ ss xs ++ ")"
+Perhaps
+
"JSExpressionPostfix (" <> (ss op ++ "," ++ ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:618:63-90: Warning: Use <>
+Found
+
ss op ++ "," ++ ss xs ++ ")"
+Perhaps
+
(ss op <> ("," ++ ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:618:72-90: Warning: Use <>
+Found
+
"," ++ ss xs ++ ")"
+Perhaps
+
("," <> (ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:618:79-90: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:619:45-115: Warning: Use <>
+Found
+
"JSExpressionTernary ("
+ ++ ss x1 ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
"JSExpressionTernary ("
+ <> (ss x1 ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:619:72-115: Warning: Use <>
+Found
+
ss x1 ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> ("," ++ ss x2 ++ "," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:619:81-115: Warning: Use <>
+Found
+
"," ++ ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ "," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:619:88-115: Warning: Use <>
+Found
+
ss x2 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
(ss x2 <> ("," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:619:97-115: Warning: Use <>
+Found
+
"," ++ ss x3 ++ ")"
+Perhaps
+
("," <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:619:104-115: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:620:38-89: Warning: Use <>
+Found
+
"JSArrowExpression (" ++ ss ps ++ ") => " ++ ss body
+Perhaps
+
"JSArrowExpression (" <> (ss ps ++ ") => " ++ ss body)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:620:63-89: Warning: Use <>
+Found
+
ss ps ++ ") => " ++ ss body
+Perhaps
+
(ss ps <> (") => " ++ ss body))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:620:72-89: Warning: Use <>
+Found
+
") => " ++ ss body
+Perhaps
+
(") => " <> ss body)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:621:49-121: Warning: Use <>
+Found
+
"JSFunctionExpression "
+ ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSFunctionExpression "
+ <> (ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:621:76-121: Warning: Use <>
+Found
+
ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ssid n <> (" " ++ ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:621:86-121: Warning: Use <>
+Found
+
" " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" " <> (ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:621:93-121: Warning: Use <>
+Found
+
ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss pl <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:621:102-121: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:621:110-121: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:622:52-125: Warning: Use <>
+Found
+
"JSGeneratorExpression "
+ ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSGeneratorExpression "
+ <> (ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:622:80-125: Warning: Use <>
+Found
+
ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ssid n <> (" " ++ ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:622:90-125: Warning: Use <>
+Found
+
" " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" " <> (ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:622:97-125: Warning: Use <>
+Found
+
ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss pl <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:622:106-125: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:622:114-125: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:623:56-133: Warning: Use <>
+Found
+
"JSAsyncFunctionExpression "
+ ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSAsyncFunctionExpression "
+ <> (ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:623:88-133: Warning: Use <>
+Found
+
ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ssid n <> (" " ++ ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:623:98-133: Warning: Use <>
+Found
+
" " ++ ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" " <> (ss pl ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:623:105-133: Warning: Use <>
+Found
+
ss pl ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss pl <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:623:114-133: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:623:122-133: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:624:27-60: Warning: Use <>
+Found
+
"JSHexInteger " ++ singleQuote (s)
+Perhaps
+
"JSHexInteger " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:625:30-66: Warning: Use <>
+Found
+
"JSBinaryInteger " ++ singleQuote (s)
+Perhaps
+
"JSBinaryInteger " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:626:22-50: Warning: Use <>
+Found
+
"JSOctal " ++ singleQuote (s)
+Perhaps
+
"JSOctal " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:627:30-66: Warning: Use <>
+Found
+
"JSBigIntLiteral " ++ singleQuote (s)
+Perhaps
+
"JSBigIntLiteral " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:628:27-60: Warning: Use <>
+Found
+
"JSIdentifier " ++ singleQuote (s)
+Perhaps
+
"JSIdentifier " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:630:24-54: Warning: Use <>
+Found
+
"JSLiteral " ++ singleQuote (s)
+Perhaps
+
"JSLiteral " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:631:32-79: Warning: Use <>
+Found
+
"JSMemberDot (" ++ ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSMemberDot (" <> (ss x1s ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:631:51-79: Warning: Use <>
+Found
+
ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1s <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:631:61-79: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:631:68-79: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:632:37-100: Warning: Use <>
+Found
+
"JSMemberExpression (" ++ ss e ++ ",JSArguments " ++ ss a ++ ")"
+Perhaps
+
"JSMemberExpression (" <> (ss e ++ ",JSArguments " ++ ss a ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:632:63-100: Warning: Use <>
+Found
+
ss e ++ ",JSArguments " ++ ss a ++ ")"
+Perhaps
+
(ss e <> (",JSArguments " ++ ss a ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:632:71-100: Warning: Use <>
+Found
+
",JSArguments " ++ ss a ++ ")"
+Perhaps
+
(",JSArguments " <> (ss a ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:632:90-100: Warning: Use <>
+Found
+
ss a ++ ")"
+Perhaps
+
(ss a <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:633:33-89: Warning: Use <>
+Found
+
"JSMemberNew (" ++ ss n ++ ",JSArguments " ++ ss s ++ ")"
+Perhaps
+
"JSMemberNew (" <> (ss n ++ ",JSArguments " ++ ss s ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:633:52-89: Warning: Use <>
+Found
+
ss n ++ ",JSArguments " ++ ss s ++ ")"
+Perhaps
+
(ss n <> (",JSArguments " ++ ss s ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:633:60-89: Warning: Use <>
+Found
+
",JSArguments " ++ ss s ++ ")"
+Perhaps
+
(",JSArguments " <> (ss s ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:633:79-89: Warning: Use <>
+Found
+
ss s ++ ")"
+Perhaps
+
(ss s <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:634:40-90: Warning: Use <>
+Found
+
"JSMemberSquare (" ++ ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSMemberSquare (" <> (ss x1s ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:634:62-90: Warning: Use <>
+Found
+
ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1s <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:634:72-90: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:634:79-90: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:635:31-56: Warning: Use <>
+Found
+
"JSNewExpression " ++ ss e
+Perhaps
+
"JSNewExpression " <> ss e
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:636:40-95: Warning: Use <>
+Found
+
"JSOptionalMemberDot (" ++ ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSOptionalMemberDot (" <> (ss x1s ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:636:67-95: Warning: Use <>
+Found
+
ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1s <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:636:77-95: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:636:84-95: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:637:48-106: Warning: Use <>
+Found
+
"JSOptionalMemberSquare (" ++ ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSOptionalMemberSquare (" <> (ss x1s ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:637:78-106: Warning: Use <>
+Found
+
ss x1s ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1s <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:637:88-106: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:637:95-106: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:638:45-116: Warning: Use <>
+Found
+
"JSOptionalCallExpression ("
+ ++ ss ex ++ ",JSArguments " ++ ss xs ++ ")"
+Perhaps
+
"JSOptionalCallExpression ("
+ <> (ss ex ++ ",JSArguments " ++ ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:638:77-116: Warning: Use <>
+Found
+
ss ex ++ ",JSArguments " ++ ss xs ++ ")"
+Perhaps
+
(ss ex <> (",JSArguments " ++ ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:638:86-116: Warning: Use <>
+Found
+
",JSArguments " ++ ss xs ++ ")"
+Perhaps
+
(",JSArguments " <> (ss xs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:638:105-116: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:639:37-63: Warning: Use <>
+Found
+
"JSObjectLiteral " ++ ss xs
+Perhaps
+
"JSObjectLiteral " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:640:22-50: Warning: Use <>
+Found
+
"JSRegEx " ++ singleQuote (s)
+Perhaps
+
"JSRegEx " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:641:30-52: Warning: Use <>
+Found
+
"JSStringLiteral " ++ s
+Perhaps
+
"JSStringLiteral " <> s
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:642:33-84: Warning: Use <>
+Found
+
"JSUnaryExpression (" ++ ss op ++ "," ++ ss x ++ ")"
+Perhaps
+
"JSUnaryExpression (" <> (ss op ++ "," ++ ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:642:58-84: Warning: Use <>
+Found
+
ss op ++ "," ++ ss x ++ ")"
+Perhaps
+
(ss op <> ("," ++ ss x ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:642:67-84: Warning: Use <>
+Found
+
"," ++ ss x ++ ")"
+Perhaps
+
("," <> (ss x ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:642:74-84: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:643:36-84: Warning: Use <>
+Found
+
"JSVarInitExpression (" ++ ss x1 ++ ") " ++ ss x2
+Perhaps
+
"JSVarInitExpression (" <> (ss x1 ++ ") " ++ ss x2)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:643:63-84: Warning: Use <>
+Found
+
ss x1 ++ ") " ++ ss x2
+Perhaps
+
(ss x1 <> (") " ++ ss x2))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:643:72-84: Warning: Use <>
+Found
+
") " ++ ss x2
+Perhaps
+
(") " <> ss x2)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:645:39-74: Warning: Use <>
+Found
+
"JSYieldExpression (" ++ ss x ++ ")"
+Perhaps
+
"JSYieldExpression (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:645:64-74: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:646:38-77: Warning: Use <>
+Found
+
"JSYieldFromExpression (" ++ ss x ++ ")"
+Perhaps
+
"JSYieldFromExpression (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:646:67-77: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:648:34-71: Warning: Use <>
+Found
+
"JSSpreadExpression (" ++ ss x1 ++ ")"
+Perhaps
+
"JSSpreadExpression (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:648:60-71: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:649:43-108: Warning: Use <>
+Found
+
"JSTemplateLiteral (()," ++ singleQuote (s) ++ "," ++ ss ps ++ ")"
+Perhaps
+
"JSTemplateLiteral ((),"
+ <> (singleQuote (s) ++ "," ++ ss ps ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:649:71-108: Warning: Use <>
+Found
+
singleQuote (s) ++ "," ++ ss ps ++ ")"
+Perhaps
+
(singleQuote (s) <> ("," ++ ss ps ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:649:90-108: Warning: Use <>
+Found
+
"," ++ ss ps ++ ")"
+Perhaps
+
("," <> (ss ps ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:649:97-108: Warning: Use <>
+Found
+
ss ps ++ ")"
+Perhaps
+
(ss ps <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:650:44-123: Warning: Use <>
+Found
+
"JSTemplateLiteral (("
+ ++ ss t ++ ")," ++ singleQuote (s) ++ "," ++ ss ps ++ ")"
+Perhaps
+
"JSTemplateLiteral (("
+ <> (ss t ++ ")," ++ singleQuote (s) ++ "," ++ ss ps ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:650:70-123: Warning: Use <>
+Found
+
ss t ++ ")," ++ singleQuote (s) ++ "," ++ ss ps ++ ")"
+Perhaps
+
(ss t <> (")," ++ singleQuote (s) ++ "," ++ ss ps ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:650:78-123: Warning: Use <>
+Found
+
")," ++ singleQuote (s) ++ "," ++ ss ps ++ ")"
+Perhaps
+
(")," <> (singleQuote (s) ++ "," ++ ss ps ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:650:86-123: Warning: Use <>
+Found
+
singleQuote (s) ++ "," ++ ss ps ++ ")"
+Perhaps
+
(singleQuote (s) <> ("," ++ ss ps ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:650:105-123: Warning: Use <>
+Found
+
"," ++ ss ps ++ ")"
+Perhaps
+
("," <> (ss ps ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:650:112-123: Warning: Use <>
+Found
+
ss ps ++ ")"
+Perhaps
+
(ss ps <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:657:38-81: Warning: Use <>
+Found
+
"JSConciseFunctionBody (" ++ ss block ++ ")"
+Perhaps
+
"JSConciseFunctionBody (" <> (ss block ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:657:67-81: Warning: Use <>
+Found
+
ss block ++ ")"
+Perhaps
+
(ss block <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:658:39-83: Warning: Use <>
+Found
+
"JSConciseExpressionBody (" ++ ss expr ++ ")"
+Perhaps
+
"JSConciseExpressionBody (" <> (ss expr ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:658:70-83: Warning: Use <>
+Found
+
ss expr ++ ")"
+Perhaps
+
(ss expr <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:661:41-85: Warning: Use <>
+Found
+
"JSModuleExportDeclaration (" ++ ss x1 ++ ")"
+Perhaps
+
"JSModuleExportDeclaration (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:661:74-85: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:662:41-85: Warning: Use <>
+Found
+
"JSModuleImportDeclaration (" ++ ss x1 ++ ")"
+Perhaps
+
"JSModuleImportDeclaration (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:662:74-85: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:663:39-83: Warning: Use <>
+Found
+
"JSModuleStatementListItem (" ++ ss x1 ++ ")"
+Perhaps
+
"JSModuleStatementListItem (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:663:72-83: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:666:47-142: Warning: Use <>
+Found
+
"JSImportDeclaration ("
+ ++
+ ss imp
+ ++ "," ++ ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
"JSImportDeclaration ("
+ <>
+ (ss imp
+ ++ "," ++ ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:666:74-142: Warning: Use <>
+Found
+
ss imp
+ ++ "," ++ ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
(ss imp
+ <> ("," ++ ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:666:84-142: Warning: Use <>
+Found
+
"," ++ ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
("," <> (ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:666:91-142: Warning: Use <>
+Found
+
ss from ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
(ss from <> (maybe "" (\ a -> "," ++ ss a) attrs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:666:102-142: Warning: Use <>
+Found
+
maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
(maybe "" (\ a -> "," ++ ss a) attrs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:666:118-128: Warning: Use <>
+Found
+
"," ++ ss a
+Perhaps
+
"," <> ss a
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:667:46-136: Warning: Use <>
+Found
+
"JSImportDeclarationBare ("
+ ++ singleQuote (m) ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
"JSImportDeclarationBare ("
+ <> (singleQuote (m) ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:667:77-136: Warning: Use <>
+Found
+
singleQuote (m) ++ maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
(singleQuote (m) <> (maybe "" (\ a -> "," ++ ss a) attrs ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:667:96-136: Warning: Use <>
+Found
+
maybe "" (\ a -> "," ++ ss a) attrs ++ ")"
+Perhaps
+
(maybe "" (\ a -> "," ++ ss a) attrs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:667:112-122: Warning: Use <>
+Found
+
"," ++ ss a
+Perhaps
+
"," <> ss a
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:670:34-73: Warning: Use <>
+Found
+
"JSImportClauseDefault (" ++ ss x ++ ")"
+Perhaps
+
"JSImportClauseDefault (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:670:63-73: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:671:36-77: Warning: Use <>
+Found
+
"JSImportClauseNameSpace (" ++ ss x ++ ")"
+Perhaps
+
"JSImportClauseNameSpace (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:671:67-77: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:672:32-73: Warning: Use <>
+Found
+
"JSImportClauseNameSpace (" ++ ss x ++ ")"
+Perhaps
+
"JSImportClauseNameSpace (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:672:63-73: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:673:49-114: Warning: Use <>
+Found
+
"JSImportClauseDefaultNameSpace (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSImportClauseDefaultNameSpace ("
+ <> (ss x1 ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:673:87-114: Warning: Use <>
+Found
+
ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:673:96-114: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:673:103-114: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:674:45-106: Warning: Use <>
+Found
+
"JSImportClauseDefaultNamed (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSImportClauseDefaultNamed (" <> (ss x1 ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:674:79-106: Warning: Use <>
+Found
+
ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:674:88-106: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:674:95-106: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:677:29-62: Warning: Use <>
+Found
+
"JSFromClause " ++ singleQuote (m)
+Perhaps
+
"JSFromClause " <> singleQuote (m)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:680:34-69: Warning: Use <>
+Found
+
"JSImportNameSpace (" ++ ss x ++ ")"
+Perhaps
+
"JSImportNameSpace (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:680:59-69: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:683:32-65: Warning: Use <>
+Found
+
"JSImportsNamed (" ++ ss xs ++ ")"
+Perhaps
+
"JSImportsNamed (" <> (ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:683:54-65: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:686:31-67: Warning: Use <>
+Found
+
"JSImportSpecifier (" ++ ss x1 ++ ")"
+Perhaps
+
"JSImportSpecifier (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:686:56-67: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:687:38-92: Warning: Use <>
+Found
+
"JSImportSpecifierAs (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSImportSpecifierAs (" <> (ss x1 ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:687:65-92: Warning: Use <>
+Found
+
ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:687:74-92: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:687:81-92: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:690:39-79: Warning: Use <>
+Found
+
"JSImportAttributes (" ++ ss attrs ++ ")"
+Perhaps
+
"JSImportAttributes (" <> (ss attrs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:690:65-79: Warning: Use <>
+Found
+
ss attrs ++ ")"
+Perhaps
+
(ss attrs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:693:40-96: Warning: Use <>
+Found
+
"JSImportAttribute (" ++ ss key ++ "," ++ ss value ++ ")"
+Perhaps
+
"JSImportAttribute (" <> (ss key ++ "," ++ ss value ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:693:65-96: Warning: Use <>
+Found
+
ss key ++ "," ++ ss value ++ ")"
+Perhaps
+
(ss key <> ("," ++ ss value ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:693:75-96: Warning: Use <>
+Found
+
"," ++ ss value ++ ")"
+Perhaps
+
("," <> (ss value ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:693:82-96: Warning: Use <>
+Found
+
ss value ++ ")"
+Perhaps
+
(ss value <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:696:38-92: Warning: Use <>
+Found
+
"JSExportAllFrom (" ++ ss star ++ "," ++ ss from ++ ")"
+Perhaps
+
"JSExportAllFrom (" <> (ss star ++ "," ++ ss from ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:696:61-92: Warning: Use <>
+Found
+
ss star ++ "," ++ ss from ++ ")"
+Perhaps
+
(ss star <> ("," ++ ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:696:72-92: Warning: Use <>
+Found
+
"," ++ ss from ++ ")"
+Perhaps
+
("," <> (ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:696:79-92: Warning: Use <>
+Found
+
ss from ++ ")"
+Perhaps
+
(ss from <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:697:48-123: Warning: Use <>
+Found
+
"JSExportAllAsFrom ("
+ ++ ss star ++ "," ++ ss ident ++ "," ++ ss from ++ ")"
+Perhaps
+
"JSExportAllAsFrom ("
+ <> (ss star ++ "," ++ ss ident ++ "," ++ ss from ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:697:73-123: Warning: Use <>
+Found
+
ss star ++ "," ++ ss ident ++ "," ++ ss from ++ ")"
+Perhaps
+
(ss star <> ("," ++ ss ident ++ "," ++ ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:697:84-123: Warning: Use <>
+Found
+
"," ++ ss ident ++ "," ++ ss from ++ ")"
+Perhaps
+
("," <> (ss ident ++ "," ++ ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:697:91-123: Warning: Use <>
+Found
+
ss ident ++ "," ++ ss from ++ ")"
+Perhaps
+
(ss ident <> ("," ++ ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:697:103-123: Warning: Use <>
+Found
+
"," ++ ss from ++ ")"
+Perhaps
+
("," <> (ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:697:110-123: Warning: Use <>
+Found
+
ss from ++ ")"
+Perhaps
+
(ss from <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:698:33-82: Warning: Use <>
+Found
+
"JSExportFrom (" ++ ss xs ++ "," ++ ss from ++ ")"
+Perhaps
+
"JSExportFrom (" <> (ss xs ++ "," ++ ss from ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:698:53-82: Warning: Use <>
+Found
+
ss xs ++ "," ++ ss from ++ ")"
+Perhaps
+
(ss xs <> ("," ++ ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:698:62-82: Warning: Use <>
+Found
+
"," ++ ss from ++ ")"
+Perhaps
+
("," <> (ss from ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:698:69-82: Warning: Use <>
+Found
+
ss from ++ ")"
+Perhaps
+
(ss from <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:699:30-63: Warning: Use <>
+Found
+
"JSExportLocals (" ++ ss xs ++ ")"
+Perhaps
+
"JSExportLocals (" <> (ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:699:52-63: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:700:24-51: Warning: Use <>
+Found
+
"JSExport (" ++ ss x1 ++ ")"
+Perhaps
+
"JSExport (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:700:40-51: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:703:32-65: Warning: Use <>
+Found
+
"JSExportClause (" ++ ss xs ++ ")"
+Perhaps
+
"JSExportClause (" <> (ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:703:54-65: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:706:31-67: Warning: Use <>
+Found
+
"JSExportSpecifier (" ++ ss x1 ++ ")"
+Perhaps
+
"JSExportSpecifier (" <> (ss x1 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:706:56-67: Warning: Use <>
+Found
+
ss x1 ++ ")"
+Perhaps
+
(ss x1 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:707:38-92: Warning: Use <>
+Found
+
"JSExportSpecifierAs (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
"JSExportSpecifierAs (" <> (ss x1 ++ "," ++ ss x2 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:707:65-92: Warning: Use <>
+Found
+
ss x1 ++ "," ++ ss x2 ++ ")"
+Perhaps
+
(ss x1 <> ("," ++ ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:707:74-92: Warning: Use <>
+Found
+
"," ++ ss x2 ++ ")"
+Perhaps
+
("," <> (ss x2 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:707:81-92: Warning: Use <>
+Found
+
ss x2 ++ ")"
+Perhaps
+
(ss x2 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:710:34-76: Warning: Use <>
+Found
+
"JSCatch (" ++ ss x1 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
"JSCatch (" <> (ss x1 ++ "," ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:710:49-76: Warning: Use <>
+Found
+
ss x1 ++ "," ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> ("," ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:710:58-76: Warning: Use <>
+Found
+
"," ++ ss x3 ++ ")"
+Perhaps
+
("," <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:710:65-76: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:711:41-104: Warning: Use <>
+Found
+
"JSCatch (" ++ ss x1 ++ ") if " ++ ss ex ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSCatch (" <> (ss x1 ++ ") if " ++ ss ex ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:711:56-104: Warning: Use <>
+Found
+
ss x1 ++ ") if " ++ ss ex ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") if " ++ ss ex ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:711:65-104: Warning: Use <>
+Found
+
") if " ++ ss ex ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(") if " <> (ss ex ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:711:76-104: Warning: Use <>
+Found
+
ss ex ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss ex <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:711:85-104: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:711:93-104: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:714:24-51: Warning: Use <>
+Found
+
"JSFinally (" ++ ss x ++ ")"
+Perhaps
+
"JSFinally (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:714:41-51: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:718:26-59: Warning: Use <>
+Found
+
"JSIdentifier " ++ singleQuote (s)
+Perhaps
+
"JSIdentifier " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:722:47-99: Warning: Use <>
+Found
+
"JSPropertyNameandValue (" ++ ss x1 ++ ") " ++ ss x2s
+Perhaps
+
"JSPropertyNameandValue (" <> (ss x1 ++ ") " ++ ss x2s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:722:77-99: Warning: Use <>
+Found
+
ss x1 ++ ") " ++ ss x2s
+Perhaps
+
(ss x1 <> (") " ++ ss x2s))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:722:86-99: Warning: Use <>
+Found
+
") " ++ ss x2s
+Perhaps
+
(") " <> ss x2s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:723:33-72: Warning: Use <>
+Found
+
"JSPropertyIdentRef " ++ singleQuote (s)
+Perhaps
+
"JSPropertyIdentRef " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:725:32-67: Warning: Use <>
+Found
+
"JSObjectSpread (" ++ ss expr ++ ")"
+Perhaps
+
"JSObjectSpread (" <> (ss expr ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:725:54-67: Warning: Use <>
+Found
+
ss expr ++ ")"
+Perhaps
+
(ss expr <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:728:49-121: Warning: Use <>
+Found
+
"JSMethodDefinition ("
+ ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSMethodDefinition ("
+ <> (ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:728:75-121: Warning: Use <>
+Found
+
ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:728:84-121: Warning: Use <>
+Found
+
") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(") " <> (ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:728:92-121: Warning: Use <>
+Found
+
ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2s <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:728:102-121: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:728:110-121: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:51-138: Warning: Use <>
+Found
+
"JSPropertyAccessor "
+ ++ ss s ++ " (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSPropertyAccessor "
+ <>
+ (ss s ++ " (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:76-138: Warning: Use <>
+Found
+
ss s ++ " (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss s <> (" (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:84-138: Warning: Use <>
+Found
+
" (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:92-138: Warning: Use <>
+Found
+
ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:101-138: Warning: Use <>
+Found
+
") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(") " <> (ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:109-138: Warning: Use <>
+Found
+
ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2s <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:119-138: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:729:127-138: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:730:60-141: Warning: Use <>
+Found
+
"JSGeneratorMethodDefinition ("
+ ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
"JSGeneratorMethodDefinition ("
+ <> (ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:730:95-141: Warning: Use <>
+Found
+
ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x1 <> (") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:730:104-141: Warning: Use <>
+Found
+
") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(") " <> (ss x2s ++ " (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:730:112-141: Warning: Use <>
+Found
+
ss x2s ++ " (" ++ ss x3 ++ ")"
+Perhaps
+
(ss x2s <> (" (" ++ ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:730:122-141: Warning: Use <>
+Found
+
" (" ++ ss x3 ++ ")"
+Perhaps
+
(" (" <> (ss x3 ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:730:130-141: Warning: Use <>
+Found
+
ss x3 ++ ")"
+Perhaps
+
(ss x3 <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:733:30-63: Warning: Use <>
+Found
+
"JSIdentifier " ++ singleQuote (s)
+Perhaps
+
"JSIdentifier " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:734:31-64: Warning: Use <>
+Found
+
"JSIdentifier " ++ singleQuote (s)
+Perhaps
+
"JSIdentifier " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:735:31-64: Warning: Use <>
+Found
+
"JSIdentifier " ++ singleQuote (s)
+Perhaps
+
"JSIdentifier " <> singleQuote (s)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:736:35-71: Warning: Use <>
+Found
+
"JSPropertyComputed (" ++ ss x ++ ")"
+Perhaps
+
"JSPropertyComputed (" <> (ss x ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:736:61-71: Warning: Use <>
+Found
+
ss x ++ ")"
+Perhaps
+
(ss x <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:743:25-43: Warning: Use <>
+Found
+
"JSBlock " ++ ss xs
+Perhaps
+
"JSBlock " <> ss xs
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:746:29-73: Warning: Use <>
+Found
+
"JSCase (" ++ ss x1 ++ ") (" ++ ss x2s ++ ")"
+Perhaps
+
"JSCase (" <> (ss x1 ++ ") (" ++ ss x2s ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:746:43-73: Warning: Use <>
+Found
+
ss x1 ++ ") (" ++ ss x2s ++ ")"
+Perhaps
+
(ss x1 <> (") (" ++ ss x2s ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:746:52-73: Warning: Use <>
+Found
+
") (" ++ ss x2s ++ ")"
+Perhaps
+
(") (" <> (ss x2s ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:746:61-73: Warning: Use <>
+Found
+
ss x2s ++ ")"
+Perhaps
+
(ss x2s <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:747:28-56: Warning: Use <>
+Found
+
"JSDefault (" ++ ss xs ++ ")"
+Perhaps
+
"JSDefault (" <> (ss xs ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:747:45-56: Warning: Use <>
+Found
+
ss xs ++ ")"
+Perhaps
+
(ss xs <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:806:24-41: Warning: Use <>
+Found
+
"[" ++ ss n ++ "]"
+Perhaps
+
"[" <> (ss n ++ "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:806:31-41: Warning: Use <>
+Found
+
ss n ++ "]"
+Perhaps
+
(ss n <> "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:818:31-74: Warning: Use <>
+Found
+
"(" ++ ss e ++ "," ++ singleQuote (s) ++ ")"
+Perhaps
+
"(" <> (ss e ++ "," ++ singleQuote (s) ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:818:38-74: Warning: Use <>
+Found
+
ss e ++ "," ++ singleQuote (s) ++ ")"
+Perhaps
+
(ss e <> ("," ++ singleQuote (s) ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:818:46-74: Warning: Use <>
+Found
+
"," ++ singleQuote (s) ++ ")"
+Perhaps
+
("," <> (singleQuote (s) ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:818:53-74: Warning: Use <>
+Found
+
singleQuote (s) ++ ")"
+Perhaps
+
(singleQuote (s) <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:826:34-71: Warning: Use <>
+Found
+
"JSClassStaticMethod (" ++ ss m ++ ")"
+Perhaps
+
"JSClassStaticMethod (" <> (ss m ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:826:61-71: Warning: Use <>
+Found
+
ss m ++ ")"
+Perhaps
+
(ss m <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:828:44-89: Warning: Use <>
+Found
+
"JSPrivateField " ++ singleQuote ("#" ++ name)
+Perhaps
+
"JSPrivateField " <> singleQuote ("#" ++ name)
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:828:78-88: Warning: Use <>
+Found
+
"#" ++ name
+Perhaps
+
"#" <> name
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:829:55-133: Warning: Use <>
+Found
+
"JSPrivateField "
+ ++ singleQuote ("#" ++ name) ++ " (" ++ ss initializer ++ ")"
+Perhaps
+
"JSPrivateField "
+ <> (singleQuote ("#" ++ name) ++ " (" ++ ss initializer ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:829:76-133: Warning: Use <>
+Found
+
singleQuote ("#" ++ name) ++ " (" ++ ss initializer ++ ")"
+Perhaps
+
(singleQuote ("#" ++ name) <> (" (" ++ ss initializer ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:829:89-99: Warning: Use <>
+Found
+
"#" ++ name
+Perhaps
+
"#" <> name
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:829:105-133: Warning: Use <>
+Found
+
" (" ++ ss initializer ++ ")"
+Perhaps
+
(" (" <> (ss initializer ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:829:113-133: Warning: Use <>
+Found
+
ss initializer ++ ")"
+Perhaps
+
(ss initializer <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:50-143: Warning: Use <>
+Found
+
"JSPrivateMethod "
+ ++
+ singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
"JSPrivateMethod "
+ <>
+ (singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:72-143: Warning: Use <>
+Found
+
singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(singleQuote ("#" ++ name)
+ <> (" " ++ ss params ++ " (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:85-95: Warning: Use <>
+Found
+
"#" ++ name
+Perhaps
+
"#" <> name
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:101-143: Warning: Use <>
+Found
+
" " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(" " <> (ss params ++ " (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:108-143: Warning: Use <>
+Found
+
ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(ss params <> (" (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:121-143: Warning: Use <>
+Found
+
" (" ++ ss block ++ ")"
+Perhaps
+
(" (" <> (ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:830:129-143: Warning: Use <>
+Found
+
ss block ++ ")"
+Perhaps
+
(ss block <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:61-178: Warning: Use <>
+Found
+
"JSPrivateAccessor "
+ ++
+ ss accessor
+ ++
+ " "
+ ++
+ singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
"JSPrivateAccessor "
+ <>
+ (ss accessor
+ ++
+ " "
+ ++
+ singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:85-178: Warning: Use <>
+Found
+
ss accessor
+ ++
+ " "
+ ++
+ singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(ss accessor
+ <>
+ (" "
+ ++
+ singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:100-178: Warning: Use <>
+Found
+
" "
+ ++
+ singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(" "
+ <>
+ (singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:107-178: Warning: Use <>
+Found
+
singleQuote ("#" ++ name)
+ ++ " " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(singleQuote ("#" ++ name)
+ <> (" " ++ ss params ++ " (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:120-130: Warning: Use <>
+Found
+
"#" ++ name
+Perhaps
+
"#" <> name
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:136-178: Warning: Use <>
+Found
+
" " ++ ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(" " <> (ss params ++ " (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:143-178: Warning: Use <>
+Found
+
ss params ++ " (" ++ ss block ++ ")"
+Perhaps
+
(ss params <> (" (" ++ ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:156-178: Warning: Use <>
+Found
+
" (" ++ ss block ++ ")"
+Perhaps
+
(" (" <> (ss block ++ ")"))
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:831:164-178: Warning: Use <>
+Found
+
ss block ++ ")"
+Perhaps
+
(ss block <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:834:11-61: Warning: Use <>
+Found
+
"(" ++ commaJoin (map ss $ fromCommaList xs) ++ ")"
+Perhaps
+
"(" <> (commaJoin (map ss $ fromCommaList xs) ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:834:18-61: Warning: Use <>
+Found
+
commaJoin (map ss $ fromCommaList xs) ++ ")"
+Perhaps
+
(commaJoin (map ss $ fromCommaList xs) <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:834:29-31: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:837:26-84: Warning: Use <>
+Found
+
"[" ++ commaJoin (map ss $ fromCommaList xs) ++ ",JSComma]"
+Perhaps
+
"[" <> (commaJoin (map ss $ fromCommaList xs) ++ ",JSComma]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:837:33-84: Warning: Use <>
+Found
+
commaJoin (map ss $ fromCommaList xs) ++ ",JSComma]"
+Perhaps
+
(commaJoin (map ss $ fromCommaList xs) <> ",JSComma]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:837:44-46: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:838:23-73: Warning: Use <>
+Found
+
"[" ++ commaJoin (map ss $ fromCommaList xs) ++ "]"
+Perhaps
+
"[" <> (commaJoin (map ss $ fromCommaList xs) ++ "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:838:30-73: Warning: Use <>
+Found
+
commaJoin (map ss $ fromCommaList xs) ++ "]"
+Perhaps
+
(commaJoin (map ss $ fromCommaList xs) <> "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:838:41-43: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:841:11-45: Warning: Use <>
+Found
+
"[" ++ commaJoin (map ss xs) ++ "]"
+Perhaps
+
"[" <> (commaJoin (map ss xs) ++ "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:841:18-45: Warning: Use <>
+Found
+
commaJoin (map ss xs) ++ "]"
+Perhaps
+
(commaJoin (map ss xs) <> "]")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:841:29-31: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:879:33-54: Warning: Use <>
+Found
+
fromCommaList l ++ [i]
+Perhaps
+
fromCommaList l <> [i]
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:890:17-31: Warning: Use <>
+Found
+
"'" ++ s ++ "'"
+Perhaps
+
"'" <> (s ++ "'")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:890:24-31: Warning: Use <>
+Found
+
s ++ "'"
+Perhaps
+
(s <> "'")
+
+
+
+
+src/Language/JavaScript/Parser/AST.hs:911:17-24: Warning: Use <>
+Found
+
"," ++ s
+Perhaps
+
"," <> s
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:53:24-79: Warning: Use <>
+Found
+
"Invalid decimal literal: " ++ str ++ " at " ++ show loc
+Perhaps
+
"Invalid decimal literal: " <> (str ++ " at " ++ show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:53:55-79: Warning: Use <>
+Found
+
str ++ " at " ++ show loc
+Perhaps
+
(str <> (" at " ++ show loc))
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:53:62-79: Warning: Use <>
+Found
+
" at " ++ show loc
+Perhaps
+
(" at " <> show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:66:24-75: Warning: Use <>
+Found
+
"Invalid hex literal: " ++ str ++ " at " ++ show loc
+Perhaps
+
"Invalid hex literal: " <> (str ++ " at " ++ show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:66:51-75: Warning: Use <>
+Found
+
str ++ " at " ++ show loc
+Perhaps
+
(str <> (" at " ++ show loc))
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:66:58-75: Warning: Use <>
+Found
+
" at " ++ show loc
+Perhaps
+
(" at " <> show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:81:24-78: Warning: Use <>
+Found
+
"Invalid binary literal: " ++ str ++ " at " ++ show loc
+Perhaps
+
"Invalid binary literal: " <> (str ++ " at " ++ show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:81:54-78: Warning: Use <>
+Found
+
str ++ " at " ++ show loc
+Perhaps
+
(str <> (" at " ++ show loc))
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:81:61-78: Warning: Use <>
+Found
+
" at " ++ show loc
+Perhaps
+
(" at " <> show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:96:24-77: Warning: Use <>
+Found
+
"Invalid octal literal: " ++ str ++ " at " ++ show loc
+Perhaps
+
"Invalid octal literal: " <> (str ++ " at " ++ show loc)
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:96:53-77: Warning: Use <>
+Found
+
str ++ " at " ++ show loc
+Perhaps
+
(str <> (" at " ++ show loc))
+
+
+
+
+src/Language/JavaScript/Parser/LexerUtils.hs:96:60-77: Warning: Use <>
+Found
+
" at " ++ show loc
+Perhaps
+
(" at " <> show loc)
+
+
+
+
+src/Language/JavaScript/Parser/Parser.hs:92:17-43: Warning: Use <>
+Found
+
"Left (" ++ show msg ++ ")"
+Perhaps
+
"Left (" <> (show msg ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/Parser.hs:92:29-43: Warning: Use <>
+Found
+
show msg ++ ")"
+Perhaps
+
(show msg <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/Parser.hs:93:16-53: Warning: Use <>
+Found
+
"Right (" ++ AST.showStripped p ++ ")"
+Perhaps
+
"Right (" <> (AST.showStripped p ++ ")")
+
+
+
+
+src/Language/JavaScript/Parser/Parser.hs:93:29-53: Warning: Use <>
+Found
+
AST.showStripped p ++ ")"
+Perhaps
+
(AST.showStripped p <> ")")
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:194:1-42: Suggestion: Eta reduce
+Found
+
makePosition line col = TokenPn 0 line col
+Perhaps
+
makePosition = TokenPn 0
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:262:3-78: Warning: Use <>
+Found
+
"address "
+ ++ show addr ++ ", line " ++ show line ++ ", column " ++ show col
+Perhaps
+
"address "
+ <> (show addr ++ ", line " ++ show line ++ ", column " ++ show col)
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:262:17-78: Warning: Use <>
+Found
+
show addr ++ ", line " ++ show line ++ ", column " ++ show col
+Perhaps
+
(show addr <> (", line " ++ show line ++ ", column " ++ show col))
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:262:30-78: Warning: Use <>
+Found
+
", line " ++ show line ++ ", column " ++ show col
+Perhaps
+
(", line " <> (show line ++ ", column " ++ show col))
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:262:43-78: Warning: Use <>
+Found
+
show line ++ ", column " ++ show col
+Perhaps
+
(show line <> (", column " ++ show col))
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:262:56-78: Warning: Use <>
+Found
+
", column " ++ show col
+Perhaps
+
(", column " <> show col)
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:275:3-49: Warning: Use <>
+Found
+
"line " ++ show line ++ ", column " ++ show col
+Perhaps
+
"line " <> (show line ++ ", column " ++ show col)
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:275:14-49: Warning: Use <>
+Found
+
show line ++ ", column " ++ show col
+Perhaps
+
(show line <> (", column " ++ show col))
+
+
+
+
+src/Language/JavaScript/Parser/SrcLocation.hs:275:27-49: Warning: Use <>
+Found
+
", column " ++ show col
+Perhaps
+
(", column " <> show col)
+
+
+
+
+src/Language/JavaScript/Pretty/Printer.hs:51:21-74: Warning: Redundant $
+Found
+
US.decode $ LB.unpack $ toLazyByteString $ renderJS js
+Perhaps
+
US.decode . LB.unpack $ (toLazyByteString $ renderJS js)
+
+
+
+
+src/Language/JavaScript/Pretty/Printer.hs:51:33-74: Warning: Redundant $
+Found
+
LB.unpack $ toLazyByteString $ renderJS js
+Perhaps
+
(LB.unpack . toLazyByteString $ renderJS js)
+
+
+
+
+src/Language/JavaScript/Pretty/Printer.hs:146:14-47: Warning: Use max
+Found
+
if lcur < ltgt then ltgt else lcur
+Perhaps
+
max lcur ltgt
+
+
+
+
+src/Language/JavaScript/Pretty/Printer.hs:147:14-49: Warning: Use max
+Found
+
if ccur' < ctgt then ctgt else ccur'
+Perhaps
+
max ccur' ctgt
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:22:44-46: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:78:55-57: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:122:53-135: Warning: Use <>
+Found
+
fixList emptyAnnot semi (filter (not . isRedundant) blk)
+ ++ fixList emptyAnnot s xs
+Perhaps
+
fixList emptyAnnot semi (filter (not . isRedundant) blk)
+ <> fixList emptyAnnot s xs
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:158:62-64: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:180:89-91: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:227:46-73: Warning: Use <>
+Found
+
init xall ++ init yss ++ "'"
+Perhaps
+
init xall <> (init yss ++ "'")
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:227:59-73: Warning: Use <>
+Found
+
init yss ++ "'"
+Perhaps
+
(init yss <> "'")
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:242:15-37: Warning: Use <>
+Found
+
"\\'" ++ convertSQ rest
+Perhaps
+
"\\'" <> convertSQ rest
+
+
+
+
+src/Language/JavaScript/Process/Minify.hs:396:88-90: Warning: Use fmap
+Found
+
map
+Perhaps
+
fmap
+
+
+
+
+
+
+
diff --git a/language-javascript.cabal b/language-javascript.cabal
index e2780b94..c61e26b9 100644
--- a/language-javascript.cabal
+++ b/language-javascript.cabal
@@ -1,5 +1,5 @@
Name: language-javascript
-Version: 0.7.1.0
+Version: 0.8.0.0
Synopsis: Parser for JavaScript
Description: Parses Javascript into an Abstract Syntax Tree (AST). Initially intended as frontend to hjsmin.
.
@@ -20,8 +20,8 @@ Extra-source-files: README.md
ChangeLog.md
.ghci
test/Unicode.js
- test/k.js
- test/unicode.txt
+ test/fixtures/k.js
+ test/fixtures/unicode.txt
src/Language/JavaScript/Parser/Lexer.x
-- Version requirement upped for test support in later Cabal
@@ -29,6 +29,7 @@ Cabal-version: >= 1.9.2
Library
+ default-language: Haskell2010
Build-depends: base >= 4 && < 5
, array >= 0.3
, mtl >= 1.1
@@ -37,6 +38,9 @@ Library
, bytestring >= 0.9.1
, text >= 1.2
, utf8-string >= 0.3.7 && < 2
+ , deepseq >= 1.3
+ , hashtables >= 1.2
+ , lens >= 4.0
if !impl(ghc>=8.0)
build-depends: semigroups >= 0.16.1
@@ -53,39 +57,140 @@ Library
Language.JavaScript.Parser.Grammar7
Language.JavaScript.Parser.Lexer
Language.JavaScript.Parser.Parser
+ Language.JavaScript.Parser.ParseError
Language.JavaScript.Parser.SrcLocation
+ Language.JavaScript.Parser.Token
+ Language.JavaScript.Parser.Validator
Language.JavaScript.Pretty.Printer
+ Language.JavaScript.Pretty.JSON
+ Language.JavaScript.Pretty.XML
+ Language.JavaScript.Pretty.SExpr
Language.JavaScript.Process.Minify
+ Language.JavaScript.Process.TreeShake
+ Language.JavaScript.Process.TreeShake.Types
+ Language.JavaScript.Runtime.Integration
Other-modules: Language.JavaScript.Parser.LexerUtils
- Language.JavaScript.Parser.ParseError
Language.JavaScript.Parser.ParserMonad
- Language.JavaScript.Parser.Token
- ghc-options: -Wall -fwarn-tabs
+ Language.JavaScript.Process.TreeShake.Analysis
+ Language.JavaScript.Process.TreeShake.Elimination
+ ghc-options: -Wall -fwarn-tabs -O2 -funbox-strict-fields -fspec-constr-count=6 -fno-state-hack -Wno-unused-imports -Wno-unused-top-binds -Wno-unused-matches -Wno-name-shadowing
Test-Suite testsuite
Type: exitcode-stdio-1.0
+ default-language: Haskell2010
Main-is: testsuite.hs
hs-source-dirs: test
- ghc-options: -Wall -fwarn-tabs
+ other-modules:
+ Test.Language.Javascript.JSDocTest
+ ghc-options: -Wall -fwarn-tabs -Wno-unused-imports -Wno-unused-top-binds -Wno-unused-matches -Wno-name-shadowing
build-depends: base, Cabal >= 1.9.2
, QuickCheck >= 2
, hspec
+ , hspec-golden >= 0.2
+ , criterion >= 1.1
+ , weigh >= 0.0.10
+ , temporary >= 1.2
+ , filepath >= 1.3
+ , directory >= 1.2
, array >= 0.3
, containers >= 0.2
, mtl >= 1.1
+ , text >= 1.2
, utf8-string >= 0.3.7 && < 2
, bytestring >= 0.9.1
, blaze-builder >= 0.2
+ , deepseq >= 1.3
+ , time >= 1.4
+ , process >= 1.2
+ , random >= 1.1
+ , aeson >= 1.0
+ , lens >= 4.0
, language-javascript
- Other-modules: Test.Language.Javascript.ExpressionParser
- Test.Language.Javascript.Lexer
- Test.Language.Javascript.LiteralParser
- Test.Language.Javascript.Minify
- Test.Language.Javascript.ModuleParser
- Test.Language.Javascript.ProgramParser
- Test.Language.Javascript.RoundTrip
- Test.Language.Javascript.StatementParser
+ Other-modules:
+ -- Unit Tests - Lexer
+ Unit.Language.Javascript.Parser.Lexer.BasicLexer
+ Unit.Language.Javascript.Parser.Lexer.AdvancedLexer
+ Unit.Language.Javascript.Parser.Lexer.ASIHandling
+ Unit.Language.Javascript.Parser.Lexer.NumericLiterals
+ Unit.Language.Javascript.Parser.Lexer.StringLiterals
+ Unit.Language.Javascript.Parser.Lexer.UnicodeSupport
+
+ -- Unit Tests - Parser
+ Unit.Language.Javascript.Parser.Parser.Expressions
+ Unit.Language.Javascript.Parser.Parser.Statements
+ Unit.Language.Javascript.Parser.Parser.Programs
+ Unit.Language.Javascript.Parser.Parser.Modules
+ Unit.Language.Javascript.Parser.Parser.ExportStar
+ Unit.Language.Javascript.Parser.Parser.Literals
+
+ -- Unit Tests - AST
+ Unit.Language.Javascript.Parser.AST.Construction
+ Unit.Language.Javascript.Parser.AST.Generic
+ Unit.Language.Javascript.Parser.AST.SrcLocation
+
+ -- Unit Tests - JSDoc
+ -- Test.Language.Javascript.JSDocTest -- Temporarily disabled
+
+ -- Unit Tests - Pretty Printing
+ Unit.Language.Javascript.Parser.Pretty.JSONTest
+ Unit.Language.Javascript.Parser.Pretty.XMLTest
+ Unit.Language.Javascript.Parser.Pretty.SExprTest
+
+ -- Unit Tests - Validation
+ Unit.Language.Javascript.Parser.Validation.Core
+ Unit.Language.Javascript.Parser.Validation.ES6Features
+ Unit.Language.Javascript.Parser.Validation.StrictMode
+ Unit.Language.Javascript.Parser.Validation.Modules
+ Unit.Language.Javascript.Parser.Validation.ControlFlow
+
+ -- Unit Tests - Runtime Validation
+ Unit.Language.Javascript.Runtime.ValidatorTest
+
+ -- Unit Tests - Error
+ Unit.Language.Javascript.Parser.Error.Recovery
+ Unit.Language.Javascript.Parser.Error.AdvancedRecovery
+ Unit.Language.Javascript.Parser.Error.Quality
+ Unit.Language.Javascript.Parser.Error.Negative
+
+ -- Unit Tests - TreeShake
+ Unit.Language.Javascript.Process.TreeShake.Core
+ Unit.Language.Javascript.Process.TreeShake.Advanced
+ Unit.Language.Javascript.Process.TreeShake.Stress
+ Unit.Language.Javascript.Process.TreeShake.FrameworkPatterns
+ Unit.Language.Javascript.Process.TreeShake.AdvancedJSEdgeCases
+ Unit.Language.Javascript.Process.TreeShake.LibraryPatterns
+ Unit.Language.Javascript.Process.TreeShake.IntegrationScenarios
+ Unit.Language.Javascript.Process.TreeShake.EnterpriseScale
+
+ -- Integration Tests
+ Integration.Language.Javascript.Parser.RoundTrip
+ -- Integration.Language.Javascript.Parser.AdvancedFeatures -- Temporarily disabled
+ Integration.Language.Javascript.Parser.Minification
+ Integration.Language.Javascript.Parser.Compatibility
+ Integration.Language.Javascript.Process.TreeShake
+
+ -- Golden Tests
+ Golden.Language.Javascript.Parser.GoldenTests
+
+ -- Property Tests
+ Properties.Language.Javascript.Parser.CoreProperties
+ Properties.Language.Javascript.Parser.Generators
+ Properties.Language.Javascript.Parser.GeneratorsTest
+ Properties.Language.Javascript.Parser.Fuzzing
+
+ -- Fuzz Tests
+ Properties.Language.Javascript.Parser.Fuzz.CoverageGuided
+ Properties.Language.Javascript.Parser.Fuzz.DifferentialTesting
+ Properties.Language.Javascript.Parser.Fuzz.FuzzGenerators
+ Properties.Language.Javascript.Parser.Fuzz.FuzzHarness
+ Properties.Language.Javascript.Parser.Fuzz.FuzzTest
+
+ -- Benchmark Tests
+ Benchmarks.Language.Javascript.Parser.Performance
+ Benchmarks.Language.Javascript.Parser.Memory
+ Benchmarks.Language.Javascript.Parser.ErrorRecovery
+
source-repository head
type: git
diff --git a/src/Language/JavaScript/Parser.hs b/src/Language/JavaScript/Parser.hs
index 750c0ed5..6b71e5df 100644
--- a/src/Language/JavaScript/Parser.hs
+++ b/src/Language/JavaScript/Parser.hs
@@ -1,44 +1,51 @@
module Language.JavaScript.Parser
- (
- PA.parse
- , PA.parseModule
- , PA.readJs
- , PA.readJsModule
- , PA.parseFile
- , PA.parseFileUtf8
- , PA.showStripped
- , PA.showStrippedMaybe
- -- * AST elements
- , JSExpression (..)
- , JSAnnot (..)
- , JSBinOp (..)
- , JSBlock (..)
- , JSUnaryOp (..)
- , JSSemi (..)
- , JSAssignOp (..)
- , JSTryCatch (..)
- , JSTryFinally (..)
- , JSStatement (..)
- , JSSwitchParts (..)
- , JSAST(..)
+ ( PA.parse,
+ PA.parseModule,
+ PA.readJs,
+ PA.readJsModule,
+ PA.parseFile,
+ PA.parseFileUtf8,
+ PA.showStripped,
+ PA.showStrippedMaybe,
+ -- * AST elements
+ JSExpression (..),
+ JSAnnot (..),
+ JSBinOp (..),
+ JSBlock (..),
+ JSUnaryOp (..),
+ JSSemi (..),
+ JSAssignOp (..),
+ JSTryCatch (..),
+ JSTryFinally (..),
+ JSStatement (..),
+ JSSwitchParts (..),
+ JSAST (..),
+ CommentAnnotation (..),
+ -- , ParseError(..)
+ -- Source locations
+ TokenPosn (..),
+ tokenPosnEmpty,
- , CommentAnnotation(..)
- -- , ParseError(..)
- -- Source locations
- , TokenPosn(..)
- , tokenPosnEmpty
- -- * Pretty Printing
- , renderJS
- , renderToString
- , renderToText
- ) where
+ -- * Pretty Printing
+ renderJS,
+ renderToString,
+ renderToText,
+ -- * XML Serialization
+ renderToXML,
+
+ -- * S-Expression Serialization
+ renderToSExpr,
+ )
+where
import Language.JavaScript.Parser.AST
-import Language.JavaScript.Parser.Token
import qualified Language.JavaScript.Parser.Parser as PA
import Language.JavaScript.Parser.SrcLocation
+import Language.JavaScript.Parser.Token
import Language.JavaScript.Pretty.Printer
+import Language.JavaScript.Pretty.SExpr (renderToSExpr)
+import Language.JavaScript.Pretty.XML (renderToXML)
-- EOF
diff --git a/src/Language/JavaScript/Parser/AST.hs b/src/Language/JavaScript/Parser/AST.hs
index 32302727..3921ad6e 100644
--- a/src/Language/JavaScript/Parser/AST.hs
+++ b/src/Language/JavaScript/Parser/AST.hs
@@ -1,648 +1,937 @@
-{-# LANGUAGE DeriveDataTypeable, FlexibleInstances #-}
-
+{-# LANGUAGE DeriveAnyClass #-}
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | JavaScript Abstract Syntax Tree definitions and utilities.
+--
+-- This module defines the complete AST representation for JavaScript programs,
+-- supporting ECMAScript 5 features with ES6+ extensions including:
+--
+-- * All expression types (literals, binary ops, function calls, etc.)
+-- * Statement constructs (control flow, declarations, blocks)
+-- * Module import/export declarations
+-- * Class definitions and method declarations
+-- * Template literals and destructuring patterns
+-- * Async/await and generator function support
+-- * Modern JavaScript features (BigInt, optional chaining, nullish coalescing)
+--
+-- The AST preserves source location information and comments through
+-- 'JSAnnot' annotations on every node, enabling accurate pretty-printing
+-- and source mapping.
+--
+-- ==== Examples
+--
+-- Parsing and working with expressions:
+--
+-- >>> parseExpression "42 + 1"
+-- Right (JSExpressionBinary (JSDecimal ...) (JSBinOpPlus ...) (JSDecimal ...))
+--
+-- >>> showStripped <$> parseExpression "x.foo()"
+-- Right "JSCallExpression (JSMemberDot (JSIdentifier 'x',JSIdentifier 'foo'),JSArguments [])"
+--
+-- Working with statements:
+--
+-- >>> parseStatement "if (x) return 42;"
+-- Right (JSIf ...)
+--
+-- @since 0.7.1.0
module Language.JavaScript.Parser.AST
- ( JSExpression (..)
- , JSAnnot (..)
- , JSBinOp (..)
- , JSUnaryOp (..)
- , JSSemi (..)
- , JSAssignOp (..)
- , JSTryCatch (..)
- , JSTryFinally (..)
- , JSStatement (..)
- , JSBlock (..)
- , JSSwitchParts (..)
- , JSAST (..)
- , JSObjectProperty (..)
- , JSPropertyName (..)
- , JSObjectPropertyList
- , JSAccessor (..)
- , JSMethodDefinition (..)
- , JSIdent (..)
- , JSVarInitializer (..)
- , JSArrayElement (..)
- , JSCommaList (..)
- , JSCommaTrailingList (..)
- , JSArrowParameterList (..)
- , JSTemplatePart (..)
- , JSClassHeritage (..)
- , JSClassElement (..)
-
+ ( JSExpression (..),
+ JSAnnot (..),
+ JSBinOp (..),
+ JSUnaryOp (..),
+ JSSemi (..),
+ JSAssignOp (..),
+ JSTryCatch (..),
+ JSTryFinally (..),
+ JSStatement (..),
+ JSBlock (..),
+ JSSwitchParts (..),
+ JSAST (..),
+ JSObjectProperty (..),
+ JSPropertyName (..),
+ JSObjectPropertyList,
+ JSAccessor (..),
+ JSMethodDefinition (..),
+ JSIdent (..),
+ JSVarInitializer (..),
+ JSArrayElement (..),
+ JSCommaList (..),
+ JSCommaTrailingList (..),
+ JSArrowParameterList (..),
+ JSConciseBody (..),
+ JSTemplatePart (..),
+ JSClassHeritage (..),
+ JSClassElement (..),
-- Modules
- , JSModuleItem (..)
- , JSImportDeclaration (..)
- , JSImportClause (..)
- , JSFromClause (..)
- , JSImportNameSpace (..)
- , JSImportsNamed (..)
- , JSImportSpecifier (..)
- , JSExportDeclaration (..)
- , JSExportClause (..)
- , JSExportSpecifier (..)
-
- , binOpEq
- , showStripped
- ) where
-
+ JSModuleItem (..),
+ JSImportDeclaration (..),
+ JSImportClause (..),
+ JSFromClause (..),
+ JSImportNameSpace (..),
+ JSImportsNamed (..),
+ JSImportSpecifier (..),
+ JSImportAttributes (..),
+ JSImportAttribute (..),
+ JSExportDeclaration (..),
+ JSExportClause (..),
+ JSExportSpecifier (..),
+ binOpEq,
+ showStripped,
+
+ -- * JSDoc Integration
+ extractJSDoc,
+ extractJSDocFromStatement,
+ extractJSDocFromExpression,
+ hasJSDoc,
+ getJSDocParams,
+ getJSDocReturnType,
+ validateJSDocParameters,
+ hasJSDocTag,
+ getJSDocTagsByName,
+ )
+where
+
+import Control.DeepSeq (NFData)
import Data.Data
-import Data.List
+import qualified Data.List as List
+import qualified Data.Text as Text
+import GHC.Generics (Generic)
import Language.JavaScript.Parser.SrcLocation (TokenPosn (..))
import Language.JavaScript.Parser.Token
-- ---------------------------------------------------------------------
data JSAnnot
- = JSAnnot !TokenPosn ![CommentAnnotation] -- ^Annotation: position and comment/whitespace information
- | JSAnnotSpace -- ^A single space character
- | JSNoAnnot -- ^No annotation
- deriving (Data, Eq, Show, Typeable)
-
+ = -- | Annotation: position and comment/whitespace information
+ JSAnnot !TokenPosn ![CommentAnnotation]
+ | -- | A single space character
+ JSAnnotSpace
+ | -- | No annotation
+ JSNoAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSAST
- = JSAstProgram ![JSStatement] !JSAnnot -- ^source elements, trailing whitespace
- | JSAstModule ![JSModuleItem] !JSAnnot
- | JSAstStatement !JSStatement !JSAnnot
- | JSAstExpression !JSExpression !JSAnnot
- | JSAstLiteral !JSExpression !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = -- | source elements, trailing whitespace
+ JSAstProgram ![JSStatement] !JSAnnot
+ | JSAstModule ![JSModuleItem] !JSAnnot
+ | JSAstStatement !JSStatement !JSAnnot
+ | JSAstExpression !JSExpression !JSAnnot
+ | JSAstLiteral !JSExpression !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
-- Shift AST
-- https://github.com/shapesecurity/shift-spec/blob/83498b92c436180cc0e2115b225a68c08f43c53e/spec.idl#L229-L234
data JSModuleItem
- = JSModuleImportDeclaration !JSAnnot !JSImportDeclaration -- ^import,decl
- | JSModuleExportDeclaration !JSAnnot !JSExportDeclaration -- ^export,decl
- | JSModuleStatementListItem !JSStatement
- deriving (Data, Eq, Show, Typeable)
+ = -- | import,decl
+ JSModuleImportDeclaration !JSAnnot !JSImportDeclaration
+ | -- | export,decl
+ JSModuleExportDeclaration !JSAnnot !JSExportDeclaration
+ | JSModuleStatementListItem !JSStatement
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSImportDeclaration
- = JSImportDeclaration !JSImportClause !JSFromClause !JSSemi -- ^imports, module, semi
- | JSImportDeclarationBare !JSAnnot !String !JSSemi -- ^module, module, semi
- deriving (Data, Eq, Show, Typeable)
+ = -- | imports, module, optional attributes, semi
+ JSImportDeclaration !JSImportClause !JSFromClause !(Maybe JSImportAttributes) !JSSemi
+ | -- | import, module, optional attributes, semi
+ JSImportDeclarationBare !JSAnnot !String !(Maybe JSImportAttributes) !JSSemi
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
+
+data JSImportAttributes
+ = -- | {, attributes, }
+ JSImportAttributes !JSAnnot !(JSCommaList JSImportAttribute) !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
+
+data JSImportAttribute
+ = -- | key, :, value
+ JSImportAttribute !JSIdent !JSAnnot !JSExpression
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSImportClause
- = JSImportClauseDefault !JSIdent -- ^default
- | JSImportClauseNameSpace !JSImportNameSpace -- ^namespace
- | JSImportClauseNamed !JSImportsNamed -- ^named imports
- | JSImportClauseDefaultNameSpace !JSIdent !JSAnnot !JSImportNameSpace -- ^default, comma, namespace
- | JSImportClauseDefaultNamed !JSIdent !JSAnnot !JSImportsNamed -- ^default, comma, named imports
- deriving (Data, Eq, Show, Typeable)
+ = -- | default
+ JSImportClauseDefault !JSIdent
+ | -- | namespace
+ JSImportClauseNameSpace !JSImportNameSpace
+ | -- | named imports
+ JSImportClauseNamed !JSImportsNamed
+ | -- | default, comma, namespace
+ JSImportClauseDefaultNameSpace !JSIdent !JSAnnot !JSImportNameSpace
+ | -- | default, comma, named imports
+ JSImportClauseDefaultNamed !JSIdent !JSAnnot !JSImportsNamed
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSFromClause
- = JSFromClause !JSAnnot !JSAnnot !String -- ^ from, string literal, string literal contents
- deriving (Data, Eq, Show, Typeable)
+ = -- | from, string literal, string literal contents
+ JSFromClause !JSAnnot !JSAnnot !String
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
-- | Import namespace, e.g. '* as whatever'
data JSImportNameSpace
- = JSImportNameSpace !JSBinOp !JSAnnot !JSIdent -- ^ *, as, ident
- deriving (Data, Eq, Show, Typeable)
+ = -- | *, as, ident
+ JSImportNameSpace !JSBinOp !JSAnnot !JSIdent
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
-- | Named imports, e.g. '{ foo, bar, baz as quux }'
data JSImportsNamed
- = JSImportsNamed !JSAnnot !(JSCommaList JSImportSpecifier) !JSAnnot -- ^lb, specifiers, rb
- deriving (Data, Eq, Show, Typeable)
+ = -- | lb, specifiers, rb
+ JSImportsNamed !JSAnnot !(JSCommaList JSImportSpecifier) !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
-- |
-- Note that this data type is separate from ExportSpecifier because the
-- grammar is slightly different (e.g. in handling of reserved words).
data JSImportSpecifier
- = JSImportSpecifier !JSIdent -- ^ident
- | JSImportSpecifierAs !JSIdent !JSAnnot !JSIdent -- ^ident, as, ident
- deriving (Data, Eq, Show, Typeable)
+ = -- | ident
+ JSImportSpecifier !JSIdent
+ | -- | ident, as, ident
+ JSImportSpecifierAs !JSIdent !JSAnnot !JSIdent
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSExportDeclaration
- -- = JSExportAllFrom
- = JSExportFrom JSExportClause JSFromClause !JSSemi -- ^exports, module, semi
- | JSExportLocals JSExportClause !JSSemi -- ^exports, autosemi
- | JSExport !JSStatement !JSSemi -- ^body, autosemi
- -- | JSExportDefault
- deriving (Data, Eq, Show, Typeable)
+ = -- | star, module, semi
+ JSExportAllFrom !JSBinOp JSFromClause !JSSemi
+ | -- | star, as, ident, module, semi
+ JSExportAllAsFrom !JSBinOp !JSAnnot !JSIdent JSFromClause !JSSemi
+ | -- | exports, module, semi
+ JSExportFrom JSExportClause JSFromClause !JSSemi
+ | -- | exports, autosemi
+ JSExportLocals JSExportClause !JSSemi
+ | -- | body, autosemi
+ JSExport !JSStatement !JSSemi
+ | -- | default, expression/declaration, semi
+ JSExportDefault !JSAnnot !JSStatement !JSSemi
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSExportClause
- = JSExportClause !JSAnnot !(JSCommaList JSExportSpecifier) !JSAnnot -- ^lb, specifiers, rb
- deriving (Data, Eq, Show, Typeable)
+ = -- | lb, specifiers, rb
+ JSExportClause !JSAnnot !(JSCommaList JSExportSpecifier) !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSExportSpecifier
- = JSExportSpecifier !JSIdent -- ^ident
- | JSExportSpecifierAs !JSIdent !JSAnnot !JSIdent -- ^ident1, as, ident2
- deriving (Data, Eq, Show, Typeable)
+ = -- | ident
+ JSExportSpecifier !JSIdent
+ | -- | ident1, as, ident2
+ JSExportSpecifierAs !JSIdent !JSAnnot !JSIdent
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSStatement
- = JSStatementBlock !JSAnnot ![JSStatement] !JSAnnot !JSSemi -- ^lbrace, stmts, rbrace, autosemi
- | JSBreak !JSAnnot !JSIdent !JSSemi -- ^break,optional identifier, autosemi
- | JSLet !JSAnnot !(JSCommaList JSExpression) !JSSemi -- ^const, decl, autosemi
- | JSClass !JSAnnot !JSIdent !JSClassHeritage !JSAnnot ![JSClassElement] !JSAnnot !JSSemi -- ^class, name, optional extends clause, lb, body, rb, autosemi
- | JSConstant !JSAnnot !(JSCommaList JSExpression) !JSSemi -- ^const, decl, autosemi
- | JSContinue !JSAnnot !JSIdent !JSSemi -- ^continue, optional identifier,autosemi
- | JSDoWhile !JSAnnot !JSStatement !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSSemi -- ^do,stmt,while,lb,expr,rb,autosemi
- | JSFor !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement -- ^for,lb,expr,semi,expr,semi,expr,rb.stmt
- | JSForIn !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,expr,in,expr,rb,stmt
- | JSForVar !JSAnnot !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement -- ^for,lb,var,vardecl,semi,expr,semi,expr,rb,stmt
- | JSForVarIn !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,var,vardecl,in,expr,rb,stmt
- | JSForLet !JSAnnot !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement -- ^for,lb,var,vardecl,semi,expr,semi,expr,rb,stmt
- | JSForLetIn !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,var,vardecl,in,expr,rb,stmt
- | JSForLetOf !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,var,vardecl,in,expr,rb,stmt
- | JSForConst !JSAnnot !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement -- ^for,lb,var,vardecl,semi,expr,semi,expr,rb,stmt
- | JSForConstIn !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,var,vardecl,in,expr,rb,stmt
- | JSForConstOf !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,var,vardecl,in,expr,rb,stmt
- | JSForOf !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,expr,in,expr,rb,stmt
- | JSForVarOf !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement -- ^for,lb,var,vardecl,in,expr,rb,stmt
- | JSAsyncFunction !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock !JSSemi -- ^fn,name, lb,parameter list,rb,block,autosemi
- | JSFunction !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock !JSSemi -- ^fn,name, lb,parameter list,rb,block,autosemi
- | JSGenerator !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock !JSSemi -- ^fn,*,name, lb,parameter list,rb,block,autosemi
- | JSIf !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement -- ^if,(,expr,),stmt
- | JSIfElse !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement !JSAnnot !JSStatement -- ^if,(,expr,),stmt,else,rest
- | JSLabelled !JSIdent !JSAnnot !JSStatement -- ^identifier,colon,stmt
- | JSEmptyStatement !JSAnnot
- | JSExpressionStatement !JSExpression !JSSemi
- | JSAssignStatement !JSExpression !JSAssignOp !JSExpression !JSSemi -- ^lhs, assignop, rhs, autosemi
- | JSMethodCall !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSSemi
- | JSReturn !JSAnnot !(Maybe JSExpression) !JSSemi -- ^optional expression,autosemi
- | JSSwitch !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSAnnot ![JSSwitchParts] !JSAnnot !JSSemi -- ^switch,lb,expr,rb,caseblock,autosemi
- | JSThrow !JSAnnot !JSExpression !JSSemi -- ^throw val autosemi
- | JSTry !JSAnnot !JSBlock ![JSTryCatch] !JSTryFinally -- ^try,block,catches,finally
- | JSVariable !JSAnnot !(JSCommaList JSExpression) !JSSemi -- ^var, decl, autosemi
- | JSWhile !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement -- ^while,lb,expr,rb,stmt
- | JSWith !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement !JSSemi -- ^with,lb,expr,rb,stmt list
- deriving (Data, Eq, Show, Typeable)
+ = -- | lbrace, stmts, rbrace, autosemi
+ JSStatementBlock !JSAnnot ![JSStatement] !JSAnnot !JSSemi
+ | -- | break,optional identifier, autosemi
+ JSBreak !JSAnnot !JSIdent !JSSemi
+ | -- | const, decl, autosemi
+ JSLet !JSAnnot !(JSCommaList JSExpression) !JSSemi
+ | -- | class, name, optional extends clause, lb, body, rb, autosemi
+ JSClass !JSAnnot !JSIdent !JSClassHeritage !JSAnnot ![JSClassElement] !JSAnnot !JSSemi
+ | -- | const, decl, autosemi
+ JSConstant !JSAnnot !(JSCommaList JSExpression) !JSSemi
+ | -- | continue, optional identifier,autosemi
+ JSContinue !JSAnnot !JSIdent !JSSemi
+ | -- | do,stmt,while,lb,expr,rb,autosemi
+ JSDoWhile !JSAnnot !JSStatement !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSSemi
+ | -- | for,lb,expr,semi,expr,semi,expr,rb.stmt
+ JSFor !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement
+ | -- | for,lb,expr,in,expr,rb,stmt
+ JSForIn !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,semi,expr,semi,expr,rb,stmt
+ JSForVar !JSAnnot !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,in,expr,rb,stmt
+ JSForVarIn !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,semi,expr,semi,expr,rb,stmt
+ JSForLet !JSAnnot !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,in,expr,rb,stmt
+ JSForLetIn !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,in,expr,rb,stmt
+ JSForLetOf !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,semi,expr,semi,expr,rb,stmt
+ JSForConst !JSAnnot !JSAnnot !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,in,expr,rb,stmt
+ JSForConstIn !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,in,expr,rb,stmt
+ JSForConstOf !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,expr,in,expr,rb,stmt
+ JSForOf !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | for,lb,var,vardecl,in,expr,rb,stmt
+ JSForVarOf !JSAnnot !JSAnnot !JSAnnot !JSExpression !JSBinOp !JSExpression !JSAnnot !JSStatement
+ | -- | fn,name, lb,parameter list,rb,block,autosemi
+ JSAsyncFunction !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock !JSSemi
+ | -- | fn,name, lb,parameter list,rb,block,autosemi
+ JSFunction !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock !JSSemi
+ | -- | fn,*,name, lb,parameter list,rb,block,autosemi
+ JSGenerator !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock !JSSemi
+ | -- | if,(,expr,),stmt
+ JSIf !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement
+ | -- | if,(,expr,),stmt,else,rest
+ JSIfElse !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement !JSAnnot !JSStatement
+ | -- | identifier,colon,stmt
+ JSLabelled !JSIdent !JSAnnot !JSStatement
+ | JSEmptyStatement !JSAnnot
+ | JSExpressionStatement !JSExpression !JSSemi
+ | -- | lhs, assignop, rhs, autosemi
+ JSAssignStatement !JSExpression !JSAssignOp !JSExpression !JSSemi
+ | JSMethodCall !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSSemi
+ | -- | optional expression,autosemi
+ JSReturn !JSAnnot !(Maybe JSExpression) !JSSemi
+ | -- | switch,lb,expr,rb,caseblock,autosemi
+ JSSwitch !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSAnnot ![JSSwitchParts] !JSAnnot !JSSemi
+ | -- | throw val autosemi
+ JSThrow !JSAnnot !JSExpression !JSSemi
+ | -- | try,block,catches,finally
+ JSTry !JSAnnot !JSBlock ![JSTryCatch] !JSTryFinally
+ | -- | var, decl, autosemi
+ JSVariable !JSAnnot !(JSCommaList JSExpression) !JSSemi
+ | -- | while,lb,expr,rb,stmt
+ JSWhile !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement
+ | -- | with,lb,expr,rb,stmt list
+ JSWith !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSStatement !JSSemi
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSExpression
- -- | Terminals
- = JSIdentifier !JSAnnot !String
- | JSDecimal !JSAnnot !String
- | JSLiteral !JSAnnot !String
- | JSHexInteger !JSAnnot !String
- | JSOctal !JSAnnot !String
- | JSStringLiteral !JSAnnot !String
- | JSRegEx !JSAnnot !String
-
- -- | Non Terminals
- | JSArrayLiteral !JSAnnot ![JSArrayElement] !JSAnnot -- ^lb, contents, rb
- | JSAssignExpression !JSExpression !JSAssignOp !JSExpression -- ^lhs, assignop, rhs
- | JSAwaitExpression !JSAnnot !JSExpression -- ^await, expr
- | JSCallExpression !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot -- ^expr, bl, args, rb
- | JSCallExpressionDot !JSExpression !JSAnnot !JSExpression -- ^expr, dot, expr
- | JSCallExpressionSquare !JSExpression !JSAnnot !JSExpression !JSAnnot -- ^expr, [, expr, ]
- | JSClassExpression !JSAnnot !JSIdent !JSClassHeritage !JSAnnot ![JSClassElement] !JSAnnot -- ^class, optional identifier, optional extends clause, lb, body, rb
- | JSCommaExpression !JSExpression !JSAnnot !JSExpression -- ^expression components
- | JSExpressionBinary !JSExpression !JSBinOp !JSExpression -- ^lhs, op, rhs
- | JSExpressionParen !JSAnnot !JSExpression !JSAnnot -- ^lb,expression,rb
- | JSExpressionPostfix !JSExpression !JSUnaryOp -- ^expression, operator
- | JSExpressionTernary !JSExpression !JSAnnot !JSExpression !JSAnnot !JSExpression -- ^cond, ?, trueval, :, falseval
- | JSArrowExpression !JSArrowParameterList !JSAnnot !JSStatement -- ^parameter list,arrow,block`
- | JSFunctionExpression !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock -- ^fn,name,lb, parameter list,rb,block`
- | JSGeneratorExpression !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock -- ^fn,*,name,lb, parameter list,rb,block`
- | JSMemberDot !JSExpression !JSAnnot !JSExpression -- ^firstpart, dot, name
- | JSMemberExpression !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot -- expr, lb, args, rb
- | JSMemberNew !JSAnnot !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot -- ^new, name, lb, args, rb
- | JSMemberSquare !JSExpression !JSAnnot !JSExpression !JSAnnot -- ^firstpart, lb, expr, rb
- | JSNewExpression !JSAnnot !JSExpression -- ^new, expr
- | JSObjectLiteral !JSAnnot !JSObjectPropertyList !JSAnnot -- ^lbrace contents rbrace
- | JSSpreadExpression !JSAnnot !JSExpression
- | JSTemplateLiteral !(Maybe JSExpression) !JSAnnot !String ![JSTemplatePart] -- ^optional tag, lquot, head, parts
- | JSUnaryExpression !JSUnaryOp !JSExpression
- | JSVarInitExpression !JSExpression !JSVarInitializer -- ^identifier, initializer
- | JSYieldExpression !JSAnnot !(Maybe JSExpression) -- ^yield, optional expr
- | JSYieldFromExpression !JSAnnot !JSAnnot !JSExpression -- ^yield, *, expr
- deriving (Data, Eq, Show, Typeable)
+ = -- | Terminals
+ JSIdentifier !JSAnnot !String
+ | JSDecimal !JSAnnot !String
+ | JSLiteral !JSAnnot !String
+ | JSHexInteger !JSAnnot !String
+ | JSBinaryInteger !JSAnnot !String
+ | JSOctal !JSAnnot !String
+ | JSBigIntLiteral !JSAnnot !String
+ | JSStringLiteral !JSAnnot !String
+ | JSRegEx !JSAnnot !String
+ | -- | lb, contents, rb
+ JSArrayLiteral !JSAnnot ![JSArrayElement] !JSAnnot
+ | -- | lhs, assignop, rhs
+ JSAssignExpression !JSExpression !JSAssignOp !JSExpression
+ | -- | await, expr
+ JSAwaitExpression !JSAnnot !JSExpression
+ | -- | expr, bl, args, rb
+ JSCallExpression !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot
+ | -- | expr, dot, expr
+ JSCallExpressionDot !JSExpression !JSAnnot !JSExpression
+ | -- | expr, [, expr, ]
+ JSCallExpressionSquare !JSExpression !JSAnnot !JSExpression !JSAnnot
+ | -- | class, optional identifier, optional extends clause, lb, body, rb
+ JSClassExpression !JSAnnot !JSIdent !JSClassHeritage !JSAnnot ![JSClassElement] !JSAnnot
+ | -- | expression components
+ JSCommaExpression !JSExpression !JSAnnot !JSExpression
+ | -- | lhs, op, rhs
+ JSExpressionBinary !JSExpression !JSBinOp !JSExpression
+ | -- | lb,expression,rb
+ JSExpressionParen !JSAnnot !JSExpression !JSAnnot
+ | -- | expression, operator
+ JSExpressionPostfix !JSExpression !JSUnaryOp
+ | -- | cond, ?, trueval, :, falseval
+ JSExpressionTernary !JSExpression !JSAnnot !JSExpression !JSAnnot !JSExpression
+ | -- | parameter list,arrow,body`
+ JSArrowExpression !JSArrowParameterList !JSAnnot !JSConciseBody
+ | -- | fn,name,lb, parameter list,rb,block`
+ JSFunctionExpression !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ | -- | fn,*,name,lb, parameter list,rb,block`
+ JSGeneratorExpression !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ | -- | async,fn,name,lb, parameter list,rb,block`
+ JSAsyncFunctionExpression !JSAnnot !JSAnnot !JSIdent !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ | -- | firstpart, dot, name
+ JSMemberDot !JSExpression !JSAnnot !JSExpression
+ | JSMemberExpression !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot -- expr, lb, args, rb
+ | -- | new, name, lb, args, rb
+ JSMemberNew !JSAnnot !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot
+ | -- | firstpart, lb, expr, rb
+ JSMemberSquare !JSExpression !JSAnnot !JSExpression !JSAnnot
+ | -- | new, expr
+ JSNewExpression !JSAnnot !JSExpression
+ | -- | firstpart, ?., name
+ JSOptionalMemberDot !JSExpression !JSAnnot !JSExpression
+ | -- | firstpart, ?.[, expr, ]
+ JSOptionalMemberSquare !JSExpression !JSAnnot !JSExpression !JSAnnot
+ | -- | expr, ?.(, args, )
+ JSOptionalCallExpression !JSExpression !JSAnnot !(JSCommaList JSExpression) !JSAnnot
+ | -- | lbrace contents rbrace
+ JSObjectLiteral !JSAnnot !JSObjectPropertyList !JSAnnot
+ | JSSpreadExpression !JSAnnot !JSExpression
+ | -- | optional tag, lquot, head, parts
+ JSTemplateLiteral !(Maybe JSExpression) !JSAnnot !String ![JSTemplatePart]
+ | JSUnaryExpression !JSUnaryOp !JSExpression
+ | -- | identifier, initializer
+ JSVarInitExpression !JSExpression !JSVarInitializer
+ | -- | yield, optional expr
+ JSYieldExpression !JSAnnot !(Maybe JSExpression)
+ | -- | yield, *, expr
+ JSYieldFromExpression !JSAnnot !JSAnnot !JSExpression
+ | -- | import, .meta
+ JSImportMeta !JSAnnot !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSArrowParameterList
- = JSUnparenthesizedArrowParameter !JSIdent
- | JSParenthesizedArrowParameterList !JSAnnot !(JSCommaList JSExpression) !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSUnparenthesizedArrowParameter !JSIdent
+ | JSParenthesizedArrowParameterList !JSAnnot !(JSCommaList JSExpression) !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
+
+data JSConciseBody
+ = JSConciseFunctionBody !JSBlock
+ | JSConciseExpressionBody !JSExpression
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSBinOp
- = JSBinOpAnd !JSAnnot
- | JSBinOpBitAnd !JSAnnot
- | JSBinOpBitOr !JSAnnot
- | JSBinOpBitXor !JSAnnot
- | JSBinOpDivide !JSAnnot
- | JSBinOpEq !JSAnnot
- | JSBinOpGe !JSAnnot
- | JSBinOpGt !JSAnnot
- | JSBinOpIn !JSAnnot
- | JSBinOpInstanceOf !JSAnnot
- | JSBinOpLe !JSAnnot
- | JSBinOpLsh !JSAnnot
- | JSBinOpLt !JSAnnot
- | JSBinOpMinus !JSAnnot
- | JSBinOpMod !JSAnnot
- | JSBinOpNeq !JSAnnot
- | JSBinOpOf !JSAnnot
- | JSBinOpOr !JSAnnot
- | JSBinOpPlus !JSAnnot
- | JSBinOpRsh !JSAnnot
- | JSBinOpStrictEq !JSAnnot
- | JSBinOpStrictNeq !JSAnnot
- | JSBinOpTimes !JSAnnot
- | JSBinOpUrsh !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSBinOpAnd !JSAnnot
+ | JSBinOpBitAnd !JSAnnot
+ | JSBinOpBitOr !JSAnnot
+ | JSBinOpBitXor !JSAnnot
+ | JSBinOpDivide !JSAnnot
+ | JSBinOpEq !JSAnnot
+ | JSBinOpExponentiation !JSAnnot
+ | JSBinOpGe !JSAnnot
+ | JSBinOpGt !JSAnnot
+ | JSBinOpIn !JSAnnot
+ | JSBinOpInstanceOf !JSAnnot
+ | JSBinOpLe !JSAnnot
+ | JSBinOpLsh !JSAnnot
+ | JSBinOpLt !JSAnnot
+ | JSBinOpMinus !JSAnnot
+ | JSBinOpMod !JSAnnot
+ | JSBinOpNeq !JSAnnot
+ | JSBinOpOf !JSAnnot
+ | JSBinOpOr !JSAnnot
+ | JSBinOpNullishCoalescing !JSAnnot
+ | JSBinOpPlus !JSAnnot
+ | JSBinOpRsh !JSAnnot
+ | JSBinOpStrictEq !JSAnnot
+ | JSBinOpStrictNeq !JSAnnot
+ | JSBinOpTimes !JSAnnot
+ | JSBinOpUrsh !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSUnaryOp
- = JSUnaryOpDecr !JSAnnot
- | JSUnaryOpDelete !JSAnnot
- | JSUnaryOpIncr !JSAnnot
- | JSUnaryOpMinus !JSAnnot
- | JSUnaryOpNot !JSAnnot
- | JSUnaryOpPlus !JSAnnot
- | JSUnaryOpTilde !JSAnnot
- | JSUnaryOpTypeof !JSAnnot
- | JSUnaryOpVoid !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSUnaryOpDecr !JSAnnot
+ | JSUnaryOpDelete !JSAnnot
+ | JSUnaryOpIncr !JSAnnot
+ | JSUnaryOpMinus !JSAnnot
+ | JSUnaryOpNot !JSAnnot
+ | JSUnaryOpPlus !JSAnnot
+ | JSUnaryOpTilde !JSAnnot
+ | JSUnaryOpTypeof !JSAnnot
+ | JSUnaryOpVoid !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSSemi
- = JSSemi !JSAnnot
- | JSSemiAuto
- deriving (Data, Eq, Show, Typeable)
+ = JSSemi !JSAnnot
+ | JSSemiAuto
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSAssignOp
- = JSAssign !JSAnnot
- | JSTimesAssign !JSAnnot
- | JSDivideAssign !JSAnnot
- | JSModAssign !JSAnnot
- | JSPlusAssign !JSAnnot
- | JSMinusAssign !JSAnnot
- | JSLshAssign !JSAnnot
- | JSRshAssign !JSAnnot
- | JSUrshAssign !JSAnnot
- | JSBwAndAssign !JSAnnot
- | JSBwXorAssign !JSAnnot
- | JSBwOrAssign !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSAssign !JSAnnot
+ | JSTimesAssign !JSAnnot
+ | JSDivideAssign !JSAnnot
+ | JSModAssign !JSAnnot
+ | JSPlusAssign !JSAnnot
+ | JSMinusAssign !JSAnnot
+ | JSLshAssign !JSAnnot
+ | JSRshAssign !JSAnnot
+ | JSUrshAssign !JSAnnot
+ | JSBwAndAssign !JSAnnot
+ | JSBwXorAssign !JSAnnot
+ | JSBwOrAssign !JSAnnot
+ | JSLogicalAndAssign !JSAnnot -- &&=
+ | JSLogicalOrAssign !JSAnnot
+ | -- | |=
+ JSNullishAssign !JSAnnot -- ??=
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSTryCatch
- = JSCatch !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSBlock -- ^catch,lb,ident,rb,block
- | JSCatchIf !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSExpression !JSAnnot !JSBlock -- ^catch,lb,ident,if,expr,rb,block
- deriving (Data, Eq, Show, Typeable)
+ = -- | catch,lb,ident,rb,block
+ JSCatch !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSBlock
+ | -- | catch,lb,ident,if,expr,rb,block
+ JSCatchIf !JSAnnot !JSAnnot !JSExpression !JSAnnot !JSExpression !JSAnnot !JSBlock
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSTryFinally
- = JSFinally !JSAnnot !JSBlock -- ^finally,block
- | JSNoFinally
- deriving (Data, Eq, Show, Typeable)
+ = -- | finally,block
+ JSFinally !JSAnnot !JSBlock
+ | JSNoFinally
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSBlock
- = JSBlock !JSAnnot ![JSStatement] !JSAnnot -- ^lbrace, stmts, rbrace
- deriving (Data, Eq, Show, Typeable)
+ = -- | lbrace, stmts, rbrace
+ JSBlock !JSAnnot ![JSStatement] !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSSwitchParts
- = JSCase !JSAnnot !JSExpression !JSAnnot ![JSStatement] -- ^expr,colon,stmtlist
- | JSDefault !JSAnnot !JSAnnot ![JSStatement] -- ^colon,stmtlist
- deriving (Data, Eq, Show, Typeable)
+ = -- | expr,colon,stmtlist
+ JSCase !JSAnnot !JSExpression !JSAnnot ![JSStatement]
+ | -- | colon,stmtlist
+ JSDefault !JSAnnot !JSAnnot ![JSStatement]
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSVarInitializer
- = JSVarInit !JSAnnot !JSExpression -- ^ assignop, initializer
- | JSVarInitNone
- deriving (Data, Eq, Show, Typeable)
+ = -- | assignop, initializer
+ JSVarInit !JSAnnot !JSExpression
+ | JSVarInitNone
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSObjectProperty
- = JSPropertyNameandValue !JSPropertyName !JSAnnot ![JSExpression] -- ^name, colon, value
- | JSPropertyIdentRef !JSAnnot !String
- | JSObjectMethod !JSMethodDefinition
- deriving (Data, Eq, Show, Typeable)
+ = -- | name, colon, value
+ JSPropertyNameandValue !JSPropertyName !JSAnnot ![JSExpression]
+ | JSPropertyIdentRef !JSAnnot !String
+ | JSObjectMethod !JSMethodDefinition
+ | -- | ..., expression
+ JSObjectSpread !JSAnnot !JSExpression
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSMethodDefinition
- = JSMethodDefinition !JSPropertyName !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock -- name, lb, params, rb, block
- | JSGeneratorMethodDefinition !JSAnnot !JSPropertyName !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock -- ^*, name, lb, params, rb, block
- | JSPropertyAccessor !JSAccessor !JSPropertyName !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock -- ^get/set, name, lb, params, rb, block
- deriving (Data, Eq, Show, Typeable)
+ = JSMethodDefinition !JSPropertyName !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock -- name, lb, params, rb, block
+ | -- | *, name, lb, params, rb, block
+ JSGeneratorMethodDefinition !JSAnnot !JSPropertyName !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ | -- | get/set, name, lb, params, rb, block
+ JSPropertyAccessor !JSAccessor !JSPropertyName !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSPropertyName
- = JSPropertyIdent !JSAnnot !String
- | JSPropertyString !JSAnnot !String
- | JSPropertyNumber !JSAnnot !String
- | JSPropertyComputed !JSAnnot !JSExpression !JSAnnot -- ^lb, expr, rb
- deriving (Data, Eq, Show, Typeable)
+ = JSPropertyIdent !JSAnnot !String
+ | JSPropertyString !JSAnnot !String
+ | JSPropertyNumber !JSAnnot !String
+ | -- | lb, expr, rb
+ JSPropertyComputed !JSAnnot !JSExpression !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
type JSObjectPropertyList = JSCommaTrailingList JSObjectProperty
-- | Accessors for JSObjectProperty is either 'get' or 'set'.
data JSAccessor
- = JSAccessorGet !JSAnnot
- | JSAccessorSet !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSAccessorGet !JSAnnot
+ | JSAccessorSet !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSIdent
- = JSIdentName !JSAnnot !String
- | JSIdentNone
- deriving (Data, Eq, Show, Typeable)
+ = JSIdentName !JSAnnot !String
+ | JSIdentNone
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSArrayElement
- = JSArrayElement !JSExpression
- | JSArrayComma !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSArrayElement !JSExpression
+ | JSArrayComma !JSAnnot
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSCommaList a
- = JSLCons !(JSCommaList a) !JSAnnot !a -- ^head, comma, a
- | JSLOne !a -- ^ single element (no comma)
- | JSLNil
- deriving (Data, Eq, Show, Typeable)
+ = -- | head, comma, a
+ JSLCons !(JSCommaList a) !JSAnnot !a
+ | -- | single element (no comma)
+ JSLOne !a
+ | JSLNil
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSCommaTrailingList a
- = JSCTLComma !(JSCommaList a) !JSAnnot -- ^list, trailing comma
- | JSCTLNone !(JSCommaList a) -- ^list
- deriving (Data, Eq, Show, Typeable)
+ = -- | list, trailing comma
+ JSCTLComma !(JSCommaList a) !JSAnnot
+ | -- | list
+ JSCTLNone !(JSCommaList a)
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSTemplatePart
- = JSTemplatePart !JSExpression !JSAnnot !String -- ^expr, rb, suffix
- deriving (Data, Eq, Show, Typeable)
+ = -- | expr, rb, suffix
+ JSTemplatePart !JSExpression !JSAnnot !String
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSClassHeritage
- = JSExtends !JSAnnot !JSExpression
- | JSExtendsNone
- deriving (Data, Eq, Show, Typeable)
+ = JSExtends !JSAnnot !JSExpression
+ | JSExtendsNone
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
data JSClassElement
- = JSClassInstanceMethod !JSMethodDefinition
- | JSClassStaticMethod !JSAnnot !JSMethodDefinition
- | JSClassSemi !JSAnnot
- deriving (Data, Eq, Show, Typeable)
+ = JSClassInstanceMethod !JSMethodDefinition
+ | JSClassStaticMethod !JSAnnot !JSMethodDefinition
+ | JSClassSemi !JSAnnot
+ | -- | #, name, =, optional initializer, autosemi
+ JSPrivateField !JSAnnot !String !JSAnnot !(Maybe JSExpression) !JSSemi
+ | -- | #, name, lb, params, rb, block
+ JSPrivateMethod !JSAnnot !String !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ | -- | get/set, #, name, lb, params, rb, block
+ JSPrivateAccessor !JSAccessor !JSAnnot !String !JSAnnot !(JSCommaList JSExpression) !JSAnnot !JSBlock
+ deriving (Data, Eq, Generic, NFData, Show, Typeable)
-- -----------------------------------------------------------------------------
+
-- | Show the AST elements stripped of their JSAnnot data.
-- Strip out the location info
-showStripped :: JSAST -> String
-showStripped (JSAstProgram xs _) = "JSAstProgram " ++ ss xs
-showStripped (JSAstModule xs _) = "JSAstModule " ++ ss xs
-showStripped (JSAstStatement s _) = "JSAstStatement (" ++ ss s ++ ")"
-showStripped (JSAstExpression e _) = "JSAstExpression (" ++ ss e ++ ")"
-showStripped (JSAstLiteral s _) = "JSAstLiteral (" ++ ss s ++ ")"
+-- | Convert AST to ByteString representation stripped of position information.
+--
+-- Removes all 'JSAnnot' location data while preserving the logical structure
+-- of the JavaScript AST. Useful for testing and debugging when position
+-- information is not relevant. Uses ByteString for optimal performance.
+--
+-- ==== Examples
+--
+-- >>> showStripped (JSAstProgram [JSEmptyStatement JSNoAnnot] JSNoAnnot)
+-- "JSAstProgram [JSEmptyStatement]"
+--
+-- @since 0.7.1.0
+showStripped :: JSAST -> String
+showStripped (JSAstProgram xs _) = "JSAstProgram " <> ss xs
+showStripped (JSAstModule xs _) = "JSAstModule " <> ss xs
+showStripped (JSAstStatement s _) = "JSAstStatement (" <> (ss s <> ")")
+showStripped (JSAstExpression e _) = "JSAstExpression (" <> (ss e <> ")")
+showStripped (JSAstLiteral e _) = "JSAstLiteral (" <> (ss e <> ")")
class ShowStripped a where
- ss :: a -> String
+ ss :: a -> String
instance ShowStripped JSStatement where
- ss (JSStatementBlock _ xs _ _) = "JSStatementBlock " ++ ss xs
- ss (JSBreak _ JSIdentNone s) = "JSBreak" ++ commaIf (ss s)
- ss (JSBreak _ (JSIdentName _ n) s) = "JSBreak " ++ singleQuote n ++ commaIf (ss s)
- ss (JSClass _ n h _lb xs _rb _) = "JSClass " ++ ssid n ++ " (" ++ ss h ++ ") " ++ ss xs
- ss (JSContinue _ JSIdentNone s) = "JSContinue" ++ commaIf (ss s)
- ss (JSContinue _ (JSIdentName _ n) s) = "JSContinue " ++ singleQuote n ++ commaIf (ss s)
- ss (JSConstant _ xs _as) = "JSConstant " ++ ss xs
- ss (JSDoWhile _d x1 _w _lb x2 _rb x3) = "JSDoWhile (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSFor _ _lb x1s _s1 x2s _s2 x3s _rb x4) = "JSFor " ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
- ss (JSForIn _ _lb x1s _i x2 _rb x3) = "JSForIn " ++ ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForVar _ _lb _v x1s _s1 x2s _s2 x3s _rb x4) = "JSForVar " ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
- ss (JSForVarIn _ _lb _v x1 _i x2 _rb x3) = "JSForVarIn (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForLet _ _lb _v x1s _s1 x2s _s2 x3s _rb x4) = "JSForLet " ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
- ss (JSForLetIn _ _lb _v x1 _i x2 _rb x3) = "JSForLetIn (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForLetOf _ _lb _v x1 _i x2 _rb x3) = "JSForLetOf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForConst _ _lb _v x1s _s1 x2s _s2 x3s _rb x4) = "JSForConst " ++ ss x1s ++ " " ++ ss x2s ++ " " ++ ss x3s ++ " (" ++ ss x4 ++ ")"
- ss (JSForConstIn _ _lb _v x1 _i x2 _rb x3) = "JSForConstIn (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForConstOf _ _lb _v x1 _i x2 _rb x3) = "JSForConstOf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForOf _ _lb x1s _i x2 _rb x3) = "JSForOf " ++ ss x1s ++ " (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSForVarOf _ _lb _v x1 _i x2 _rb x3) = "JSForVarOf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSFunction _ n _lb pl _rb x3 _) = "JSFunction " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
- ss (JSAsyncFunction _ _ n _lb pl _rb x3 _) = "JSAsyncFunction " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
- ss (JSGenerator _ _ n _lb pl _rb x3 _) = "JSGenerator " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
- ss (JSIf _ _lb x1 _rb x2) = "JSIf (" ++ ss x1 ++ ") (" ++ ss x2 ++ ")"
- ss (JSIfElse _ _lb x1 _rb x2 _e x3) = "JSIfElse (" ++ ss x1 ++ ") (" ++ ss x2 ++ ") (" ++ ss x3 ++ ")"
- ss (JSLabelled x1 _c x2) = "JSLabelled (" ++ ss x1 ++ ") (" ++ ss x2 ++ ")"
- ss (JSLet _ xs _as) = "JSLet " ++ ss xs
- ss (JSEmptyStatement _) = "JSEmptyStatement"
- ss (JSExpressionStatement l s) = ss l ++ (let x = ss s in if not (null x) then ',':x else "")
- ss (JSAssignStatement lhs op rhs s) ="JSOpAssign (" ++ ss op ++ "," ++ ss lhs ++ "," ++ ss rhs ++ (let x = ss s in if not (null x) then "),"++x else ")")
- ss (JSMethodCall e _ a _ s) = "JSMethodCall (" ++ ss e ++ ",JSArguments " ++ ss a ++ (let x = ss s in if not (null x) then "),"++x else ")")
- ss (JSReturn _ (Just me) s) = "JSReturn " ++ ss me ++ " " ++ ss s
- ss (JSReturn _ Nothing s) = "JSReturn " ++ ss s
- ss (JSSwitch _ _lp x _rp _lb x2 _rb _) = "JSSwitch (" ++ ss x ++ ") " ++ ss x2
- ss (JSThrow _ x _) = "JSThrow (" ++ ss x ++ ")"
- ss (JSTry _ xt1 xtc xtf) = "JSTry (" ++ ss xt1 ++ "," ++ ss xtc ++ "," ++ ss xtf ++ ")"
- ss (JSVariable _ xs _as) = "JSVariable " ++ ss xs
- ss (JSWhile _ _lb x1 _rb x2) = "JSWhile (" ++ ss x1 ++ ") (" ++ ss x2 ++ ")"
- ss (JSWith _ _lb x1 _rb x _) = "JSWith (" ++ ss x1 ++ ") (" ++ ss x ++ ")"
+ ss (JSStatementBlock _ xs _ _) = "JSStatementBlock " <> ss xs
+ ss (JSBreak _ JSIdentNone s) = "JSBreak" <> commaIf (ss s)
+ ss (JSBreak _ (JSIdentName _ n) s) = "JSBreak " <> (singleQuote n <> commaIf (ss s))
+ ss (JSClass _ n h _lb xs _rb _) = "JSClass " <> (ssid n <> (" (" <> (ss h <> (") " <> ss xs))))
+ ss (JSContinue _ JSIdentNone s) = "JSContinue" <> commaIf (ss s)
+ ss (JSContinue _ (JSIdentName _ n) s) = "JSContinue " <> (singleQuote n <> commaIf (ss s))
+ ss (JSConstant _ xs _as) = "JSConstant " <> ss xs
+ ss (JSDoWhile _d x1 _w _lb x2 _rb x3) = "JSDoWhile (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSFor _ _lb x1s _s1 x2s _s2 x3s _rb x4) = "JSFor " <> (ss x1s <> (" " <> (ss x2s <> (" " <> (ss x3s <> (" (" ++ ss x4 ++ ")"))))))
+ ss (JSForIn _ _lb x1s _i x2 _rb x3) = "JSForIn " <> (ss x1s <> (" (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForVar _ _lb _v x1s _s1 x2s _s2 x3s _rb x4) = "JSForVar " <> (ss x1s <> (" " <> (ss x2s <> (" " <> (ss x3s <> (" (" ++ ss x4 ++ ")"))))))
+ ss (JSForVarIn _ _lb _v x1 _i x2 _rb x3) = "JSForVarIn (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForLet _ _lb _v x1s _s1 x2s _s2 x3s _rb x4) = "JSForLet " <> (ss x1s <> (" " <> (ss x2s <> (" " <> (ss x3s <> (" (" ++ ss x4 ++ ")"))))))
+ ss (JSForLetIn _ _lb _v x1 _i x2 _rb x3) = "JSForLetIn (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForLetOf _ _lb _v x1 _i x2 _rb x3) = "JSForLetOf (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForConst _ _lb _v x1s _s1 x2s _s2 x3s _rb x4) = "JSForConst " <> (ss x1s <> (" " <> (ss x2s <> (" " <> (ss x3s <> (" (" ++ ss x4 ++ ")"))))))
+ ss (JSForConstIn _ _lb _v x1 _i x2 _rb x3) = "JSForConstIn (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForConstOf _ _lb _v x1 _i x2 _rb x3) = "JSForConstOf (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForOf _ _lb x1s _i x2 _rb x3) = "JSForOf " <> (ss x1s <> (" (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSForVarOf _ _lb _v x1 _i x2 _rb x3) = "JSForVarOf (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSFunction _ n _lb pl _rb x3 _) = "JSFunction " <> (ssid n <> (" " <> (ss pl <> (" (" <> (ss x3 <> ")")))))
+ ss (JSAsyncFunction _ _ n _lb pl _rb x3 _) = "JSAsyncFunction " <> (ssid n <> (" " <> (ss pl <> (" (" <> (ss x3 <> ")")))))
+ ss (JSGenerator _ _ n _lb pl _rb x3 _) = "JSGenerator " <> (ssid n <> (" " <> (ss pl <> (" (" <> (ss x3 <> ")")))))
+ ss (JSIf _ _lb x1 _rb x2) = "JSIf (" <> (ss x1 <> (") (" <> (ss x2 <> ")")))
+ ss (JSIfElse _ _lb x1 _rb x2 _e x3) = "JSIfElse (" <> (ss x1 <> (") (" <> (ss x2 <> (") (" <> (ss x3 <> ")")))))
+ ss (JSLabelled x1 _c x2) = "JSLabelled (" <> (ss x1 <> (") (" <> (ss x2 <> ")")))
+ ss (JSLet _ xs _as) = "JSLet " <> ss xs
+ ss (JSEmptyStatement _) = "JSEmptyStatement"
+ ss (JSExpressionStatement l s) = ss l <> (let x = ss s in if not (null x) then "," <> x else "")
+ ss (JSAssignStatement lhs op rhs s) = "JSOpAssign (" <> (ss op <> ("," <> (ss lhs <> ("," <> (ss rhs <> (let x = ss s in if not (null x) then ")," ++ x else ")"))))))
+ ss (JSMethodCall e _ a _ s) = "JSMethodCall (" <> (ss e <> (",JSArguments " <> (ss a <> (let x = ss s in if not (null x) then ")," <> x else ")"))))
+ ss (JSReturn _ (Just me) s) = "JSReturn " <> (ss me <> (" " <> ss s))
+ ss (JSReturn _ Nothing s) = "JSReturn " <> ss s
+ ss (JSSwitch _ _lp x _rp _lb x2 _rb _) = "JSSwitch (" <> (ss x <> (") " <> ss x2))
+ ss (JSThrow _ x _) = "JSThrow (" <> (ss x <> ")")
+ ss (JSTry _ xt1 xtc xtf) = "JSTry (" <> (ss xt1 <> ("," <> (ss xtc <> ("," <> (ss xtf <> ")")))))
+ ss (JSVariable _ xs _as) = "JSVariable " <> ss xs
+ ss (JSWhile _ _lb x1 _rb x2) = "JSWhile (" <> (ss x1 <> (") (" <> (ss x2 <> ")")))
+ ss (JSWith _ _lb x1 _rb x _) = "JSWith (" <> (ss x1 <> (") (" <> (ss x <> ")")))
instance ShowStripped JSExpression where
- ss (JSArrayLiteral _lb xs _rb) = "JSArrayLiteral " ++ ss xs
- ss (JSAssignExpression lhs op rhs) = "JSOpAssign (" ++ ss op ++ "," ++ ss lhs ++ "," ++ ss rhs ++ ")"
- ss (JSAwaitExpression _ e) = "JSAwaitExpresson " ++ ss e
- ss (JSCallExpression ex _ xs _) = "JSCallExpression ("++ ss ex ++ ",JSArguments " ++ ss xs ++ ")"
- ss (JSCallExpressionDot ex _os xs) = "JSCallExpressionDot (" ++ ss ex ++ "," ++ ss xs ++ ")"
- ss (JSCallExpressionSquare ex _os xs _cs) = "JSCallExpressionSquare (" ++ ss ex ++ "," ++ ss xs ++ ")"
- ss (JSClassExpression _ n h _lb xs _rb) = "JSClassExpression " ++ ssid n ++ " (" ++ ss h ++ ") " ++ ss xs
- ss (JSDecimal _ s) = "JSDecimal " ++ singleQuote s
- ss (JSCommaExpression l _ r) = "JSExpression [" ++ ss l ++ "," ++ ss r ++ "]"
- ss (JSExpressionBinary x2 op x3) = "JSExpressionBinary (" ++ ss op ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")"
- ss (JSExpressionParen _lp x _rp) = "JSExpressionParen (" ++ ss x ++ ")"
- ss (JSExpressionPostfix xs op) = "JSExpressionPostfix (" ++ ss op ++ "," ++ ss xs ++ ")"
- ss (JSExpressionTernary x1 _q x2 _c x3) = "JSExpressionTernary (" ++ ss x1 ++ "," ++ ss x2 ++ "," ++ ss x3 ++ ")"
- ss (JSArrowExpression ps _ e) = "JSArrowExpression (" ++ ss ps ++ ") => " ++ ss e
- ss (JSFunctionExpression _ n _lb pl _rb x3) = "JSFunctionExpression " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
- ss (JSGeneratorExpression _ _ n _lb pl _rb x3) = "JSGeneratorExpression " ++ ssid n ++ " " ++ ss pl ++ " (" ++ ss x3 ++ ")"
- ss (JSHexInteger _ s) = "JSHexInteger " ++ singleQuote s
- ss (JSOctal _ s) = "JSOctal " ++ singleQuote s
- ss (JSIdentifier _ s) = "JSIdentifier " ++ singleQuote s
- ss (JSLiteral _ []) = "JSLiteral ''"
- ss (JSLiteral _ s) = "JSLiteral " ++ singleQuote s
- ss (JSMemberDot x1s _d x2 ) = "JSMemberDot (" ++ ss x1s ++ "," ++ ss x2 ++ ")"
- ss (JSMemberExpression e _ a _) = "JSMemberExpression (" ++ ss e ++ ",JSArguments " ++ ss a ++ ")"
- ss (JSMemberNew _a n _ s _) = "JSMemberNew (" ++ ss n ++ ",JSArguments " ++ ss s ++ ")"
- ss (JSMemberSquare x1s _lb x2 _rb) = "JSMemberSquare (" ++ ss x1s ++ "," ++ ss x2 ++ ")"
- ss (JSNewExpression _n e) = "JSNewExpression " ++ ss e
- ss (JSObjectLiteral _lb xs _rb) = "JSObjectLiteral " ++ ss xs
- ss (JSRegEx _ s) = "JSRegEx " ++ singleQuote s
- ss (JSStringLiteral _ s) = "JSStringLiteral " ++ s
- ss (JSUnaryExpression op x) = "JSUnaryExpression (" ++ ss op ++ "," ++ ss x ++ ")"
- ss (JSVarInitExpression x1 x2) = "JSVarInitExpression (" ++ ss x1 ++ ") " ++ ss x2
- ss (JSYieldExpression _ Nothing) = "JSYieldExpression ()"
- ss (JSYieldExpression _ (Just x)) = "JSYieldExpression (" ++ ss x ++ ")"
- ss (JSYieldFromExpression _ _ x) = "JSYieldFromExpression (" ++ ss x ++ ")"
- ss (JSSpreadExpression _ x1) = "JSSpreadExpression (" ++ ss x1 ++ ")"
- ss (JSTemplateLiteral Nothing _ s ps) = "JSTemplateLiteral (()," ++ singleQuote s ++ "," ++ ss ps ++ ")"
- ss (JSTemplateLiteral (Just t) _ s ps) = "JSTemplateLiteral ((" ++ ss t ++ ")," ++ singleQuote s ++ "," ++ ss ps ++ ")"
+ ss (JSArrayLiteral _lb xs _rb) = "JSArrayLiteral " <> ss xs
+ ss (JSAssignExpression lhs op rhs) = "JSOpAssign (" <> (ss op <> ("," <> (ss lhs <> ("," <> (ss rhs <> ")")))))
+ ss (JSAwaitExpression _ e) = "JSAwaitExpresson " <> ss e
+ ss (JSCallExpression ex _ xs _) = "JSCallExpression (" <> (ss ex <> (",JSArguments " <> (ss xs <> ")")))
+ ss (JSCallExpressionDot ex _os xs) = "JSCallExpressionDot (" <> (ss ex <> ("," <> (ss xs <> ")")))
+ ss (JSCallExpressionSquare ex _os xs _cs) = "JSCallExpressionSquare (" <> (ss ex <> ("," <> (ss xs <> ")")))
+ ss (JSClassExpression _ n h _lb xs _rb) = "JSClassExpression " <> (ssid n <> (" (" <> (ss h <> (") " <> ss xs))))
+ ss (JSDecimal _ s) = "JSDecimal " <> singleQuote (s)
+ ss (JSCommaExpression l _ r) = "JSExpression [" <> (ss l <> ("," <> (ss r <> "]")))
+ ss (JSExpressionBinary x2 op x3) = "JSExpressionBinary (" <> (ss op <> ("," <> (ss x2 <> ("," <> (ss x3 <> ")")))))
+ ss (JSExpressionParen _lp x _rp) = "JSExpressionParen (" <> (ss x <> ")")
+ ss (JSExpressionPostfix xs op) = "JSExpressionPostfix (" <> (ss op <> ("," <> (ss xs <> ")")))
+ ss (JSExpressionTernary x1 _q x2 _c x3) = "JSExpressionTernary (" <> (ss x1 <> ("," <> (ss x2 <> ("," <> (ss x3 <> ")")))))
+ ss (JSArrowExpression ps _ body) = "JSArrowExpression (" <> (ss ps <> (") => " <> ss body))
+ ss (JSFunctionExpression _ n _lb pl _rb x3) = "JSFunctionExpression " <> (ssid n <> (" " <> (ss pl <> (" (" <> (ss x3 <> ")")))))
+ ss (JSGeneratorExpression _ _ n _lb pl _rb x3) = "JSGeneratorExpression " <> (ssid n <> (" " <> (ss pl <> (" (" <> (ss x3 <> ")")))))
+ ss (JSAsyncFunctionExpression _ _ n _lb pl _rb x3) = "JSAsyncFunctionExpression " <> (ssid n <> (" " <> (ss pl <> (" (" <> (ss x3 <> ")")))))
+ ss (JSHexInteger _ s) = "JSHexInteger " <> singleQuote (s)
+ ss (JSBinaryInteger _ s) = "JSBinaryInteger " <> singleQuote (s)
+ ss (JSOctal _ s) = "JSOctal " <> singleQuote (s)
+ ss (JSBigIntLiteral _ s) = "JSBigIntLiteral " <> singleQuote (s)
+ ss (JSIdentifier _ s) = "JSIdentifier " <> singleQuote (s)
+ ss (JSLiteral _ s) | null s = "JSLiteral ''"
+ ss (JSLiteral _ s) = "JSLiteral " <> singleQuote (s)
+ ss (JSMemberDot x1s _d x2) = "JSMemberDot (" <> (ss x1s <> ("," <> (ss x2 <> ")")))
+ ss (JSMemberExpression e _ a _) = "JSMemberExpression (" <> (ss e <> (",JSArguments " <> (ss a <> ")")))
+ ss (JSMemberNew _a n _ s _) = "JSMemberNew (" <> (ss n <> (",JSArguments " <> (ss s <> ")")))
+ ss (JSMemberSquare x1s _lb x2 _rb) = "JSMemberSquare (" <> (ss x1s <> ("," <> (ss x2 <> ")")))
+ ss (JSNewExpression _n e) = "JSNewExpression " <> ss e
+ ss (JSOptionalMemberDot x1s _d x2) = "JSOptionalMemberDot (" <> (ss x1s <> ("," <> (ss x2 <> ")")))
+ ss (JSOptionalMemberSquare x1s _lb x2 _rb) = "JSOptionalMemberSquare (" <> (ss x1s <> ("," <> (ss x2 <> ")")))
+ ss (JSOptionalCallExpression ex _ xs _) = "JSOptionalCallExpression (" <> (ss ex <> (",JSArguments " <> (ss xs <> ")")))
+ ss (JSObjectLiteral _lb xs _rb) = "JSObjectLiteral " <> ss xs
+ ss (JSRegEx _ s) = "JSRegEx " <> singleQuote (s)
+ ss (JSStringLiteral _ s) = "JSStringLiteral " <> s
+ ss (JSUnaryExpression op x) = "JSUnaryExpression (" <> (ss op <> ("," <> (ss x <> ")")))
+ ss (JSVarInitExpression x1 x2) = "JSVarInitExpression (" <> (ss x1 <> (") " <> ss x2))
+ ss (JSYieldExpression _ Nothing) = "JSYieldExpression ()"
+ ss (JSYieldExpression _ (Just x)) = "JSYieldExpression (" <> (ss x <> ")")
+ ss (JSYieldFromExpression _ _ x) = "JSYieldFromExpression (" <> (ss x <> ")")
+ ss (JSImportMeta _ _) = "JSImportMeta"
+ ss (JSSpreadExpression _ x1) = "JSSpreadExpression (" <> (ss x1 <> ")")
+ ss (JSTemplateLiteral Nothing _ s ps) = "JSTemplateLiteral (()," <> (singleQuote (s) <> ("," <> (ss ps <> ")")))
+ ss (JSTemplateLiteral (Just t) _ s ps) = "JSTemplateLiteral ((" <> (ss t <> (")," <> (singleQuote (s) <> ("," <> (ss ps <> ")")))))
instance ShowStripped JSArrowParameterList where
- ss (JSUnparenthesizedArrowParameter x) = ss x
- ss (JSParenthesizedArrowParameterList _ xs _) = ss xs
+ ss (JSUnparenthesizedArrowParameter x) = ss x
+ ss (JSParenthesizedArrowParameterList _ xs _) = ss xs
+
+instance ShowStripped JSConciseBody where
+ ss (JSConciseFunctionBody block) = "JSConciseFunctionBody (" <> (ss block <> ")")
+ ss (JSConciseExpressionBody expr) = "JSConciseExpressionBody (" <> (ss expr <> ")")
instance ShowStripped JSModuleItem where
- ss (JSModuleExportDeclaration _ x1) = "JSModuleExportDeclaration (" ++ ss x1 ++ ")"
- ss (JSModuleImportDeclaration _ x1) = "JSModuleImportDeclaration (" ++ ss x1 ++ ")"
- ss (JSModuleStatementListItem x1) = "JSModuleStatementListItem (" ++ ss x1 ++ ")"
+ ss (JSModuleExportDeclaration _ x1) = "JSModuleExportDeclaration (" <> (ss x1 <> ")")
+ ss (JSModuleImportDeclaration _ x1) = "JSModuleImportDeclaration (" <> (ss x1 <> ")")
+ ss (JSModuleStatementListItem x1) = "JSModuleStatementListItem (" <> (ss x1 <> ")")
instance ShowStripped JSImportDeclaration where
- ss (JSImportDeclaration imp from _) = "JSImportDeclaration (" ++ ss imp ++ "," ++ ss from ++ ")"
- ss (JSImportDeclarationBare _ m _) = "JSImportDeclarationBare (" ++ singleQuote m ++ ")"
+ ss (JSImportDeclaration imp from attrs _) = "JSImportDeclaration (" <> (ss imp <> ("," <> (ss from <> (maybe "" (\a -> "," <> ss a) attrs <> ")"))))
+ ss (JSImportDeclarationBare _ m attrs _) = "JSImportDeclarationBare (" <> (singleQuote (m) <> (maybe "" (\a -> "," <> ss a) attrs <> ")"))
instance ShowStripped JSImportClause where
- ss (JSImportClauseDefault x) = "JSImportClauseDefault (" ++ ss x ++ ")"
- ss (JSImportClauseNameSpace x) = "JSImportClauseNameSpace (" ++ ss x ++ ")"
- ss (JSImportClauseNamed x) = "JSImportClauseNameSpace (" ++ ss x ++ ")"
- ss (JSImportClauseDefaultNameSpace x1 _ x2) = "JSImportClauseDefaultNameSpace (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
- ss (JSImportClauseDefaultNamed x1 _ x2) = "JSImportClauseDefaultNamed (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+ ss (JSImportClauseDefault x) = "JSImportClauseDefault (" <> (ss x <> ")")
+ ss (JSImportClauseNameSpace x) = "JSImportClauseNameSpace (" <> (ss x <> ")")
+ ss (JSImportClauseNamed x) = "JSImportClauseNameSpace (" <> (ss x <> ")")
+ ss (JSImportClauseDefaultNameSpace x1 _ x2) = "JSImportClauseDefaultNameSpace (" <> (ss x1 <> ("," <> (ss x2 <> ")")))
+ ss (JSImportClauseDefaultNamed x1 _ x2) = "JSImportClauseDefaultNamed (" <> (ss x1 <> ("," <> (ss x2 <> ")")))
instance ShowStripped JSFromClause where
- ss (JSFromClause _ _ m) = "JSFromClause " ++ singleQuote m
+ ss (JSFromClause _ _ m) = "JSFromClause " <> singleQuote (m)
instance ShowStripped JSImportNameSpace where
- ss (JSImportNameSpace _ _ x) = "JSImportNameSpace (" ++ ss x ++ ")"
+ ss (JSImportNameSpace _ _ x) = "JSImportNameSpace (" <> (ss x <> ")")
instance ShowStripped JSImportsNamed where
- ss (JSImportsNamed _ xs _) = "JSImportsNamed (" ++ ss xs ++ ")"
+ ss (JSImportsNamed _ xs _) = "JSImportsNamed (" <> (ss xs <> ")")
instance ShowStripped JSImportSpecifier where
- ss (JSImportSpecifier x1) = "JSImportSpecifier (" ++ ss x1 ++ ")"
- ss (JSImportSpecifierAs x1 _ x2) = "JSImportSpecifierAs (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+ ss (JSImportSpecifier x1) = "JSImportSpecifier (" <> (ss x1 <> ")")
+ ss (JSImportSpecifierAs x1 _ x2) = "JSImportSpecifierAs (" <> (ss x1 <> ("," <> (ss x2 <> ")")))
+
+instance ShowStripped JSImportAttributes where
+ ss (JSImportAttributes _ attrs _) = "JSImportAttributes (" <> (ss attrs <> ")")
+
+instance ShowStripped JSImportAttribute where
+ ss (JSImportAttribute key _ value) = "JSImportAttribute (" <> (ss key <> ("," <> (ss value <> ")")))
instance ShowStripped JSExportDeclaration where
- ss (JSExportFrom xs from _) = "JSExportFrom (" ++ ss xs ++ "," ++ ss from ++ ")"
- ss (JSExportLocals xs _) = "JSExportLocals (" ++ ss xs ++ ")"
- ss (JSExport x1 _) = "JSExport (" ++ ss x1 ++ ")"
+ ss (JSExportAllFrom star from _) = "JSExportAllFrom (" <> (ss star <> ("," <> (ss from <> ")")))
+ ss (JSExportAllAsFrom star _ ident from _) = "JSExportAllAsFrom (" <> (ss star <> ("," <> (ss ident <> ("," <> (ss from <> ")")))))
+ ss (JSExportFrom xs from _) = "JSExportFrom (" <> (ss xs <> ("," <> (ss from <> ")")))
+ ss (JSExportLocals xs _) = "JSExportLocals (" <> (ss xs <> ")")
+ ss (JSExport x1 _) = "JSExport (" <> (ss x1 <> ")")
+ ss (JSExportDefault _ x1 _) = "JSExportDefault (" <> (ss x1 <> ")")
instance ShowStripped JSExportClause where
- ss (JSExportClause _ xs _) = "JSExportClause (" ++ ss xs ++ ")"
+ ss (JSExportClause _ xs _) = "JSExportClause (" <> (ss xs <> ")")
instance ShowStripped JSExportSpecifier where
- ss (JSExportSpecifier x1) = "JSExportSpecifier (" ++ ss x1 ++ ")"
- ss (JSExportSpecifierAs x1 _ x2) = "JSExportSpecifierAs (" ++ ss x1 ++ "," ++ ss x2 ++ ")"
+ ss (JSExportSpecifier x1) = "JSExportSpecifier (" <> (ss x1 <> ")")
+ ss (JSExportSpecifierAs x1 _ x2) = "JSExportSpecifierAs (" <> (ss x1 <> ("," <> (ss x2 <> ")")))
instance ShowStripped JSTryCatch where
- ss (JSCatch _ _lb x1 _rb x3) = "JSCatch (" ++ ss x1 ++ "," ++ ss x3 ++ ")"
- ss (JSCatchIf _ _lb x1 _ ex _rb x3) = "JSCatch (" ++ ss x1 ++ ") if " ++ ss ex ++ " (" ++ ss x3 ++ ")"
+ ss (JSCatch _ _lb x1 _rb x3) = "JSCatch (" <> (ss x1 <> ("," <> (ss x3 <> ")")))
+ ss (JSCatchIf _ _lb x1 _ ex _rb x3) = "JSCatch (" <> (ss x1 <> (") if " <> (ss ex <> (" (" <> (ss x3 <> ")")))))
instance ShowStripped JSTryFinally where
- ss (JSFinally _ x) = "JSFinally (" ++ ss x ++ ")"
- ss JSNoFinally = "JSFinally ()"
+ ss (JSFinally _ x) = "JSFinally (" <> (ss x <> ")")
+ ss JSNoFinally = "JSFinally ()"
instance ShowStripped JSIdent where
- ss (JSIdentName _ s) = "JSIdentifier " ++ singleQuote s
- ss JSIdentNone = "JSIdentNone"
+ ss (JSIdentName _ s) = "JSIdentifier " <> singleQuote (s)
+ ss JSIdentNone = "JSIdentNone"
instance ShowStripped JSObjectProperty where
- ss (JSPropertyNameandValue x1 _colon x2s) = "JSPropertyNameandValue (" ++ ss x1 ++ ") " ++ ss x2s
- ss (JSPropertyIdentRef _ s) = "JSPropertyIdentRef " ++ singleQuote s
- ss (JSObjectMethod m) = ss m
+ ss (JSPropertyNameandValue x1 _colon x2s) = "JSPropertyNameandValue (" <> (ss x1 <> (") " <> ss x2s))
+ ss (JSPropertyIdentRef _ s) = "JSPropertyIdentRef " <> singleQuote (s)
+ ss (JSObjectMethod m) = ss m
+ ss (JSObjectSpread _ expr) = "JSObjectSpread (" <> (ss expr <> ")")
instance ShowStripped JSMethodDefinition where
- ss (JSMethodDefinition x1 _lb1 x2s _rb1 x3) = "JSMethodDefinition (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
- ss (JSPropertyAccessor s x1 _lb1 x2s _rb1 x3) = "JSPropertyAccessor " ++ ss s ++ " (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
- ss (JSGeneratorMethodDefinition _ x1 _lb1 x2s _rb1 x3) = "JSGeneratorMethodDefinition (" ++ ss x1 ++ ") " ++ ss x2s ++ " (" ++ ss x3 ++ ")"
+ ss (JSMethodDefinition x1 _lb1 x2s _rb1 x3) = "JSMethodDefinition (" <> (ss x1 <> (") " <> (ss x2s <> (" (" <> (ss x3 <> ")")))))
+ ss (JSPropertyAccessor s x1 _lb1 x2s _rb1 x3) = "JSPropertyAccessor " <> (ss s <> (" (" <> (ss x1 <> (") " <> (ss x2s <> (" (" ++ ss x3 ++ ")"))))))
+ ss (JSGeneratorMethodDefinition _ x1 _lb1 x2s _rb1 x3) = "JSGeneratorMethodDefinition (" <> (ss x1 <> (") " <> (ss x2s <> (" (" <> (ss x3 <> ")")))))
instance ShowStripped JSPropertyName where
- ss (JSPropertyIdent _ s) = "JSIdentifier " ++ singleQuote s
- ss (JSPropertyString _ s) = "JSIdentifier " ++ singleQuote s
- ss (JSPropertyNumber _ s) = "JSIdentifier " ++ singleQuote s
- ss (JSPropertyComputed _ x _) = "JSPropertyComputed (" ++ ss x ++ ")"
+ ss (JSPropertyIdent _ s) = "JSIdentifier " <> singleQuote (s)
+ ss (JSPropertyString _ s) = "JSIdentifier " <> singleQuote (s)
+ ss (JSPropertyNumber _ s) = "JSIdentifier " <> singleQuote (s)
+ ss (JSPropertyComputed _ x _) = "JSPropertyComputed (" <> (ss x <> ")")
instance ShowStripped JSAccessor where
- ss (JSAccessorGet _) = "JSAccessorGet"
- ss (JSAccessorSet _) = "JSAccessorSet"
+ ss (JSAccessorGet _) = "JSAccessorGet"
+ ss (JSAccessorSet _) = "JSAccessorSet"
instance ShowStripped JSBlock where
- ss (JSBlock _ xs _) = "JSBlock " ++ ss xs
+ ss (JSBlock _ xs _) = "JSBlock " <> ss xs
instance ShowStripped JSSwitchParts where
- ss (JSCase _ x1 _c x2s) = "JSCase (" ++ ss x1 ++ ") (" ++ ss x2s ++ ")"
- ss (JSDefault _ _c xs) = "JSDefault (" ++ ss xs ++ ")"
+ ss (JSCase _ x1 _c x2s) = "JSCase (" <> (ss x1 <> (") (" <> (ss x2s <> ")")))
+ ss (JSDefault _ _c xs) = "JSDefault (" <> (ss xs <> ")")
instance ShowStripped JSBinOp where
- ss (JSBinOpAnd _) = "'&&'"
- ss (JSBinOpBitAnd _) = "'&'"
- ss (JSBinOpBitOr _) = "'|'"
- ss (JSBinOpBitXor _) = "'^'"
- ss (JSBinOpDivide _) = "'/'"
- ss (JSBinOpEq _) = "'=='"
- ss (JSBinOpGe _) = "'>='"
- ss (JSBinOpGt _) = "'>'"
- ss (JSBinOpIn _) = "'in'"
- ss (JSBinOpInstanceOf _) = "'instanceof'"
- ss (JSBinOpLe _) = "'<='"
- ss (JSBinOpLsh _) = "'<<'"
- ss (JSBinOpLt _) = "'<'"
- ss (JSBinOpMinus _) = "'-'"
- ss (JSBinOpMod _) = "'%'"
- ss (JSBinOpNeq _) = "'!='"
- ss (JSBinOpOf _) = "'of'"
- ss (JSBinOpOr _) = "'||'"
- ss (JSBinOpPlus _) = "'+'"
- ss (JSBinOpRsh _) = "'>>'"
- ss (JSBinOpStrictEq _) = "'==='"
- ss (JSBinOpStrictNeq _) = "'!=='"
- ss (JSBinOpTimes _) = "'*'"
- ss (JSBinOpUrsh _) = "'>>>'"
+ ss (JSBinOpAnd _) = "'&&'"
+ ss (JSBinOpBitAnd _) = "'&'"
+ ss (JSBinOpBitOr _) = "'|'"
+ ss (JSBinOpBitXor _) = "'^'"
+ ss (JSBinOpDivide _) = "'/'"
+ ss (JSBinOpEq _) = "'=='"
+ ss (JSBinOpExponentiation _) = "'**'"
+ ss (JSBinOpGe _) = "'>='"
+ ss (JSBinOpGt _) = "'>'"
+ ss (JSBinOpIn _) = "'in'"
+ ss (JSBinOpInstanceOf _) = "'instanceof'"
+ ss (JSBinOpLe _) = "'<='"
+ ss (JSBinOpLsh _) = "'<<'"
+ ss (JSBinOpLt _) = "'<'"
+ ss (JSBinOpMinus _) = "'-'"
+ ss (JSBinOpMod _) = "'%'"
+ ss (JSBinOpNeq _) = "'!='"
+ ss (JSBinOpOf _) = "'of'"
+ ss (JSBinOpOr _) = "'||'"
+ ss (JSBinOpNullishCoalescing _) = "'??'"
+ ss (JSBinOpPlus _) = "'+'"
+ ss (JSBinOpRsh _) = "'>>'"
+ ss (JSBinOpStrictEq _) = "'==='"
+ ss (JSBinOpStrictNeq _) = "'!=='"
+ ss (JSBinOpTimes _) = "'*'"
+ ss (JSBinOpUrsh _) = "'>>>'"
instance ShowStripped JSUnaryOp where
- ss (JSUnaryOpDecr _) = "'--'"
- ss (JSUnaryOpDelete _) = "'delete'"
- ss (JSUnaryOpIncr _) = "'++'"
- ss (JSUnaryOpMinus _) = "'-'"
- ss (JSUnaryOpNot _) = "'!'"
- ss (JSUnaryOpPlus _) = "'+'"
- ss (JSUnaryOpTilde _) = "'~'"
- ss (JSUnaryOpTypeof _) = "'typeof'"
- ss (JSUnaryOpVoid _) = "'void'"
+ ss (JSUnaryOpDecr _) = "'--'"
+ ss (JSUnaryOpDelete _) = "'delete'"
+ ss (JSUnaryOpIncr _) = "'++'"
+ ss (JSUnaryOpMinus _) = "'-'"
+ ss (JSUnaryOpNot _) = "'!'"
+ ss (JSUnaryOpPlus _) = "'+'"
+ ss (JSUnaryOpTilde _) = "'~'"
+ ss (JSUnaryOpTypeof _) = "'typeof'"
+ ss (JSUnaryOpVoid _) = "'void'"
instance ShowStripped JSAssignOp where
- ss (JSAssign _) = "'='"
- ss (JSTimesAssign _) = "'*='"
- ss (JSDivideAssign _) = "'/='"
- ss (JSModAssign _) = "'%='"
- ss (JSPlusAssign _) = "'+='"
- ss (JSMinusAssign _) = "'-='"
- ss (JSLshAssign _) = "'<<='"
- ss (JSRshAssign _) = "'>>='"
- ss (JSUrshAssign _) = "'>>>='"
- ss (JSBwAndAssign _) = "'&='"
- ss (JSBwXorAssign _) = "'^='"
- ss (JSBwOrAssign _) = "'|='"
+ ss (JSAssign _) = "'='"
+ ss (JSTimesAssign _) = "'*='"
+ ss (JSDivideAssign _) = "'/='"
+ ss (JSModAssign _) = "'%='"
+ ss (JSPlusAssign _) = "'+='"
+ ss (JSMinusAssign _) = "'-='"
+ ss (JSLshAssign _) = "'<<='"
+ ss (JSRshAssign _) = "'>>='"
+ ss (JSUrshAssign _) = "'>>>='"
+ ss (JSBwAndAssign _) = "'&='"
+ ss (JSBwXorAssign _) = "'^='"
+ ss (JSBwOrAssign _) = "'|='"
+ ss (JSLogicalAndAssign _) = "'&&='"
+ ss (JSLogicalOrAssign _) = "'||='"
+ ss (JSNullishAssign _) = "'??='"
instance ShowStripped JSVarInitializer where
- ss (JSVarInit _ n) = "[" ++ ss n ++ "]"
- ss JSVarInitNone = ""
+ ss (JSVarInit _ n) = "[" <> (ss n <> "]")
+ ss JSVarInitNone = ""
instance ShowStripped JSSemi where
- ss (JSSemi _) = "JSSemicolon"
- ss JSSemiAuto = ""
+ ss (JSSemi _) = "JSSemicolon"
+ ss JSSemiAuto = ""
instance ShowStripped JSArrayElement where
- ss (JSArrayElement e) = ss e
- ss (JSArrayComma _) = "JSComma"
+ ss (JSArrayElement e) = ss e
+ ss (JSArrayComma _) = "JSComma"
instance ShowStripped JSTemplatePart where
- ss (JSTemplatePart e _ s) = "(" ++ ss e ++ "," ++ singleQuote s ++ ")"
+ ss (JSTemplatePart e _ s) = "(" <> (ss e <> ("," <> (singleQuote (s) <> ")")))
instance ShowStripped JSClassHeritage where
- ss JSExtendsNone = ""
- ss (JSExtends _ x) = ss x
+ ss JSExtendsNone = ""
+ ss (JSExtends _ x) = ss x
instance ShowStripped JSClassElement where
- ss (JSClassInstanceMethod m) = ss m
- ss (JSClassStaticMethod _ m) = "JSClassStaticMethod (" ++ ss m ++ ")"
- ss (JSClassSemi _) = "JSClassSemi"
+ ss (JSClassInstanceMethod m) = ss m
+ ss (JSClassStaticMethod _ m) = "JSClassStaticMethod (" <> (ss m <> ")")
+ ss (JSClassSemi _) = "JSClassSemi"
+ ss (JSPrivateField _ name _ Nothing _) = "JSPrivateField " <> singleQuote ("#" <> name)
+ ss (JSPrivateField _ name _ (Just initializer) _) = "JSPrivateField " <> (singleQuote ("#" <> name) <> (" (" <> (ss initializer <> ")")))
+ ss (JSPrivateMethod _ name _ params _ block) = "JSPrivateMethod " <> (singleQuote ("#" <> name) <> (" " <> (ss params <> (" (" <> (ss block <> ")")))))
+ ss (JSPrivateAccessor accessor _ name _ params _ block) = "JSPrivateAccessor " <> (ss accessor <> (" " <> (singleQuote ("#" <> name) <> (" " <> (ss params <> (" (" ++ ss block ++ ")"))))))
instance ShowStripped a => ShowStripped (JSCommaList a) where
- ss xs = "(" ++ commaJoin (map ss $ fromCommaList xs) ++ ")"
+ ss xs = "(" <> (commaJoin (ss <$> fromCommaList xs) <> ")")
instance ShowStripped a => ShowStripped (JSCommaTrailingList a) where
- ss (JSCTLComma xs _) = "[" ++ commaJoin (map ss $ fromCommaList xs) ++ ",JSComma]"
- ss (JSCTLNone xs) = "[" ++ commaJoin (map ss $ fromCommaList xs) ++ "]"
+ ss (JSCTLComma xs _) = "[" <> (commaJoin (ss <$> fromCommaList xs) <> ",JSComma]")
+ ss (JSCTLNone xs) = "[" <> (commaJoin (ss <$> fromCommaList xs) <> "]")
instance ShowStripped a => ShowStripped [a] where
- ss xs = "[" ++ commaJoin (map ss xs) ++ "]"
+ ss xs = "[" <> (commaJoin (fmap ss xs) <> "]")
-- -----------------------------------------------------------------------------
-- Helpers.
+-- | Join ByteStrings with commas, filtering out empty ByteStrings.
+--
+-- Utility function for generating comma-separated lists in pretty printing,
+-- automatically removing empty ByteStrings to avoid extra commas.
+--
+-- ==== Examples
+--
+-- >>> commaJoin ["foo", "", "bar"]
+-- "foo,bar"
+--
+-- >>> commaJoin ["single"]
+-- "single"
+--
+-- @since 0.7.1.0
commaJoin :: [String] -> String
-commaJoin s = intercalate "," $ filter (not . null) s
-
+commaJoin s = List.intercalate "," $ List.filter (not . null) s
+
+-- | Convert comma-separated list AST to regular Haskell list.
+--
+-- Extracts the elements from a 'JSCommaList' structure, which represents
+-- comma-separated sequences in JavaScript syntax (function parameters,
+-- array elements, etc.).
+--
+-- ==== Examples
+--
+-- >>> fromCommaList (JSLOne element)
+-- [element]
+--
+-- >>> fromCommaList (JSLCons (JSLOne a) comma b)
+-- [a, b]
+--
+-- @since 0.7.1.0
fromCommaList :: JSCommaList a -> [a]
-fromCommaList (JSLCons l _ i) = fromCommaList l ++ [i]
-fromCommaList (JSLOne i) = [i]
+fromCommaList (JSLCons l _ i) = fromCommaList l <> [i]
+fromCommaList (JSLOne i) = [i]
fromCommaList JSLNil = []
+-- | Wrap ByteString in single quotes.
+--
+-- Utility function for pretty printing JavaScript string literals
+-- and identifiers that need to be quoted.
+--
+-- @since 0.7.1.0
singleQuote :: String -> String
-singleQuote s = '\'' : (s ++ "'")
-
+singleQuote s = "'" <> (s <> "'")
+
+-- | Extract String from JavaScript identifier with quotes.
+--
+-- Converts 'JSIdent' to its quoted String representation for pretty printing.
+-- Returns empty quotes for 'JSIdentNone'.
+--
+-- @since 0.7.1.0
ssid :: JSIdent -> String
ssid (JSIdentName _ s) = singleQuote s
ssid JSIdentNone = "''"
+-- | Add comma prefix to non-empty Strings.
+--
+-- Utility for conditional comma insertion in pretty printing.
+-- Returns empty String for empty input, comma-prefixed String otherwise.
+--
+-- @since 0.7.1.0
commaIf :: String -> String
-commaIf "" = ""
-commaIf xs = ',' : xs
-
-
+commaIf s
+ | null s = ""
+ | otherwise = "," <> s
+
+-- | Remove annotation from binary operator.
+--
+-- Strips position information from 'JSBinOp' by replacing all annotations
+-- with 'JSNoAnnot'. Used in testing and comparison operations where
+-- position information should be ignored.
+--
+-- @since 0.7.1.0
deAnnot :: JSBinOp -> JSBinOp
deAnnot (JSBinOpAnd _) = JSBinOpAnd JSNoAnnot
deAnnot (JSBinOpBitAnd _) = JSBinOpBitAnd JSNoAnnot
@@ -650,6 +939,7 @@ deAnnot (JSBinOpBitOr _) = JSBinOpBitOr JSNoAnnot
deAnnot (JSBinOpBitXor _) = JSBinOpBitXor JSNoAnnot
deAnnot (JSBinOpDivide _) = JSBinOpDivide JSNoAnnot
deAnnot (JSBinOpEq _) = JSBinOpEq JSNoAnnot
+deAnnot (JSBinOpExponentiation _) = JSBinOpExponentiation JSNoAnnot
deAnnot (JSBinOpGe _) = JSBinOpGe JSNoAnnot
deAnnot (JSBinOpGt _) = JSBinOpGt JSNoAnnot
deAnnot (JSBinOpIn _) = JSBinOpIn JSNoAnnot
@@ -662,6 +952,7 @@ deAnnot (JSBinOpMod _) = JSBinOpMod JSNoAnnot
deAnnot (JSBinOpNeq _) = JSBinOpNeq JSNoAnnot
deAnnot (JSBinOpOf _) = JSBinOpOf JSNoAnnot
deAnnot (JSBinOpOr _) = JSBinOpOr JSNoAnnot
+deAnnot (JSBinOpNullishCoalescing _) = JSBinOpNullishCoalescing JSNoAnnot
deAnnot (JSBinOpPlus _) = JSBinOpPlus JSNoAnnot
deAnnot (JSBinOpRsh _) = JSBinOpRsh JSNoAnnot
deAnnot (JSBinOpStrictEq _) = JSBinOpStrictEq JSNoAnnot
@@ -669,5 +960,120 @@ deAnnot (JSBinOpStrictNeq _) = JSBinOpStrictNeq JSNoAnnot
deAnnot (JSBinOpTimes _) = JSBinOpTimes JSNoAnnot
deAnnot (JSBinOpUrsh _) = JSBinOpUrsh JSNoAnnot
+-- | Compare binary operators ignoring annotations.
+--
+-- Tests equality of two 'JSBinOp' values while ignoring position information.
+-- Useful for testing and AST comparison where location data is irrelevant.
+--
+-- ==== Examples
+--
+-- >>> binOpEq (JSBinOpPlus pos1) (JSBinOpPlus pos2)
+-- True -- Same operator, different positions
+--
+-- >>> binOpEq (JSBinOpPlus pos1) (JSBinOpMinus pos2)
+-- False -- Different operators
+--
+-- @since 0.7.1.0
binOpEq :: JSBinOp -> JSBinOp -> Bool
binOpEq a b = deAnnot a == deAnnot b
+
+-- | JSDoc utility functions for AST integration
+
+-- | Extract JSDoc comment from JSAnnot annotation
+--
+-- Searches through the comment annotations in a JSAnnot to find
+-- JSDoc documentation. Returns the first JSDoc comment found.
+--
+-- ==== Examples
+--
+-- >>> extractJSDoc (JSAnnot pos [JSDocA pos jsDoc, CommentA pos "regular"])
+-- Just jsDoc
+--
+-- >>> extractJSDoc (JSAnnot pos [CommentA pos "regular"])
+-- Nothing
+--
+-- @since 0.8.0.0
+extractJSDoc :: JSAnnot -> Maybe JSDocComment
+extractJSDoc (JSAnnot _ comments) = findJSDoc comments
+ where
+ findJSDoc [] = Nothing
+ findJSDoc (JSDocA _ jsDoc : _) = Just jsDoc
+ findJSDoc (_ : rest) = findJSDoc rest
+extractJSDoc _ = Nothing
+
+-- | Extract JSDoc from any JavaScript statement that might have documentation
+--
+-- Looks for JSDoc comments in the leading annotation of various statement types.
+-- Useful for extracting function, class, or variable documentation.
+extractJSDocFromStatement :: JSStatement -> Maybe JSDocComment
+extractJSDocFromStatement stmt = case stmt of
+ JSFunction annot _ _ _ _ _ _ -> extractJSDoc annot
+ JSAsyncFunction annot _ _ _ _ _ _ _ -> extractJSDoc annot
+ JSGenerator annot _ _ _ _ _ _ _ -> extractJSDoc annot
+ JSClass annot _ _ _ _ _ _ -> extractJSDoc annot
+ JSVariable annot _ _ -> extractJSDoc annot
+ JSConstant annot _ _ -> extractJSDoc annot
+ JSLet annot _ _ -> extractJSDoc annot
+ _ -> Nothing
+
+-- | Extract JSDoc from JavaScript expressions that might have documentation
+--
+-- Looks for JSDoc comments in function expressions and class expressions.
+extractJSDocFromExpression :: JSExpression -> Maybe JSDocComment
+extractJSDocFromExpression expr = case expr of
+ JSFunctionExpression annot _ _ _ _ _ -> extractJSDoc annot
+ JSAsyncFunctionExpression annot _ _ _ _ _ _ -> extractJSDoc annot
+ JSGeneratorExpression annot _ _ _ _ _ _ -> extractJSDoc annot
+ JSClassExpression annot _ _ _ _ _ -> extractJSDoc annot
+ _ -> Nothing
+
+-- | Check if a JavaScript statement has JSDoc documentation
+hasJSDoc :: JSStatement -> Bool
+hasJSDoc = isJust . extractJSDocFromStatement
+ where
+ isJust Nothing = False
+ isJust (Just _) = True
+
+-- | Get function parameters from JSDoc @param tags
+--
+-- Extracts parameter names from JSDoc @param tags for validation
+-- against actual function parameters.
+getJSDocParams :: JSDocComment -> [Text.Text]
+getJSDocParams jsDoc =
+ [name | JSDocTag "param" _ (Just name) _ _ _ <- jsDocTags jsDoc]
+
+-- | Get return type from JSDoc @returns/@return tag
+--
+-- Extracts the return type from JSDoc documentation if present.
+getJSDocReturnType :: JSDocComment -> Maybe JSDocType
+getJSDocReturnType jsDoc =
+ case [jsDocType | JSDocTag tagName jsDocType _ _ _ _ <- jsDocTags jsDoc,
+ tagName `elem` ["returns", "return"],
+ isJust jsDocType] of
+ (Just returnType : _) -> Just returnType
+ _ -> Nothing
+ where
+ isJust Nothing = False
+ isJust (Just _) = True
+
+-- | Validate JSDoc parameter consistency with function signature
+--
+-- Compares JSDoc @param tags with actual function parameters to detect
+-- missing documentation or extra documented parameters.
+validateJSDocParameters :: JSDocComment -> [String] -> [String]
+validateJSDocParameters jsDoc functionParams =
+ let jsDocParams = map Text.unpack (getJSDocParams jsDoc)
+ missingDocs = filter (`notElem` jsDocParams) functionParams
+ extraDocs = filter (`notElem` functionParams) jsDocParams
+ in map ("Missing JSDoc for parameter: " ++) missingDocs ++
+ map ("Extra JSDoc parameter: " ++) extraDocs
+
+-- | Check if JSDoc comment has a specific tag
+hasJSDocTag :: Text.Text -> JSDocComment -> Bool
+hasJSDocTag tagName jsDoc =
+ any (\tag -> jsDocTagName tag == tagName) (jsDocTags jsDoc)
+
+-- | Get all JSDoc tags of a specific type
+getJSDocTagsByName :: Text.Text -> JSDocComment -> [JSDocTag]
+getJSDocTagsByName tagName jsDoc =
+ filter (\tag -> jsDocTagName tag == tagName) (jsDocTags jsDoc)
diff --git a/src/Language/JavaScript/Parser/Grammar7.y b/src/Language/JavaScript/Parser/Grammar7.y
index 13a15269..60637524 100644
--- a/src/Language/JavaScript/Parser/Grammar7.y
+++ b/src/Language/JavaScript/Parser/Grammar7.y
@@ -39,6 +39,8 @@ import qualified Language.JavaScript.Parser.AST as AST
':' { ColonToken {} }
'||' { OrToken {} }
'&&' { AndToken {} }
+ '??' { NullishCoalescingToken {} }
+ '?.' { OptionalChainingToken {} }
'|' { BitwiseOrToken {} }
'^' { BitwiseXorToken {} }
'&' { BitwiseAndToken {} }
@@ -56,6 +58,9 @@ import qualified Language.JavaScript.Parser.AST as AST
'&=' { AndAssignToken {} }
'^=' { XorAssignToken {} }
'|=' { OrAssignToken {} }
+ '&&=' { LogicalAndAssignToken {} }
+ '||=' { LogicalOrAssignToken {} }
+ '??=' { NullishAssignToken {} }
'=' { SimpleAssignToken {} }
'!==' { StrictNeToken {} }
'!=' { NeToken {} }
@@ -70,6 +75,7 @@ import qualified Language.JavaScript.Parser.AST as AST
'--' { DecrementToken {} }
'+' { PlusToken {} }
'-' { MinusToken {} }
+ '**' { ExponentiationToken {} }
'*' { MulToken {} }
'/' { DivToken {} }
'%' { ModToken {} }
@@ -134,9 +140,12 @@ import qualified Language.JavaScript.Parser.AST as AST
'ident' { IdentifierToken {} }
+ 'private' { PrivateNameToken {} }
'decimal' { DecimalToken {} }
'hexinteger' { HexIntegerToken {} }
+ 'binaryinteger' { BinaryIntegerToken {} }
'octal' { OctalToken {} }
+ 'bigint' { BigIntToken {} }
'string' { StringToken {} }
'regex' { RegExToken {} }
'tmplnosub' { NoSubstitutionTemplateToken {} }
@@ -206,6 +215,10 @@ Spread : '...' { mkJSAnnot $1 }
Dot :: { AST.JSAnnot }
Dot : '.' { mkJSAnnot $1 }
+OptionalChaining :: { AST.JSAnnot }
+OptionalChaining : '?.' { mkJSAnnot $1 }
+
+
As :: { AST.JSAnnot }
As : 'as' { mkJSAnnot $1 }
@@ -239,6 +252,9 @@ Not : '!' { AST.JSUnaryOpNot (mkJSAnnot $1) }
Mul :: { AST.JSBinOp }
Mul : '*' { AST.JSBinOpTimes (mkJSAnnot $1) }
+Exp :: { AST.JSBinOp }
+Exp : '**' { AST.JSBinOpExponentiation (mkJSAnnot $1) }
+
Div :: { AST.JSBinOp }
Div : '/' { AST.JSBinOpDivide (mkJSAnnot $1) }
@@ -293,6 +309,9 @@ Or : '||' { AST.JSBinOpOr (mkJSAnnot $1) }
And :: { AST.JSBinOp }
And : '&&' { AST.JSBinOpAnd (mkJSAnnot $1) }
+NullishCoalescing :: { AST.JSBinOp }
+NullishCoalescing : '??' { AST.JSBinOpNullishCoalescing (mkJSAnnot $1) }
+
BitOr :: { AST.JSBinOp }
BitOr : '|' { AST.JSBinOpBitOr (mkJSAnnot $1) }
@@ -320,6 +339,9 @@ OpAssign : '*=' { AST.JSTimesAssign (mkJSAnnot $1) }
| '&=' { AST.JSBwAndAssign (mkJSAnnot $1) }
| '^=' { AST.JSBwXorAssign (mkJSAnnot $1) }
| '|=' { AST.JSBwOrAssign (mkJSAnnot $1) }
+ | '&&=' { AST.JSLogicalAndAssign (mkJSAnnot $1) }
+ | '||=' { AST.JSLogicalOrAssign (mkJSAnnot $1) }
+ | '??=' { AST.JSNullishAssign (mkJSAnnot $1) }
-- IdentifierName :: See 7.6
-- IdentifierStart
@@ -333,46 +355,46 @@ OpAssign : '*=' { AST.JSTimesAssign (mkJSAnnot $1) }
-- TODO: make this include any reserved word too, including future ones
IdentifierName :: { AST.JSExpression }
IdentifierName : Identifier {$1}
- | 'async' { AST.JSIdentifier (mkJSAnnot $1) "async" }
- | 'await' { AST.JSIdentifier (mkJSAnnot $1) "await" }
- | 'break' { AST.JSIdentifier (mkJSAnnot $1) "break" }
- | 'case' { AST.JSIdentifier (mkJSAnnot $1) "case" }
- | 'catch' { AST.JSIdentifier (mkJSAnnot $1) "catch" }
- | 'class' { AST.JSIdentifier (mkJSAnnot $1) "class" }
- | 'const' { AST.JSIdentifier (mkJSAnnot $1) "const" }
- | 'continue' { AST.JSIdentifier (mkJSAnnot $1) "continue" }
- | 'debugger' { AST.JSIdentifier (mkJSAnnot $1) "debugger" }
- | 'default' { AST.JSIdentifier (mkJSAnnot $1) "default" }
- | 'delete' { AST.JSIdentifier (mkJSAnnot $1) "delete" }
- | 'do' { AST.JSIdentifier (mkJSAnnot $1) "do" }
- | 'else' { AST.JSIdentifier (mkJSAnnot $1) "else" }
- | 'enum' { AST.JSIdentifier (mkJSAnnot $1) "enum" }
- | 'export' { AST.JSIdentifier (mkJSAnnot $1) "export" }
- | 'extends' { AST.JSIdentifier (mkJSAnnot $1) "extends" }
- | 'false' { AST.JSIdentifier (mkJSAnnot $1) "false" }
- | 'finally' { AST.JSIdentifier (mkJSAnnot $1) "finally" }
- | 'for' { AST.JSIdentifier (mkJSAnnot $1) "for" }
- | 'function' { AST.JSIdentifier (mkJSAnnot $1) "function" }
- | 'if' { AST.JSIdentifier (mkJSAnnot $1) "if" }
- | 'in' { AST.JSIdentifier (mkJSAnnot $1) "in" }
- | 'instanceof' { AST.JSIdentifier (mkJSAnnot $1) "instanceof" }
- | 'let' { AST.JSIdentifier (mkJSAnnot $1) "let" }
- | 'new' { AST.JSIdentifier (mkJSAnnot $1) "new" }
- | 'null' { AST.JSIdentifier (mkJSAnnot $1) "null" }
- | 'of' { AST.JSIdentifier (mkJSAnnot $1) "of" }
- | 'return' { AST.JSIdentifier (mkJSAnnot $1) "return" }
- | 'static' { AST.JSIdentifier (mkJSAnnot $1) "static" }
- | 'super' { AST.JSIdentifier (mkJSAnnot $1) "super" }
- | 'switch' { AST.JSIdentifier (mkJSAnnot $1) "switch" }
- | 'this' { AST.JSIdentifier (mkJSAnnot $1) "this" }
- | 'throw' { AST.JSIdentifier (mkJSAnnot $1) "throw" }
- | 'true' { AST.JSIdentifier (mkJSAnnot $1) "true" }
- | 'try' { AST.JSIdentifier (mkJSAnnot $1) "try" }
- | 'typeof' { AST.JSIdentifier (mkJSAnnot $1) "typeof" }
- | 'var' { AST.JSIdentifier (mkJSAnnot $1) "var" }
- | 'void' { AST.JSIdentifier (mkJSAnnot $1) "void" }
- | 'while' { AST.JSIdentifier (mkJSAnnot $1) "while" }
- | 'with' { AST.JSIdentifier (mkJSAnnot $1) "with" }
+ | 'async' { AST.JSIdentifier (mkJSAnnot $1) ("async") }
+ | 'await' { AST.JSIdentifier (mkJSAnnot $1) ("await") }
+ | 'break' { AST.JSIdentifier (mkJSAnnot $1) ("break") }
+ | 'case' { AST.JSIdentifier (mkJSAnnot $1) ("case") }
+ | 'catch' { AST.JSIdentifier (mkJSAnnot $1) ("catch") }
+ | 'class' { AST.JSIdentifier (mkJSAnnot $1) ("class") }
+ | 'const' { AST.JSIdentifier (mkJSAnnot $1) ("const") }
+ | 'continue' { AST.JSIdentifier (mkJSAnnot $1) ("continue") }
+ | 'debugger' { AST.JSIdentifier (mkJSAnnot $1) ("debugger") }
+ | 'default' { AST.JSIdentifier (mkJSAnnot $1) ("default") }
+ | 'delete' { AST.JSIdentifier (mkJSAnnot $1) ("delete") }
+ | 'do' { AST.JSIdentifier (mkJSAnnot $1) ("do") }
+ | 'else' { AST.JSIdentifier (mkJSAnnot $1) ("else") }
+ | 'enum' { AST.JSIdentifier (mkJSAnnot $1) ("enum") }
+ | 'export' { AST.JSIdentifier (mkJSAnnot $1) ("export") }
+ | 'extends' { AST.JSIdentifier (mkJSAnnot $1) ("extends") }
+ | 'false' { AST.JSIdentifier (mkJSAnnot $1) ("false") }
+ | 'finally' { AST.JSIdentifier (mkJSAnnot $1) ("finally") }
+ | 'for' { AST.JSIdentifier (mkJSAnnot $1) ("for") }
+ | 'function' { AST.JSIdentifier (mkJSAnnot $1) ("function") }
+ | 'if' { AST.JSIdentifier (mkJSAnnot $1) ("if") }
+ | 'in' { AST.JSIdentifier (mkJSAnnot $1) ("in") }
+ | 'instanceof' { AST.JSIdentifier (mkJSAnnot $1) ("instanceof") }
+ | 'let' { AST.JSIdentifier (mkJSAnnot $1) ("let") }
+ | 'new' { AST.JSIdentifier (mkJSAnnot $1) ("new") }
+ | 'null' { AST.JSIdentifier (mkJSAnnot $1) ("null") }
+ | 'of' { AST.JSIdentifier (mkJSAnnot $1) ("of") }
+ | 'return' { AST.JSIdentifier (mkJSAnnot $1) ("return") }
+ | 'static' { AST.JSIdentifier (mkJSAnnot $1) ("static") }
+ | 'super' { AST.JSIdentifier (mkJSAnnot $1) ("super") }
+ | 'switch' { AST.JSIdentifier (mkJSAnnot $1) ("switch") }
+ | 'this' { AST.JSIdentifier (mkJSAnnot $1) ("this") }
+ | 'throw' { AST.JSIdentifier (mkJSAnnot $1) ("throw") }
+ | 'true' { AST.JSIdentifier (mkJSAnnot $1) ("true") }
+ | 'try' { AST.JSIdentifier (mkJSAnnot $1) ("try") }
+ | 'typeof' { AST.JSIdentifier (mkJSAnnot $1) ("typeof") }
+ | 'var' { AST.JSIdentifier (mkJSAnnot $1) ("var") }
+ | 'void' { AST.JSIdentifier (mkJSAnnot $1) ("void") }
+ | 'while' { AST.JSIdentifier (mkJSAnnot $1) ("while") }
+ | 'with' { AST.JSIdentifier (mkJSAnnot $1) ("with") }
| 'future' { AST.JSIdentifier (mkJSAnnot $1) (tokenLiteral $1) }
Var :: { AST.JSAnnot }
@@ -463,7 +485,7 @@ Static :: { AST.JSAnnot }
Static : 'static' { mkJSAnnot $1 }
Super :: { AST.JSExpression }
-Super : 'super' { AST.JSLiteral (mkJSAnnot $1) "super" }
+Super : 'super' { AST.JSLiteral (mkJSAnnot $1) ("super") }
Eof :: { AST.JSAnnot }
@@ -482,11 +504,11 @@ Literal : NullLiteral { $1 }
| RegularExpressionLiteral { $1 }
NullLiteral :: { AST.JSExpression }
-NullLiteral : 'null' { AST.JSLiteral (mkJSAnnot $1) "null" }
+NullLiteral : 'null' { AST.JSLiteral (mkJSAnnot $1) ("null") }
BooleanLiteral :: { AST.JSExpression }
-BooleanLiteral : 'true' { AST.JSLiteral (mkJSAnnot $1) "true" }
- | 'false' { AST.JSLiteral (mkJSAnnot $1) "false" }
+BooleanLiteral : 'true' { AST.JSLiteral (mkJSAnnot $1) ("true") }
+ | 'false' { AST.JSLiteral (mkJSAnnot $1) ("false") }
--