Browse Source

Added method call wrapping options.

newNRvisualizers
Mike Krüger 13 years ago
parent
commit
debc7a0801
  1. 123
      ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs
  2. 15
      ICSharpCode.NRefactory.CSharp/Formatter/CSharpFormattingOptions.cs
  3. 10
      ICSharpCode.NRefactory.CSharp/Formatter/FormattingOptionsFactory.cs
  4. 14
      ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs
  5. 141
      ICSharpCode.NRefactory.Tests/FormattingTests/TestWrapping.cs

123
ICSharpCode.NRefactory.CSharp/Formatter/AstFormattingVisitor.cs

@ -1611,39 +1611,96 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1611,39 +1611,96 @@ namespace ICSharpCode.NRefactory.CSharp
ForceSpacesBefore(invocationExpression.LParToken, policy.SpaceBeforeMethodCallParentheses);
if (invocationExpression.Arguments.Any()) {
ForceSpacesAfter(invocationExpression.LParToken, policy.SpaceWithinMethodCallParentheses);
ForceSpacesBefore(invocationExpression.RParToken, policy.SpaceWithinMethodCallParentheses);
} else {
ForceSpacesAfter(invocationExpression.LParToken, policy.SpaceBetweenEmptyMethodCallParentheses);
ForceSpacesBefore(invocationExpression.RParToken, policy.SpaceBetweenEmptyMethodCallParentheses);
}
FormatCommas(invocationExpression, policy.SpaceBeforeMethodCallParameterComma, policy.SpaceAfterMethodCallParameterComma);
if (invocationExpression.Target is MemberReferenceExpression) {
var mt = (MemberReferenceExpression)invocationExpression.Target;
if (mt.Target is InvocationExpression) {
if (policy.ChainedMethodCallWrapping == Wrapping.DoNotWrap) {
ForceSpacesBeforeRemoveNewLines(mt.DotToken, false);
} else if (DoWrap(policy.ChainedMethodCallWrapping, mt.DotToken)) {
if (DoWrap(policy.ChainedMethodCallWrapping, mt.DotToken)) {
curIndent.Push(IndentType.Continuation);
FixStatementIndentation(mt.DotToken.StartLocation);
curIndent.Pop();
} else {
ForceSpacesBeforeRemoveNewLines(mt.DotToken, false);
}
}
}
bool wrapMethodCall = DoWrap(policy.MethodCallArgumentWrapping, invocationExpression.RParToken);
if (wrapMethodCall && invocationExpression.Arguments.Any()) {
if (policy.NewLineAferMethodCallOpenParentheses) {
curIndent.Push(IndentType.Continuation);
foreach (var arg in invocationExpression.Arguments) {
FixStatementIndentation(arg.StartLocation);
}
curIndent.Pop();
} else {
int extraSpaces = invocationExpression.Arguments.First().StartLocation.Column - 1 - curIndent.IndentString.Length;
curIndent.ExtraSpaces += extraSpaces;
foreach (var arg in invocationExpression.Arguments.Skip (1)) {
FixStatementIndentation(arg.StartLocation);
}
curIndent.ExtraSpaces -= extraSpaces;
}
if (policy.MethodClosingParenthesesOnNewLine)
FixStatementIndentation(invocationExpression.RParToken.StartLocation);
} else {
foreach (var arg in invocationExpression.Arguments) {
ForceSpacesBeforeRemoveNewLines(arg, policy.SpaceAfterMethodCallParameterComma && arg.PrevSibling.Role == Roles.Comma);
arg.AcceptVisitor(this);
}
ForceSpacesBeforeRemoveNewLines(invocationExpression.RParToken, policy.SpaceWithinMethodCallParentheses);
}
base.VisitInvocationExpression(invocationExpression);
}
foreach (CSharpTokenNode comma in invocationExpression.Children.Where (node => node.Role == Roles.Comma)) {
ForceSpacesBefore(comma, policy.SpaceBeforeMethodCallParameterComma);
}
if (!invocationExpression.Target.IsNull)
invocationExpression.Target.AcceptVisitor(this);
}
public override void VisitIndexerExpression(IndexerExpression indexerExpression)
{
ForceSpacesBefore(indexerExpression.LBracketToken, policy.SpacesBeforeBrackets);
ForceSpacesAfter(indexerExpression.LBracketToken, policy.SpacesWithinBrackets);
ForceSpacesBefore(indexerExpression.RBracketToken, policy.SpacesWithinBrackets);
FormatCommas(indexerExpression, policy.SpaceBeforeBracketComma, policy.SpaceAfterBracketComma);
base.VisitIndexerExpression(indexerExpression);
bool wrapMethodCall = DoWrap(policy.MethodCallArgumentWrapping, indexerExpression.RBracketToken);
if (wrapMethodCall && indexerExpression.Arguments.Any()) {
if (policy.NewLineAferMethodCallOpenParentheses) {
curIndent.Push(IndentType.Continuation);
foreach (var arg in indexerExpression.Arguments) {
FixStatementIndentation(arg.StartLocation);
}
curIndent.Pop();
} else {
int extraSpaces = indexerExpression.Arguments.First().StartLocation.Column - 1 - curIndent.IndentString.Length;
curIndent.ExtraSpaces += extraSpaces;
foreach (var arg in indexerExpression.Arguments.Skip (1)) {
FixStatementIndentation(arg.StartLocation);
}
curIndent.ExtraSpaces -= extraSpaces;
}
if (policy.MethodClosingParenthesesOnNewLine)
FixStatementIndentation(indexerExpression.RBracketToken.StartLocation);
} else {
foreach (var arg in indexerExpression.Arguments) {
ForceSpacesBeforeRemoveNewLines(arg, policy.SpaceAfterBracketComma && arg.PrevSibling.Role == Roles.Comma);
arg.AcceptVisitor(this);
}
ForceSpacesBeforeRemoveNewLines(indexerExpression.RBracketToken, policy.SpacesWithinBrackets);
}
foreach (CSharpTokenNode comma in indexerExpression.Children.Where (node => node.Role == Roles.Comma)) {
ForceSpacesBefore(comma, policy.SpaceBeforeBracketComma);
}
if (!indexerExpression.Target.IsNull)
indexerExpression.Target.AcceptVisitor(this);
}
public override void VisitParenthesizedExpression(ParenthesizedExpression parenthesizedExpression)
@ -1688,23 +1745,45 @@ namespace ICSharpCode.NRefactory.CSharp @@ -1688,23 +1745,45 @@ namespace ICSharpCode.NRefactory.CSharp
ForceSpacesBefore(objectCreateExpression.LParToken, policy.SpaceBeforeNewParentheses);
if (objectCreateExpression.Arguments.Any()) {
if (!objectCreateExpression.LParToken.IsNull) {
if (!objectCreateExpression.LParToken.IsNull)
ForceSpacesAfter(objectCreateExpression.LParToken, policy.SpacesWithinNewParentheses);
}
if (!objectCreateExpression.RParToken.IsNull) {
ForceSpacesBefore(objectCreateExpression.RParToken, policy.SpacesWithinNewParentheses);
}
} else {
if (!objectCreateExpression.LParToken.IsNull) {
if (!objectCreateExpression.LParToken.IsNull)
ForceSpacesAfter(objectCreateExpression.LParToken, policy.SpacesBetweenEmptyNewParentheses);
}
bool wrapMethodCall = DoWrap(policy.MethodCallArgumentWrapping, objectCreateExpression.RParToken);
if (wrapMethodCall && objectCreateExpression.Arguments.Any()) {
if (policy.NewLineAferMethodCallOpenParentheses) {
curIndent.Push(IndentType.Continuation);
foreach (var arg in objectCreateExpression.Arguments) {
FixStatementIndentation(arg.StartLocation);
}
curIndent.Pop();
} else {
int extraSpaces = objectCreateExpression.Arguments.First().StartLocation.Column - 1 - curIndent.IndentString.Length;
curIndent.ExtraSpaces += extraSpaces;
foreach (var arg in objectCreateExpression.Arguments.Skip (1)) {
FixStatementIndentation(arg.StartLocation);
}
curIndent.ExtraSpaces -= extraSpaces;
}
if (!objectCreateExpression.RParToken.IsNull) {
ForceSpacesBefore(objectCreateExpression.RParToken, policy.SpacesBetweenEmptyNewParentheses);
if (policy.MethodClosingParenthesesOnNewLine)
FixStatementIndentation(objectCreateExpression.RParToken.StartLocation);
} else {
foreach (var arg in objectCreateExpression.Arguments) {
ForceSpacesBeforeRemoveNewLines(arg, policy.SpaceAfterNewParameterComma && arg.PrevSibling.Role == Roles.Comma);
arg.AcceptVisitor(this);
}
ForceSpacesBeforeRemoveNewLines(objectCreateExpression.RParToken, policy.SpacesWithinNewParentheses);
}
FormatCommas(objectCreateExpression, policy.SpaceBeforeNewParameterComma, policy.SpaceAfterNewParameterComma);
base.VisitObjectCreateExpression(objectCreateExpression);
foreach (CSharpTokenNode comma in objectCreateExpression.Children.Where (node => node.Role == Roles.Comma)) {
ForceSpacesBefore(comma, policy.SpaceBeforeNewParameterComma);
}
if (!objectCreateExpression.Type.IsNull)
objectCreateExpression.Type.AcceptVisitor(this);
}
public override void VisitArrayCreateExpression(ArrayCreateExpression arrayObjectCreateExpression)

15
ICSharpCode.NRefactory.CSharp/Formatter/CSharpFormattingOptions.cs

@ -791,6 +791,21 @@ namespace ICSharpCode.NRefactory.CSharp @@ -791,6 +791,21 @@ namespace ICSharpCode.NRefactory.CSharp
set;
}
public Wrapping MethodCallArgumentWrapping {
get;
set;
}
public bool NewLineAferMethodCallOpenParentheses {
get;
set;
}
public bool MethodClosingParenthesesOnNewLine {
get;
set;
}
#endregion

10
ICSharpCode.NRefactory.CSharp/Formatter/FormattingOptionsFactory.cs

@ -175,7 +175,10 @@ namespace ICSharpCode.NRefactory.CSharp @@ -175,7 +175,10 @@ namespace ICSharpCode.NRefactory.CSharp
BlankLinesBetweenMembers = 1,
KeepCommentsAtFirstColumn = true,
ChainedMethodCallWrapping = Wrapping.WrapAlways
ChainedMethodCallWrapping = Wrapping.WrapAlways,
MethodCallArgumentWrapping = Wrapping.WrapIfTooLong,
NewLineAferMethodCallOpenParentheses = true,
MethodClosingParenthesesOnNewLine = true
};
}
@ -314,7 +317,10 @@ namespace ICSharpCode.NRefactory.CSharp @@ -314,7 +317,10 @@ namespace ICSharpCode.NRefactory.CSharp
BlankLinesBetweenMembers = 1,
KeepCommentsAtFirstColumn = true,
ChainedMethodCallWrapping = Wrapping.WrapAlways
ChainedMethodCallWrapping = Wrapping.WrapAlways,
MethodCallArgumentWrapping = Wrapping.WrapIfTooLong,
NewLineAferMethodCallOpenParentheses = true,
MethodClosingParenthesesOnNewLine = true
};
}

14
ICSharpCode.NRefactory.CSharp/Formatter/Indent.cs

@ -80,7 +80,19 @@ namespace ICSharpCode.NRefactory.CSharp @@ -80,7 +80,19 @@ namespace ICSharpCode.NRefactory.CSharp
indentString = new string(' ', curIndent);
return;
}
indentString = new string('\t', curIndent / options.TabSize) + new string(' ', curIndent % options.TabSize);
indentString = new string('\t', curIndent / options.TabSize) + new string(' ', curIndent % options.TabSize) + new string (' ', ExtraSpaces);
}
int extraSpaces;
public int ExtraSpaces {
get {
return extraSpaces;
}
set {
extraSpaces = value;
Update();
}
}
string indentString;

141
ICSharpCode.NRefactory.Tests/FormattingTests/TestWrapping.cs

@ -166,5 +166,146 @@ namespace ICSharpCode.NRefactory.CSharp.FormattingTests @@ -166,5 +166,146 @@ namespace ICSharpCode.NRefactory.CSharp.FormattingTests
}");
}
[Test()]
public void TestMethodCallArgumentWrapping()
{
var policy = FormattingOptionsFactory.CreateMono();
policy.MethodCallArgumentWrapping = Wrapping.WrapAlways;
policy.NewLineAferMethodCallOpenParentheses = true;
policy.MethodClosingParenthesesOnNewLine = true;
Test(policy, @"class Test
{
void TestMe ()
{
Foo (1, 2, 3);
}
}",
@"class Test
{
void TestMe ()
{
Foo (
1,
2,
3
);
}
}");
}
[Test()]
public void TestMethodCallArgumentNoNewLineWrapping()
{
var policy = FormattingOptionsFactory.CreateMono();
policy.MethodCallArgumentWrapping = Wrapping.WrapAlways;
policy.NewLineAferMethodCallOpenParentheses = false;
policy.MethodClosingParenthesesOnNewLine = false;
Test(policy, @"class Test
{
void TestMe ()
{
FooBar (1, 2, 3);
}
}",
@"class Test
{
void TestMe ()
{
FooBar (1,
2,
3);
}
}");
}
[Test()]
public void TestMethodCallArgumentDoNotWrapWrapping()
{
var policy = FormattingOptionsFactory.CreateMono();
policy.MethodCallArgumentWrapping = Wrapping.DoNotWrap;
policy.NewLineAferMethodCallOpenParentheses = true;
policy.MethodClosingParenthesesOnNewLine = true;
Test(policy, @"class Test
{
void TestMe ()
{
Foo (
1,
2,
3
);
}
}",
@"class Test
{
void TestMe ()
{
Foo (1, 2, 3);
}
}");
}
[Test()]
public void TestIndexerCallArgumentNoNewLineWrapping()
{
var policy = FormattingOptionsFactory.CreateMono();
policy.MethodCallArgumentWrapping = Wrapping.WrapAlways;
policy.NewLineAferMethodCallOpenParentheses = true;
policy.MethodClosingParenthesesOnNewLine = true;
Test(policy, @"class Test
{
void TestMe ()
{
FooBar [1, 2, 3] = 5;
}
}",
@"class Test
{
void TestMe ()
{
FooBar [
1,
2,
3
] = 5;
}
}");
}
[Test()]
public void TestObjectCreationArgumentNoNewLineWrapping()
{
var policy = FormattingOptionsFactory.CreateMono();
policy.MethodCallArgumentWrapping = Wrapping.WrapAlways;
policy.NewLineAferMethodCallOpenParentheses = true;
policy.MethodClosingParenthesesOnNewLine = true;
Test(policy, @"class Test
{
void TestMe ()
{
new FooBar (1, 2, 3);
}
}",
@"class Test
{
void TestMe ()
{
new FooBar (
1,
2,
3
);
}
}");
}
}
}

Loading…
Cancel
Save