Browse Source

Added constraint new () parens to the AST / fixed constraint

formatting bug.
pull/45/merge
Mike Krüger 13 years ago
parent
commit
67770bcacc
  1. 18
      ICSharpCode.NRefactory.CSharp/Formatter/FormattingVisitor_Global.cs
  2. 3
      ICSharpCode.NRefactory.CSharp/Formatter/FormattingVisitor_TypeMembers.cs
  3. 21
      ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs
  4. 26
      ICSharpCode.NRefactory.Tests/FormattingTests/TestFormattingBugs.cs

18
ICSharpCode.NRefactory.CSharp/Formatter/FormattingVisitor_Global.cs

@ -161,6 +161,9 @@ namespace ICSharpCode.NRefactory.CSharp @@ -161,6 +161,9 @@ namespace ICSharpCode.NRefactory.CSharp
default:
throw new InvalidOperationException("unsupported class type : " + typeDeclaration.ClassType);
}
foreach (var constraint in typeDeclaration.Constraints)
constraint.AcceptVisitor (this);
FixOpenBrace(braceStyle, typeDeclaration.LBraceToken);
@ -248,5 +251,20 @@ namespace ICSharpCode.NRefactory.CSharp @@ -248,5 +251,20 @@ namespace ICSharpCode.NRefactory.CSharp
if (comment.StartsLine && !HadErrors && (!policy.KeepCommentsAtFirstColumn || comment.StartLocation.Column > 1))
FixIndentation(comment);
}
public override void VisitConstraint(Constraint constraint)
{
VisitChildrenToFormat (constraint, node => {
if (node is AstType) {
node.AcceptVisitor (this);
} else if (node.Role == Roles.LPar) {
ForceSpacesBefore (node, false);
ForceSpacesAfter (node, false);
} else if (node.Role ==Roles.Comma) {
ForceSpacesBefore (node, false);
ForceSpacesAfter (node, true);
}
});
}
}
}

3
ICSharpCode.NRefactory.CSharp/Formatter/FormattingVisitor_TypeMembers.cs

@ -347,6 +347,9 @@ namespace ICSharpCode.NRefactory.CSharp @@ -347,6 +347,9 @@ namespace ICSharpCode.NRefactory.CSharp
ForceSpacesAfter(methodDeclaration.LParToken, policy.SpaceBetweenEmptyMethodDeclarationParentheses);
ForceSpacesBefore(methodDeclaration.RParToken, policy.SpaceBetweenEmptyMethodDeclarationParentheses);
}
foreach (var constraint in methodDeclaration.Constraints)
constraint.AcceptVisitor (this);
if (!methodDeclaration.Body.IsNull) {
FixOpenBrace(policy.MethodBraceStyle, methodDeclaration.Body.LBraceToken);

21
ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs

@ -261,9 +261,9 @@ namespace ICSharpCode.NRefactory.CSharp @@ -261,9 +261,9 @@ namespace ICSharpCode.NRefactory.CSharp
switch (sce.Constraint) {
case SpecialConstraint.Class:
return new PrimitiveType ("class", Convert (sce.Location));
case SpecialConstraint.Struct:
case SpecialConstraint.Struct:
return new PrimitiveType ("struct", Convert (sce.Location));
case SpecialConstraint.Constructor:
case SpecialConstraint.Constructor:
return new PrimitiveType ("new", Convert (sce.Location));
}
}
@ -2651,6 +2651,23 @@ namespace ICSharpCode.NRefactory.CSharp @@ -2651,6 +2651,23 @@ namespace ICSharpCode.NRefactory.CSharp
if (c.ConstraintExpressions != null) {
foreach (var expr in c.ConstraintExpressions) {
constraint.AddChild (ConvertToType (expr), Roles.BaseType);
if (expr is SpecialContraintExpr) {
var sce = (SpecialContraintExpr)expr;
switch (sce.Constraint) {
case SpecialConstraint.Class:
break;
case SpecialConstraint.Struct:
break;
case SpecialConstraint.Constructor:
var bl = LocationsBag.GetLocations (expr);
if (bl != null) {
constraint.AddChild (new CSharpTokenNode (Convert (bl[0]), Roles.LPar), Roles.LPar);
constraint.AddChild (new CSharpTokenNode (Convert (bl[1]), Roles.RPar), Roles.RPar);
}
break;
}
}
if (commaLocs != null && curComma < commaLocs.Count)
constraint.AddChild (new CSharpTokenNode (Convert (commaLocs [curComma++]), Roles.Comma), Roles.Comma);
}

26
ICSharpCode.NRefactory.Tests/FormattingTests/TestFormattingBugs.cs

@ -350,6 +350,32 @@ foo (); @@ -350,6 +350,32 @@ foo ();
}
}");
}
/// <summary>
/// Bug 12270 - Code formatter breaks new() constraints
/// </summary>
[Test]
public void TestBug12270()
{
CSharpFormattingOptions policy = FormattingOptionsFactory.CreateMono();
Test(policy,
@"class C
{
public void Test<T> () where T : new ()
{
}
}",
@"class C
{
public void Test<T> () where T : new()
{
}
}");
}
}
}

Loading…
Cancel
Save