diff --git a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs index 8fb8a4c5b1..8ddd12dc16 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs @@ -686,12 +686,33 @@ namespace ICSharpCode.VBNetBinding } } - // do not indent if current token is start of lambda - // only works with single-line lambdas + // check if it is a lambda if (current.Kind == Tokens.Function || current.Kind == Tokens.Sub) { lexer.StartPeek(); - if (lexer.Peek().Kind == Tokens.OpenParenthesis) + bool isSingleLineLambda = false; + + if (lexer.Peek().Kind == Tokens.OpenParenthesis) { + isSingleLineLambda = true; + + int brackets = 1; + + // look for end of parameter list + while (brackets > 0) { + var t = lexer.Peek(); + if (t.Kind == Tokens.OpenParenthesis) + brackets++; + if (t.Kind == Tokens.CloseParenthesis) + brackets--; + } + + // expression is multiline lambda if next Token is EOL + if (brackets == 0) + return lexer.Peek().Kind == Tokens.EOL; + } + + // do not indent if current token is start ofsingleline lambda + if (isSingleLineLambda) return false; } diff --git a/src/AddIns/BackendBindings/VBNetBinding/Test/FormattingStrategy/IndentationTests.cs b/src/AddIns/BackendBindings/VBNetBinding/Test/FormattingStrategy/IndentationTests.cs index 0690880af5..260067b1e1 100644 --- a/src/AddIns/BackendBindings/VBNetBinding/Test/FormattingStrategy/IndentationTests.cs +++ b/src/AddIns/BackendBindings/VBNetBinding/Test/FormattingStrategy/IndentationTests.cs @@ -404,6 +404,54 @@ End Class"; RunFormatTest(code, expected); } + [Test] + public void FunctionLambda() + { + string expected = @"Public Class Test + Private Sub Tester() + Dim increment1 = Function(x) x + 1 + Dim increment2 = Function(x) + Return x + 2 + End Function + End Sub +End Class"; + + string code = @"Public Class Test +Private Sub Tester() +Dim increment1 = Function(x) x + 1 +Dim increment2 = Function(x) +Return x + 2 +End Function +End Sub +End Class"; + + RunFormatTest(code, expected); + } + + [Test] + public void SubLambda() + { + string expected = @"Public Class Test + Private Sub Tester() + Dim writeline1 = Sub(x) Console.WriteLine(x) + Dim writeline2 = Sub(x) + Console.WriteLine(x) + End Sub + End Sub +End Class"; + + string code = @"Public Class Test +Private Sub Tester() +Dim writeline1 = Sub(x) Console.WriteLine(x) +Dim writeline2 = Sub(x) +Console.WriteLine(x) +End Sub +End Sub +End Class"; + + RunFormatTest(code, expected); + } + void RunFormatTest(string code, string expectedCode) { AvalonEditTextEditorAdapter editor = new AvalonEditTextEditorAdapter(new TextEditor());