Browse Source

properly indent multi-line lambdas

4.0
Siegfried Pammer 15 years ago
parent
commit
16f70ae438
  1. 27
      src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs
  2. 48
      src/AddIns/BackendBindings/VBNetBinding/Test/FormattingStrategy/IndentationTests.cs

27
src/AddIns/BackendBindings/VBNetBinding/Project/Src/FormattingStrategy/VBNetFormattingStrategy.cs

@ -686,12 +686,33 @@ namespace ICSharpCode.VBNetBinding @@ -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;
}

48
src/AddIns/BackendBindings/VBNetBinding/Test/FormattingStrategy/IndentationTests.cs

@ -404,6 +404,54 @@ End Class"; @@ -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());

Loading…
Cancel
Save