1
ļ»æ// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
3
// Permission is hereby granted, free of charge, to any person obtaining a copy of this
4
// software and associated documentation files (the "Software"), to deal in the Software
5
// without restriction, including without limitation the rights to use, copy, modify, merge,
6
// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
7
// to whom the Software is furnished to do so, subject to the following conditions:
9
// The above copyright notice and this permission notice shall be included in all copies or
10
// substantial portions of the Software.
12
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
13
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14
// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
15
// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
16
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
17
// DEALINGS IN THE SOFTWARE.
21
using ICSharpCode.NRefactory.Semantics;
22
using ICSharpCode.NRefactory.TypeSystem;
23
using NUnit.Framework;
25
namespace ICSharpCode.NRefactory.CSharp.Resolver
28
public class MethodTests : ResolverTestBase
31
public void MethodDeclarationWithAttribute()
33
string code = @"using System;
39
var mrr = Resolve<MemberResolveResult>(code);
40
Assert.AreEqual("TestClass.M", mrr.Member.FullName);
44
public void ParameterIdentityInNormalMethod()
46
string code = @"using System;
48
$int F(int i, int j) {
53
var prep = PrepareResolver(code);
54
var md = (MethodDeclaration)prep.Item2;
56
var resolver = prep.Item1;
57
var method = (IMethod)((MemberResolveResult)resolver.Resolve(md)).Member;
58
IVariable i1 = method.Parameters.Single(p => p.Name == "i");
59
IVariable j1 = method.Parameters.Single(p => p.Name == "j");
61
var returnExpr = (BinaryOperatorExpression)md.Body.Children.OfType<ReturnStatement>().Single().Expression;
62
var returnRR = (OperatorResolveResult)resolver.Resolve(returnExpr);
64
IVariable i2 = ((LocalResolveResult)returnRR.Operands[0]).Variable;
65
IVariable j2 = ((LocalResolveResult)returnRR.Operands[1]).Variable;
67
Assert.IsTrue(ReferenceEquals(i1, i2));
68
Assert.IsTrue(ReferenceEquals(i1, i2));
72
public void ParameterIdentityInPropertySetter()
74
string code = @"using System;
78
get { return myField; }
79
set { myField = value; }
83
var prep = PrepareResolver(code);
84
var pd = (PropertyDeclaration)prep.Item2;
86
var resolver = prep.Item1;
87
var property = (IProperty)((MemberResolveResult)resolver.Resolve(pd)).Member;
88
IVariable value1 = property.Setter.Parameters.Single(p => p.Name == "value");
90
var assignExpr = (AssignmentExpression)pd.Setter.Body.Children.OfType<ExpressionStatement>().Single().Expression;
91
var assignRR = (OperatorResolveResult)resolver.Resolve(assignExpr);
93
IVariable value2 = ((LocalResolveResult)assignRR.Operands[1]).Variable;
95
Assert.IsTrue(ReferenceEquals(value1, value2));
99
public void ParameterIdentityInIndexerGetter()
101
string code = @"using System;
104
$int this[int i, int j] {
105
get { return myField[i, j]; }
106
set { myField[i, j] = value; }
110
var prep = PrepareResolver(code);
111
var id = (IndexerDeclaration)prep.Item2;
113
var resolver = prep.Item1;
114
var property = (IProperty)((MemberResolveResult)resolver.Resolve(id)).Member;
115
IVariable i1 = property.Getter.Parameters.Single(p => p.Name == "i");
116
IVariable j1 = property.Getter.Parameters.Single(p => p.Name == "j");
118
var accessExpr = (IndexerExpression)id.Getter.Body.Children.OfType<ReturnStatement>().Single().Expression;
119
var accessRR = (ArrayAccessResolveResult)resolver.Resolve(accessExpr);
120
IVariable i2 = ((LocalResolveResult)accessRR.Indexes[0]).Variable;
121
IVariable j2 = ((LocalResolveResult)accessRR.Indexes[1]).Variable;
123
Assert.IsTrue(ReferenceEquals(i1, i2));
124
Assert.IsTrue(ReferenceEquals(j1, j2));
128
public void ParameterIdentityInIndexerSetter()
130
string code = @"using System;
133
$int this[int i, int j] {
134
get { return myField[i, j]; }
135
set { myField[i, j] = value; }
139
var prep = PrepareResolver(code);
140
var id = (IndexerDeclaration)prep.Item2;
142
var resolver = prep.Item1;
143
var property = (IProperty)((MemberResolveResult)resolver.Resolve(id)).Member;
144
IVariable i1 = property.Setter.Parameters.Single(p => p.Name == "i");
145
IVariable j1 = property.Setter.Parameters.Single(p => p.Name == "j");
146
IVariable value1 = property.Setter.Parameters.Single(p => p.Name == "value");
148
var assignExpr = (AssignmentExpression)id.Setter.Body.Children.OfType<ExpressionStatement>().Single().Expression;
149
var assignRR = (OperatorResolveResult)resolver.Resolve(assignExpr);
150
var accessRR = (ArrayAccessResolveResult)assignRR.Operands[0];
151
IVariable i2 = ((LocalResolveResult)accessRR.Indexes[0]).Variable;
152
IVariable j2 = ((LocalResolveResult)accessRR.Indexes[1]).Variable;
153
IVariable value2 = ((LocalResolveResult)assignRR.Operands[1]).Variable;
155
Assert.IsTrue(ReferenceEquals(i1, i2));
156
Assert.IsTrue(ReferenceEquals(j1, j2));
157
Assert.IsTrue(ReferenceEquals(value1, value2));
161
public void ResolveParameterDeclarationInIndexer()
163
string code = @"using System;
166
int this[$int i$, int j] {
167
get { return myField[i, j]; }
168
set { myField[i, j] = value; }
171
var rr = Resolve<LocalResolveResult>(code);
172
Assert.IsTrue(rr.IsParameter);
176
public void ParameterIdentityInEventAdder()
178
string code = @"using System;
180
EventHandler myField;
181
$event EventHandler Evt {
182
add { myField += value; }
183
remove { myField -= value; }
187
var prep = PrepareResolver(code);
188
var ed = (CustomEventDeclaration)prep.Item2;
190
var resolver = prep.Item1;
191
var evt = (IEvent)((MemberResolveResult)resolver.Resolve(ed)).Member;
192
IVariable value1 = evt.AddAccessor.Parameters.Single(p => p.Name == "value");
194
var assignExpr = (AssignmentExpression)ed.AddAccessor.Body.Children.OfType<ExpressionStatement>().Single().Expression;
195
var assignRR = (OperatorResolveResult)resolver.Resolve(assignExpr);
197
IVariable value2 = ((LocalResolveResult)assignRR.Operands[1]).Variable;
199
Assert.IsTrue(ReferenceEquals(value1, value2));
203
public void ParameterIdentityInEventRemover()
205
string code = @"using System;
207
EventHandler myField;
208
$event EventHandler Evt {
209
add { myField += value; }
210
remove { myField -= value; }
214
var prep = PrepareResolver(code);
215
var ed = (CustomEventDeclaration)prep.Item2;
217
var resolver = prep.Item1;
218
var evt = (IEvent)((MemberResolveResult)resolver.Resolve(ed)).Member;
219
IVariable value1 = evt.RemoveAccessor.Parameters.Single(p => p.Name == "value");
221
var assignExpr = (AssignmentExpression)ed.RemoveAccessor.Body.Children.OfType<ExpressionStatement>().Single().Expression;
222
var assignRR = (OperatorResolveResult)resolver.Resolve(assignExpr);
224
IVariable value2 = ((LocalResolveResult)assignRR.Operands[1]).Variable;
226
Assert.IsTrue(ReferenceEquals(value1, value2));
230
public void MethodWithInvalidCastInDefaultValue()
235
void TestMethod ($int x = true$)
239
var rr = Resolve<LocalResolveResult>(input);
240
IParameter p = (IParameter)rr.Variable;
241
Assert.IsTrue(p.IsOptional);
242
Assert.IsNull(p.ConstantValue);