Browse Source

CompareFloatWithEqualityOperatorIssue: use short name for System.Math if possible.

newNRvisualizers
Daniel Grunwald 13 years ago
parent
commit
1a2689edcb
  1. 6
      ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs
  2. 14
      ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/CompareFloatWithEqualityOperatorIssue.cs

6
ICSharpCode.NRefactory.CSharp/Refactoring/BaseRefactoringContext.cs

@ -122,6 +122,12 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
return resolver.GetConversion(expression, cancellationToken); return resolver.GetConversion(expression, cancellationToken);
} }
public TypeSystemAstBuilder CreateTypeSytemAstBuilder(AstNode node)
{
var csResolver = resolver.GetResolverStateBefore(node);
return new TypeSystemAstBuilder(csResolver);
}
#endregion #endregion
#region Code Analyzation #region Code Analyzation

14
ICSharpCode.NRefactory.CSharp/Refactoring/CodeIssues/CompareFloatWithEqualityOperatorIssue.cs

@ -80,12 +80,11 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
void AddIsNaNIssue(BinaryOperatorExpression binaryOperatorExpr, Expression argExpr, string floatType) void AddIsNaNIssue(BinaryOperatorExpression binaryOperatorExpr, Expression argExpr, string floatType)
{ {
if (ctx.Resolve (argExpr).Type.ReflectionName != "System.Single") if (!ctx.Resolve(argExpr).Type.IsKnownType(KnownTypeCode.Single))
floatType = "double"; floatType = "double";
AddIssue (binaryOperatorExpr, string.Format(ctx.TranslateString ("Use {0}.IsNan()"), floatType), AddIssue(binaryOperatorExpr, string.Format(ctx.TranslateString ("Use {0}.IsNaN()"), floatType),
script => { script => {
Expression expr = new InvocationExpression (new MemberReferenceExpression ( Expression expr = new PrimitiveType(floatType).Invoke("IsNaN", argExpr.Clone());
new TypeReferenceExpression (new PrimitiveType (floatType)), "IsNaN"), argExpr.Clone ());
if (binaryOperatorExpr.Operator == BinaryOperatorType.InEquality) if (binaryOperatorExpr.Operator == BinaryOperatorType.InEquality)
expr = new UnaryOperatorExpression (UnaryOperatorType.Not, expr); expr = new UnaryOperatorExpression (UnaryOperatorType.Not, expr);
script.Replace (binaryOperatorExpr, expr); script.Replace (binaryOperatorExpr, expr);
@ -109,13 +108,10 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
AddIssue (binaryOperatorExpression, ctx.TranslateString ("Compare a difference with EPSILON"), AddIssue (binaryOperatorExpression, ctx.TranslateString ("Compare a difference with EPSILON"),
script => { script => {
// Math.Abs(diff) op EPSILON // Math.Abs(diff) op EPSILON
var builder = ctx.CreateTypeSytemAstBuilder(binaryOperatorExpression);
var diff = new BinaryOperatorExpression (binaryOperatorExpression.Left.Clone (), var diff = new BinaryOperatorExpression (binaryOperatorExpression.Left.Clone (),
BinaryOperatorType.Subtract, binaryOperatorExpression.Right.Clone ()); BinaryOperatorType.Subtract, binaryOperatorExpression.Right.Clone ());
var abs = new InvocationExpression ( var abs = builder.ConvertType(new TopLevelTypeName("System", "Math")).Invoke("Abs", diff);
new MemberReferenceExpression (
new TypeReferenceExpression (new SimpleType ("System.Math")),
"Abs"),
diff);
var op = binaryOperatorExpression.Operator == BinaryOperatorType.Equality ? var op = binaryOperatorExpression.Operator == BinaryOperatorType.Equality ?
BinaryOperatorType.LessThan : BinaryOperatorType.GreaterThan; BinaryOperatorType.LessThan : BinaryOperatorType.GreaterThan;
var epsilon = new IdentifierExpression ("EPSILON"); var epsilon = new IdentifierExpression ("EPSILON");

Loading…
Cancel
Save