New tests.
[mono.git] / mcs / class / System.Web.Mvc2 / System.Web.Mvc / ExpressionUtil / ConditionalExpressionFingerprint.cs
1 #pragma warning disable 659 // overrides AddToHashCodeCombiner instead\r
2 \r
3 /* ****************************************************************************\r
4  *\r
5  * Copyright (c) Microsoft Corporation. All rights reserved.\r
6  *\r
7  * This software is subject to the Microsoft Public License (Ms-PL). \r
8  * A copy of the license can be found in the license.htm file included \r
9  * in this distribution.\r
10  *\r
11  * You must not remove this notice, or any other, from this software.\r
12  *\r
13  * ***************************************************************************/\r
14 \r
15 namespace System.Web.Mvc.ExpressionUtil {\r
16     using System;\r
17     using System.Diagnostics.CodeAnalysis;\r
18     using System.Linq.Expressions;\r
19 \r
20     // ConditionalExpression fingerprint class\r
21     // Expression of form (test) ? ifTrue : ifFalse\r
22     [SuppressMessage("Microsoft.Usage", "CA2218:OverrideGetHashCodeOnOverridingEquals",\r
23         Justification = "Overrides AddToHashCodeCombiner() instead.")]\r
24     internal sealed class ConditionalExpressionFingerprint : ExpressionFingerprint {\r
25 \r
26         private ConditionalExpressionFingerprint(ConditionalExpression expression)\r
27             : base(expression) {\r
28         }\r
29 \r
30         public ExpressionFingerprint Test {\r
31             get;\r
32             private set;\r
33         }\r
34 \r
35         public ExpressionFingerprint IfTrue {\r
36             get;\r
37             private set;\r
38         }\r
39 \r
40         public ExpressionFingerprint IfFalse {\r
41             get;\r
42             private set;\r
43         }\r
44 \r
45         internal override void AddToHashCodeCombiner(HashCodeCombiner combiner) {\r
46             base.AddToHashCodeCombiner(combiner);\r
47 \r
48             combiner.AddFingerprint(Test);\r
49             combiner.AddFingerprint(IfTrue);\r
50             combiner.AddFingerprint(IfFalse);\r
51         }\r
52 \r
53         public static ConditionalExpressionFingerprint Create(ConditionalExpression expression, ParserContext parserContext) {\r
54             // if any fingerprinting fails, bail out\r
55             ExpressionFingerprint test = Create(expression.Test, parserContext);\r
56             if (test == null && expression.Test != null) {\r
57                 return null;\r
58             }\r
59 \r
60             ExpressionFingerprint ifTrue = Create(expression.IfTrue, parserContext);\r
61             if (ifTrue == null && expression.IfTrue != null) {\r
62                 return null;\r
63             }\r
64 \r
65             ExpressionFingerprint ifFalse = Create(expression.IfFalse, parserContext);\r
66             if (ifFalse == null && expression.IfFalse != null) {\r
67                 return null;\r
68             }\r
69 \r
70             return new ConditionalExpressionFingerprint(expression) {\r
71                 Test = test,\r
72                 IfTrue = ifTrue,\r
73                 IfFalse = ifFalse\r
74             };\r
75         }\r
76 \r
77         public override bool Equals(object obj) {\r
78             ConditionalExpressionFingerprint other = obj as ConditionalExpressionFingerprint;\r
79             if (other == null) {\r
80                 return false;\r
81             }\r
82 \r
83             return (Object.Equals(this.Test, other.Test)\r
84                 && Object.Equals(this.IfTrue, other.IfTrue)\r
85                 && Object.Equals(this.IfFalse, other.IfFalse)\r
86                 && base.Equals(other));\r
87         }\r
88 \r
89         public override Expression ToExpression(ParserContext parserContext) {\r
90             Expression testExpr = ToExpression(Test, parserContext);\r
91             Expression ifTrueExpr = ToExpression(IfTrue, parserContext);\r
92             Expression ifFalseExpr = ToExpression(IfFalse, parserContext);\r
93             return Expression.Condition(testExpr, ifTrueExpr, ifFalseExpr);\r
94         }\r
95 \r
96     }\r
97 }\r