diff --git a/parser/src/AST/Expression.hs b/parser/src/AST/Expression.hs index 6d6816f36..d91e95210 100644 --- a/parser/src/AST/Expression.hs +++ b/parser/src/AST/Expression.hs @@ -59,7 +59,7 @@ data Expr' | AccessFunction LowercaseIdentifier | Lambda [(Comments, Pattern.Pattern)] Comments Expr Bool - | If IfClause [(Comments, IfClause)] (Comments, Expr) + | If IfClause [(Comments, IfClause)] (Comments, Expr) Bool | Let [LetDeclaration] Comments Expr | Case (Commented Expr, Bool) [(Commented Pattern.Pattern, (Comments, Expr))] diff --git a/parser/src/AST/Json.hs b/parser/src/AST/Json.hs index 079cb473c..da9fde759 100644 --- a/parser/src/AST/Json.hs +++ b/parser/src/AST/Json.hs @@ -373,7 +373,7 @@ instance ToJSON Expr where , ("body", showJSON body) ] - If (Commented _ cond' _, Commented _ thenBody' _) rest' (_, elseBody) -> + If (Commented _ cond' _, Commented _ thenBody' _) rest' (_, elseBody) _ -> let ifThenElse :: Expr -> Expr -> [(Comments, IfClause)] -> JSValue ifThenElse cond thenBody rest = diff --git a/parser/src/Parse/Expression.hs b/parser/src/Parse/Expression.hs index 6df39a3e5..0bde1c877 100644 --- a/parser/src/Parse/Expression.hs +++ b/parser/src/Parse/Expression.hs @@ -191,11 +191,18 @@ ifExpr elmVersion = >> whitespace in do - first <- ifClause elmVersion - rest <- many (try $ (,) <$> elseKeyword <*> ifClause elmVersion) - final <- (,) <$> elseKeyword <*> expr elmVersion + (first, firstMultiline) <- trackNewline $ ifClause elmVersion + (rest, restMultiline) <- trackNewline $ many (try $ (,) <$> elseKeyword <*> ifClause elmVersion) + (final, finalMultiline) <- trackNewline $ (,) <$> elseKeyword <*> expr elmVersion - return $ E.If first rest final + + return $ E.If first rest final $ + case (firstMultiline, restMultiline, finalMultiline) of + (JoinAll, JoinAll, JoinAll) -> + multilineToBool JoinAll + + _ -> + multilineToBool SplitAll ifClause :: ElmVersion -> IParser E.IfClause diff --git a/src/AST/MapExpr.hs b/src/AST/MapExpr.hs index d6035ea0c..6a9cce143 100644 --- a/src/AST/MapExpr.hs +++ b/src/AST/MapExpr.hs @@ -81,8 +81,8 @@ instance MapExpr Expr' where AccessFunction _ -> expr Lambda params pre body multi -> Lambda params pre (mapExpr f body) multi - If c1 elseIfs els -> - If (mapExpr f c1) (mapExpr f elseIfs) (mapExpr f els) + If c1 elseIfs els multiline -> + If (mapExpr f c1) (mapExpr f elseIfs) (mapExpr f els) multiline Let decls pre body -> Let (mapExpr f decls) pre body Case cond branches -> diff --git a/src/ElmFormat/Render/Box.hs b/src/ElmFormat/Render/Box.hs index ab0d96660..c3bfe1b84 100644 --- a/src/ElmFormat/Render/Box.hs +++ b/src/ElmFormat/Render/Box.hs @@ -1407,57 +1407,59 @@ formatExpression' elmVersion importInfo context aexpr = (fmap (formatPreCommentedExpression elmVersion importInfo SpaceSeparated) args) |> expressionParens SpaceSeparated context - AST.Expression.If if' elseifs (elsComments, els) -> - let - opening key cond = - case (key, cond) of - (SingleLine key', SingleLine cond') -> - line $ row - [ key' - , space - , cond' - , space - , keyword "then" - ] - _ -> + AST.Expression.If (cond, body) elseifs (elsComments, els) multiline -> + case + ( multiline + , formatCommentedExpression elmVersion importInfo SyntaxSeparated cond + , formatCommented_ True (formatExpression elmVersion importInfo SyntaxSeparated) body + , elseifs + , formatCommented_ True (formatExpression elmVersion importInfo SyntaxSeparated) (AST.Commented elsComments els []) + ) + of + (False, SingleLine cond', SingleLine body', [], SingleLine els') -> + line $ row + [ keyword "if" , space , cond' , space , keyword "then" , space , body' , space , keyword "else" , space , els' ] + (_, ifCond, thenBody, _, elseBody) -> + let + opening (SingleLine key) (SingleLine cond') = + line $ row [ key , space , cond' , space , keyword "then" ] + opening key cond' = stack1 [ key - , cond |> indent + , cond' |> indent , line $ keyword "then" ] - formatIf (cond, body) = + formatElseIf (ifComments, (cond', body')) = + let + key = + case (formatHeadCommented id (ifComments, line $ keyword "if")) of + SingleLine key' -> + line $ row [ keyword "else", space, key' ] + key' -> + stack1 + [ line $ keyword "else" + , key' + ] + in + stack1 + [ blankLine + , opening key $ formatCommentedExpression elmVersion importInfo SyntaxSeparated cond' + , indent $ formatCommented_ True (formatExpression elmVersion importInfo SyntaxSeparated) body' + ] + in stack1 - [ opening (line $ keyword "if") $ formatCommentedExpression elmVersion importInfo SyntaxSeparated cond - , indent $ formatCommented_ True (formatExpression elmVersion importInfo SyntaxSeparated) body + [ opening (line $ keyword "if") ifCond + , indent thenBody ] - - formatElseIf (ifComments, (cond, body)) = - let - key = - case (formatHeadCommented id (ifComments, line $ keyword "if")) of - SingleLine key' -> - line $ row [ keyword "else", space, key' ] - key' -> - stack1 - [ line $ keyword "else" - , key' + |> andThen (map formatElseIf elseifs) + |> andThen + [ blankLine + , line $ keyword "else" + , indent $ elseBody ] - in - stack1 - [ blankLine - , opening key $ formatCommentedExpression elmVersion importInfo SyntaxSeparated cond - , indent $ formatCommented_ True (formatExpression elmVersion importInfo SyntaxSeparated) body - ] - in - formatIf if' - |> andThen (map formatElseIf elseifs) - |> andThen - [ blankLine - , line $ keyword "else" - , indent $ formatCommented_ True (formatExpression elmVersion importInfo SyntaxSeparated) (AST.Commented elsComments els []) - ] - |> expressionParens AmbiguousEnd context + |> expressionParens AmbiguousEnd context + AST.Expression.Let defs bodyComments expr -> let diff --git a/tests/Parse/ExpressionTest.hs b/tests/Parse/ExpressionTest.hs index 0d91dbe63..39523c9b7 100644 --- a/tests/Parse/ExpressionTest.hs +++ b/tests/Parse/ExpressionTest.hs @@ -259,10 +259,10 @@ tests = ] , testGroup "if statement" - [ example "" "if x then y else z" $ at 1 1 1 19 (If (Commented [] (at 1 4 1 5 (VarExpr (VarRef [] $ LowercaseIdentifier "x"))) [],Commented [] (at 1 11 1 12 (VarExpr (VarRef [] $ LowercaseIdentifier "y"))) []) [] ([],at 1 18 1 19 (VarExpr (VarRef [] $ LowercaseIdentifier "z")))) - , example "comments" "if{-A-}x{-B-}then{-C-}y{-D-}else{-E-}if{-F-}x_{-G-}then{-H-}y_{-I-}else{-J-}z" $ at 1 1 1 78 (If (Commented [BlockComment ["A"]] (at 1 8 1 9 (VarExpr (VarRef [] $ LowercaseIdentifier "x"))) [BlockComment ["B"]],Commented [BlockComment ["C"]] (at 1 23 1 24 (VarExpr (VarRef [] $ LowercaseIdentifier "y"))) [BlockComment ["D"]]) [([BlockComment ["E"]],(Commented [BlockComment ["F"]] (at 1 45 1 47 (VarExpr (VarRef [] $ LowercaseIdentifier "x_"))) [BlockComment ["G"]],Commented [BlockComment ["H"]] (at 1 61 1 63 (VarExpr (VarRef [] $ LowercaseIdentifier "y_"))) [BlockComment ["I"]]))] ([BlockComment ["J"]],at 1 77 1 78 (VarExpr (VarRef [] $ LowercaseIdentifier "z")))) - , example "else if" "if x1 then y1 else if x2 then y2 else if x3 then y3 else z" $ at 1 1 1 59 (If (Commented [] (at 1 4 1 6 (VarExpr (VarRef [] $ LowercaseIdentifier "x1"))) [],Commented [] (at 1 12 1 14 (VarExpr (VarRef [] $ LowercaseIdentifier "y1"))) []) [([],(Commented [] (at 1 23 1 25 (VarExpr (VarRef [] $ LowercaseIdentifier "x2"))) [],Commented [] (at 1 31 1 33 (VarExpr (VarRef [] $ LowercaseIdentifier "y2"))) [])),([],(Commented [] (at 1 42 1 44 (VarExpr (VarRef [] $ LowercaseIdentifier "x3"))) [],Commented [] (at 1 50 1 52 (VarExpr (VarRef [] $ LowercaseIdentifier "y3"))) []))] ([],at 1 58 1 59 (VarExpr (VarRef [] $ LowercaseIdentifier "z")))) - , example "newlines" "if\n x\n then\n y\n else\n z" $ at 1 1 6 3 (If (Commented [] (at 2 2 2 3 (VarExpr (VarRef [] $ LowercaseIdentifier "x"))) [],Commented [] (at 4 2 4 3 (VarExpr (VarRef [] $ LowercaseIdentifier "y"))) []) [] ([],at 6 2 6 3 (VarExpr (VarRef [] $ LowercaseIdentifier "z")))) + [ example "" "if x then y else z" $ at 1 1 1 19 (If (Commented [] (at 1 4 1 5 (VarExpr (VarRef [] $ LowercaseIdentifier "x"))) [],Commented [] (at 1 11 1 12 (VarExpr (VarRef [] $ LowercaseIdentifier "y"))) []) [] ([],at 1 18 1 19 (VarExpr (VarRef [] $ LowercaseIdentifier "z"))) False) + , example "comments" "if{-A-}x{-B-}then{-C-}y{-D-}else{-E-}if{-F-}x_{-G-}then{-H-}y_{-I-}else{-J-}z" $ at 1 1 1 78 (If (Commented [BlockComment ["A"]] (at 1 8 1 9 (VarExpr (VarRef [] $ LowercaseIdentifier "x"))) [BlockComment ["B"]],Commented [BlockComment ["C"]] (at 1 23 1 24 (VarExpr (VarRef [] $ LowercaseIdentifier "y"))) [BlockComment ["D"]]) [([BlockComment ["E"]],(Commented [BlockComment ["F"]] (at 1 45 1 47 (VarExpr (VarRef [] $ LowercaseIdentifier "x_"))) [BlockComment ["G"]],Commented [BlockComment ["H"]] (at 1 61 1 63 (VarExpr (VarRef [] $ LowercaseIdentifier "y_"))) [BlockComment ["I"]]))] ([BlockComment ["J"]],at 1 77 1 78 (VarExpr (VarRef [] $ LowercaseIdentifier "z"))) False) + , example "else if" "if x1 then y1 else if x2 then y2 else if x3 then y3 else z" $ at 1 1 1 59 (If (Commented [] (at 1 4 1 6 (VarExpr (VarRef [] $ LowercaseIdentifier "x1"))) [],Commented [] (at 1 12 1 14 (VarExpr (VarRef [] $ LowercaseIdentifier "y1"))) []) [([],(Commented [] (at 1 23 1 25 (VarExpr (VarRef [] $ LowercaseIdentifier "x2"))) [],Commented [] (at 1 31 1 33 (VarExpr (VarRef [] $ LowercaseIdentifier "y2"))) [])),([],(Commented [] (at 1 42 1 44 (VarExpr (VarRef [] $ LowercaseIdentifier "x3"))) [],Commented [] (at 1 50 1 52 (VarExpr (VarRef [] $ LowercaseIdentifier "y3"))) []))] ([],at 1 58 1 59 (VarExpr (VarRef [] $ LowercaseIdentifier "z"))) False) + , example "newlines" "if\n x\n then\n y\n else\n z" $ at 1 1 6 3 (If (Commented [] (at 2 2 2 3 (VarExpr (VarRef [] $ LowercaseIdentifier "x"))) [],Commented [] (at 4 2 4 3 (VarExpr (VarRef [] $ LowercaseIdentifier "y"))) []) [] ([],at 6 2 6 3 (VarExpr (VarRef [] $ LowercaseIdentifier "z"))) True) ] , testGroup "let statement" diff --git a/tests/test-files/transform/Elm-0.18/Examples.formatted.elm b/tests/test-files/transform/Elm-0.18/Examples.formatted.elm index dbafc1d62..e304fb527 100644 --- a/tests/test-files/transform/Elm-0.18/Examples.formatted.elm +++ b/tests/test-files/transform/Elm-0.18/Examples.formatted.elm @@ -2,13 +2,7 @@ module Main exposing (bar, multilineList, ratio) ratio = - graphHeight - / (if range == 0 then - 0.1 - - else - toFloat range - ) + graphHeight / (if range == 0 then 0.1 else toFloat range) @@ -16,17 +10,7 @@ ratio = bar = - if - if a then - True - - else - False - then - "a" - - else - "b" + if if a then True else False then "a" else "b" multilineList =