Browse Source

Merge branch 'master' of git://github.com/icsharpcode/ILSpy into Debugger

newNRvisualizers
Eusebiu Marcu 15 years ago
parent
commit
7f49b56e2a
  1. 27
      ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs
  2. 35
      ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs
  3. 23
      ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs
  4. 4
      ICSharpCode.NRefactory/CSharp/Resolver/CSharpResolver.cs

27
ICSharpCode.NRefactory.Tests/CSharp/InsertParenthesesVisitorTests.cs

@ -85,6 +85,33 @@ namespace ICSharpCode.NRefactory.CSharp
Assert.AreEqual("(MyType)(!a)", InsertReadable(expr)); Assert.AreEqual("(MyType)(!a)", InsertReadable(expr));
} }
[Test]
public void TrickyCast4()
{
Expression expr = new PrimitiveExpression(int.MinValue).CastTo(new SimpleType("MyType"));
Assert.AreEqual("(MyType)(-2147483648)", InsertRequired(expr));
Assert.AreEqual("(MyType)(-2147483648)", InsertReadable(expr));
}
[Test]
public void TrickyCast5()
{
Expression expr = new PrimitiveExpression(-1.0).CastTo(new SimpleType("MyType"));
Assert.AreEqual("(MyType)(-1.0)", InsertRequired(expr));
Assert.AreEqual("(MyType)(-1.0)", InsertReadable(expr));
}
[Test]
public void TrickyCast6()
{
Expression expr = new PrimitiveExpression(int.MinValue).CastTo(new PrimitiveType("double"));
Assert.AreEqual("(double)-2147483648", InsertRequired(expr));
Assert.AreEqual("(double)-2147483648", InsertReadable(expr));
}
[Test] [Test]
public void CastAndInvoke() public void CastAndInvoke()
{ {

35
ICSharpCode.NRefactory/CSharp/OutputVisitor/InsertParenthesesVisitor.cs

@ -156,6 +156,41 @@ namespace ICSharpCode.NRefactory.CSharp
Parenthesize(castExpression.Expression); Parenthesize(castExpression.Expression);
} }
} }
// The above issue can also happen with PrimitiveExpressions representing negative values:
PrimitiveExpression pe = castExpression.Expression as PrimitiveExpression;
if (pe != null && pe.Value != null && TypeCanBeMisinterpretedAsExpression(castExpression.Type)) {
TypeCode typeCode = Type.GetTypeCode(pe.Value.GetType());
switch (typeCode) {
case TypeCode.SByte:
if ((sbyte)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Int16:
if ((short)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Int32:
if ((int)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Int64:
if ((long)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Single:
if ((float)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Double:
if ((double)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
case TypeCode.Decimal:
if ((decimal)pe.Value < 0)
Parenthesize(castExpression.Expression);
break;
}
}
return base.VisitCastExpression(castExpression, data); return base.VisitCastExpression(castExpression, data);
} }

23
ICSharpCode.NRefactory/CSharp/OutputVisitor/OutputVisitor.cs

@ -747,7 +747,12 @@ namespace ICSharpCode.NRefactory.CSharp
{ {
StartNode(namedArgumentExpression); StartNode(namedArgumentExpression);
WriteIdentifier(namedArgumentExpression.Identifier); WriteIdentifier(namedArgumentExpression.Identifier);
if (namedArgumentExpression.Parent is ArrayInitializerExpression) {
Space();
WriteToken("=", NamedArgumentExpression.Roles.Assign);
} else {
WriteToken(":", NamedArgumentExpression.Roles.Colon); WriteToken(":", NamedArgumentExpression.Roles.Colon);
}
Space(); Space();
namedArgumentExpression.Expression.AcceptVisitor(this, data); namedArgumentExpression.Expression.AcceptVisitor(this, data);
return EndNode(namedArgumentExpression); return EndNode(namedArgumentExpression);
@ -765,8 +770,14 @@ namespace ICSharpCode.NRefactory.CSharp
StartNode(objectCreateExpression); StartNode(objectCreateExpression);
WriteKeyword("new"); WriteKeyword("new");
objectCreateExpression.Type.AcceptVisitor(this, data); objectCreateExpression.Type.AcceptVisitor(this, data);
bool useParenthesis = objectCreateExpression.Arguments.Any() || objectCreateExpression.Initializer.IsNull;
// also use parenthesis if there is an '(' token and this isn't an anonymous type
if (!objectCreateExpression.LParToken.IsNull && !objectCreateExpression.Type.IsNull)
useParenthesis = true;
if (useParenthesis) {
Space(policy.SpaceBeforeMethodCallParentheses); Space(policy.SpaceBeforeMethodCallParentheses);
WriteCommaSeparatedListInParenthesis(objectCreateExpression.Arguments, policy.SpaceWithinMethodCallParentheses); WriteCommaSeparatedListInParenthesis(objectCreateExpression.Arguments, policy.SpaceWithinMethodCallParentheses);
}
objectCreateExpression.Initializer.AcceptVisitor(this, data); objectCreateExpression.Initializer.AcceptVisitor(this, data);
return EndNode(objectCreateExpression); return EndNode(objectCreateExpression);
} }
@ -1021,15 +1032,21 @@ namespace ICSharpCode.NRefactory.CSharp
public object VisitQueryExpression(QueryExpression queryExpression, object data) public object VisitQueryExpression(QueryExpression queryExpression, object data)
{ {
StartNode(queryExpression); StartNode(queryExpression);
bool indent = !(queryExpression.Parent is QueryContinuationClause);
if (indent) {
formatter.Indent();
NewLine();
}
bool first = true; bool first = true;
foreach (var clause in queryExpression.Clauses) { foreach (var clause in queryExpression.Clauses) {
if (first) { if (first)
first = false; first = false;
} else { else
NewLine(); NewLine();
}
clause.AcceptVisitor(this, data); clause.AcceptVisitor(this, data);
} }
if (indent)
formatter.Unindent();
return EndNode(queryExpression); return EndNode(queryExpression);
} }

4
ICSharpCode.NRefactory/CSharp/Resolver/CSharpResolver.cs

@ -1761,9 +1761,9 @@ namespace ICSharpCode.NRefactory.CSharp.Resolver
{ {
return return
from c in context.GetClasses(namespaceName, StringComparer.Ordinal) from c in context.GetClasses(namespaceName, StringComparer.Ordinal)
where c.IsStatic where c.IsStatic && c.HasExtensionMethods
from m in c.Methods from m in c.Methods
where (m.IsExtensionMethod) where m.IsExtensionMethod
select m; select m;
} }
#endregion #endregion

Loading…
Cancel
Save