Handle -> operator

Never break after `->` in statement-bodied lambda expressions, and indent them
correctly.

Fixes #2
-------------
Created by MOE: http://code.google.com/p/moe-java
MOE_MIGRATED_REVID=100067466
diff --git a/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java b/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java
index e00a0f1..2a1183e 100644
--- a/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java
+++ b/core/src/main/java/com/google/googlejavaformat/java/JavaInputAstVisitor.java
@@ -1093,7 +1093,7 @@
   public boolean visit(Initializer node) {
     sync(node);
     visitAndBreakModifiers(node.modifiers(), Direction.VERTICAL);
-    visit(node.getBody());
+    node.getBody().accept(this);
     builder.guessToken(";");
     return false;
   }
@@ -1152,7 +1152,8 @@
   @Override
   public boolean visit(LambdaExpression node) {
     sync(node);
-    builder.open(plusFour);
+    boolean statementBody = node.getBody().getNodeType() == ASTNode.BLOCK;
+    builder.open(statementBody ? ZERO : plusFour);
     builder.open(plusFour);
     if (node.hasParentheses()) {
       token("(");
@@ -1163,29 +1164,21 @@
         token(",");
         builder.breakOp(" ");
       }
-      if (parameter.getNodeType() == ASTNode.SINGLE_VARIABLE_DECLARATION) {
-        visit((SingleVariableDeclaration) parameter);
-      } else if (parameter.getNodeType() == ASTNode.VARIABLE_DECLARATION_FRAGMENT) {
-        visit((VariableDeclarationFragment) parameter);
-      } else {
-        token("<<<PARAMETER>>>");
-      }
+      parameter.accept(this);;
       first = false;
     }
     if (node.hasParentheses()) {
       token(")");
     }
     builder.close();
-    builder.breakOp(" ");
+    if (statementBody) {
+      builder.space();
+    } else {
+      builder.breakOp(" ");
+    }
     builder.op("->");
     builder.space();
-    if (node.getBody().getNodeType() == ASTNode.BLOCK) {
-      visit((Block) node.getBody());
-    } else if (node.getBody() instanceof Expression) {
-      node.getBody().accept(this);
-    } else {
-      token("<<<BODY>>>");
-    }
+    node.getBody().accept(this);
     builder.close();
     return false;
   }
@@ -1745,7 +1738,7 @@
     builder.close();
     token(")");
     builder.space();
-    visit(node.getBody());
+    node.getBody().accept(this);
     return false;
   }
 
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B22873322.input b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B22873322.input
new file mode 100644
index 0000000..48984c4
--- /dev/null
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B22873322.input
@@ -0,0 +1,14 @@
+class B22873322 {
+  {
+    f(param -> veryLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongExpr(param));
+    f((param1, param2) -> veryLooooooooooooooooooooooooooooooooooooooooooooooooongExpr(param1, param2));
+    f((int param) -> veryLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongExpr(param));
+    f((param1, param2) -> { 
+      return expr(param1, param2);
+    });
+    f((param1, param2) -> { 
+      Object foo = expr(param1, param2);
+      return foo;
+    });
+  }
+}
diff --git a/core/src/test/resources/com/google/googlejavaformat/java/testdata/B22873322.output b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B22873322.output
new file mode 100644
index 0000000..8bf4cd6
--- /dev/null
+++ b/core/src/test/resources/com/google/googlejavaformat/java/testdata/B22873322.output
@@ -0,0 +1,23 @@
+class B22873322 {
+  {
+    f(
+        param
+            -> veryLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongExpr(
+                param));
+    f(
+        (param1, param2)
+            -> veryLooooooooooooooooooooooooooooooooooooooooooooooooongExpr(param1, param2));
+    f(
+        (int param)
+            -> veryLooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooongExpr(param));
+    f(
+        (param1, param2) -> {
+          return expr(param1, param2);
+        });
+    f(
+        (param1, param2) -> {
+          Object foo = expr(param1, param2);
+          return foo;
+        });
+  }
+}