Skip to content

Commit 33e497e

Browse files
Refactor ParseReflectionName to return IType instead of ITypeReference
1 parent 9dde974 commit 33e497e

File tree

8 files changed

+60
-44
lines changed

8 files changed

+60
-44
lines changed

ICSharpCode.BamlDecompiler/XamlContext.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,9 @@ THE SOFTWARE.
2727
using System.Threading;
2828
using System.Xml.Linq;
2929

30-
using ICSharpCode.Decompiler.TypeSystem;
31-
3230
using ICSharpCode.BamlDecompiler.Baml;
3331
using ICSharpCode.BamlDecompiler.Xaml;
32+
using ICSharpCode.Decompiler.TypeSystem;
3433

3534
namespace ICSharpCode.BamlDecompiler
3635
{
@@ -123,7 +122,7 @@ public XamlType ResolveType(ushort id)
123122
{
124123
var typeRec = Baml.TypeIdMap[id];
125124
(fullAssemblyName, assembly) = Baml.ResolveAssembly(typeRec.AssemblyId);
126-
type = ReflectionHelper.ParseReflectionName(typeRec.TypeFullName).Resolve(new SimpleTypeResolveContext(TypeSystem));
125+
type = ReflectionHelper.ParseReflectionName(typeRec.TypeFullName, new SimpleTypeResolveContext(TypeSystem));
127126
}
128127

129128
var clrNs = type.Namespace;

ICSharpCode.Decompiler.Tests/TypeSystem/ReflectionHelperTests.cs

Lines changed: 49 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -159,138 +159,157 @@ public void TestToTypeReferenceGenericType()
159159
public void ParseReflectionName()
160160
{
161161
var context = new SimpleTypeResolveContext(compilation.MainModule);
162-
Assert.That(ReflectionHelper.ParseReflectionName("System.Int32").Resolve(context).ReflectionName, Is.EqualTo("System.Int32"));
163-
Assert.That(ReflectionHelper.ParseReflectionName("System.Int32&").Resolve(context).ReflectionName, Is.EqualTo("System.Int32&"));
164-
Assert.That(ReflectionHelper.ParseReflectionName("System.Int32*&").Resolve(context).ReflectionName, Is.EqualTo("System.Int32*&"));
165-
Assert.That(ReflectionHelper.ParseReflectionName(typeof(int).AssemblyQualifiedName).Resolve(context).ReflectionName, Is.EqualTo("System.Int32"));
166-
Assert.That(ReflectionHelper.ParseReflectionName("System.Action`1[[System.String]]").Resolve(context).ReflectionName, Is.EqualTo("System.Action`1[[System.String]]"));
167-
Assert.That(ReflectionHelper.ParseReflectionName("System.Action`1[[System.String, mscorlib]]").Resolve(context).ReflectionName, Is.EqualTo("System.Action`1[[System.String]]"));
168-
Assert.That(ReflectionHelper.ParseReflectionName(typeof(int[,][,,]).AssemblyQualifiedName).Resolve(context).ReflectionName, Is.EqualTo("System.Int32[,,][,]"));
169-
Assert.That(ReflectionHelper.ParseReflectionName("System.Environment+SpecialFolder").Resolve(context).ReflectionName, Is.EqualTo("System.Environment+SpecialFolder"));
162+
Assert.That(ReflectionHelper.ParseReflectionName("System.Int32", context).ReflectionName, Is.EqualTo("System.Int32"));
163+
Assert.That(ReflectionHelper.ParseReflectionName("System.Int32&", context).ReflectionName, Is.EqualTo("System.Int32&"));
164+
Assert.That(ReflectionHelper.ParseReflectionName("System.Int32*&", context).ReflectionName, Is.EqualTo("System.Int32*&"));
165+
Assert.That(ReflectionHelper.ParseReflectionName(typeof(int).AssemblyQualifiedName, context).ReflectionName, Is.EqualTo("System.Int32"));
166+
Assert.That(ReflectionHelper.ParseReflectionName("System.Action`1[[System.String]]", context).ReflectionName, Is.EqualTo("System.Action`1[[System.String]]"));
167+
Assert.That(ReflectionHelper.ParseReflectionName("System.Action`1[[System.String, mscorlib]]", context).ReflectionName, Is.EqualTo("System.Action`1[[System.String]]"));
168+
Assert.That(ReflectionHelper.ParseReflectionName(typeof(int[,][,,]).AssemblyQualifiedName, context).ReflectionName, Is.EqualTo("System.Int32[,,][,]"));
169+
Assert.That(ReflectionHelper.ParseReflectionName("System.Environment+SpecialFolder", context).ReflectionName, Is.EqualTo("System.Environment+SpecialFolder"));
170170
}
171171

172172
[Test]
173173
public void ParseOpenGenericReflectionName()
174174
{
175-
ITypeReference typeRef = ReflectionHelper.ParseReflectionName("System.Converter`2[[`0],[``0]]");
176-
Assert.That(typeRef.Resolve(new SimpleTypeResolveContext(compilation.MainModule)).ReflectionName, Is.EqualTo("System.Converter`2[[`0],[``0]]"));
175+
IType converter = ReflectionHelper.ParseReflectionName("System.Converter`2[[`0],[``0]]", new SimpleTypeResolveContext(compilation.MainModule));
176+
Assert.That(converter.ReflectionName, Is.EqualTo("System.Converter`2[[`0],[``0]]"));
177177
IMethod convertAll = compilation.FindType(typeof(List<>)).GetMethods(m => m.Name == "ConvertAll").Single();
178-
Assert.That(typeRef.Resolve(new SimpleTypeResolveContext(convertAll)).ReflectionName, Is.EqualTo("System.Converter`2[[`0],[``0]]"));
178+
IType converter2 = ReflectionHelper.ParseReflectionName("System.Converter`2[[`0],[``0]]", new SimpleTypeResolveContext(convertAll));
179+
Assert.That(converter2.ReflectionName, Is.EqualTo("System.Converter`2[[`0],[``0]]"));
179180
}
180181

181182
[Test]
182183
public void ArrayOfTypeParameter()
183184
{
184185
var context = new SimpleTypeResolveContext(compilation.MainModule);
185-
Assert.That(ReflectionHelper.ParseReflectionName("`0[,]").Resolve(context).ReflectionName, Is.EqualTo("`0[,]"));
186+
Assert.That(ReflectionHelper.ParseReflectionName("`0[,]", context).ReflectionName, Is.EqualTo("`0[,]"));
186187
}
187188

188189
[Test]
189190
public void ParseNullReflectionName()
190191
{
191-
Assert.Throws<ArgumentNullException>(() => ReflectionHelper.ParseReflectionName(null));
192+
var context = new SimpleTypeResolveContext(compilation.MainModule);
193+
Assert.Throws<ArgumentNullException>(() => ReflectionHelper.ParseReflectionName(null, context));
192194
}
193195

194196
[Test]
195197
public void ParseInvalidReflectionName1()
196198
{
197-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName(string.Empty));
199+
var context = new SimpleTypeResolveContext(compilation.MainModule);
200+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName(string.Empty, context));
198201
}
199202

200203
[Test]
201204
public void ParseInvalidReflectionName2()
202205
{
203-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("`"));
206+
var context = new SimpleTypeResolveContext(compilation.MainModule);
207+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("`", context));
204208
}
205209

206210
[Test]
207211
public void ParseInvalidReflectionName3()
208212
{
209-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("``"));
213+
var context = new SimpleTypeResolveContext(compilation.MainModule);
214+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("``", context));
210215
}
211216

212217
[Test]
213218
public void ParseInvalidReflectionName4()
214219
{
215-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`A"));
220+
var context = new SimpleTypeResolveContext(compilation.MainModule);
221+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`A", context));
216222
}
217223

218224
[Test]
219225
public void ParseInvalidReflectionName5()
220226
{
221-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Environment+"));
227+
var context = new SimpleTypeResolveContext(compilation.MainModule);
228+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Environment+", context));
222229
}
223230

224231
[Test]
225232
public void ParseInvalidReflectionName5b()
226233
{
227-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Environment+`"));
234+
var context = new SimpleTypeResolveContext(compilation.MainModule);
235+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Environment+`", context));
228236
}
229237

230238
[Test]
231239
public void ParseInvalidReflectionName6()
232240
{
233-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32["));
241+
var context = new SimpleTypeResolveContext(compilation.MainModule);
242+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32[", context));
234243
}
235244

236245
[Test]
237246
public void ParseInvalidReflectionName7()
238247
{
239-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32[`]"));
248+
var context = new SimpleTypeResolveContext(compilation.MainModule);
249+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32[`]", context));
240250
}
241251

242252
[Test]
243253
public void ParseInvalidReflectionName8()
244254
{
245-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32[,"));
255+
var context = new SimpleTypeResolveContext(compilation.MainModule);
256+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32[,", context));
246257
}
247258

248259
[Test]
249260
public void ParseInvalidReflectionName9()
250261
{
251-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32]"));
262+
var context = new SimpleTypeResolveContext(compilation.MainModule);
263+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32]", context));
252264
}
253265

254266
[Test]
255267
public void ParseInvalidReflectionName10()
256268
{
257-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32*a"));
269+
var context = new SimpleTypeResolveContext(compilation.MainModule);
270+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Int32*a", context));
258271
}
259272

260273
[Test]
261274
public void ParseInvalidReflectionName11()
262275
{
263-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[]]"));
276+
var context = new SimpleTypeResolveContext(compilation.MainModule);
277+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[]]", context));
264278
}
265279

266280
[Test]
267281
public void ParseInvalidReflectionName12()
268282
{
269-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32]a]"));
283+
var context = new SimpleTypeResolveContext(compilation.MainModule);
284+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32]a]", context));
270285
}
271286

272287
[Test]
273288
public void ParseInvalidReflectionName13()
274289
{
275-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32],]"));
290+
var context = new SimpleTypeResolveContext(compilation.MainModule);
291+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32],]", context));
276292
}
277293

278294
[Test]
279295
public void ParseInvalidReflectionName14()
280296
{
281-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32]"));
297+
var context = new SimpleTypeResolveContext(compilation.MainModule);
298+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32]", context));
282299
}
283300

284301
[Test]
285302
public void ParseInvalidReflectionName15()
286303
{
287-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32"));
304+
var context = new SimpleTypeResolveContext(compilation.MainModule);
305+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32", context));
288306
}
289307

290308
[Test]
291309
public void ParseInvalidReflectionName16()
292310
{
293-
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32],[System.String"));
311+
var context = new SimpleTypeResolveContext(compilation.MainModule);
312+
Assert.Throws<ReflectionNameParseException>(() => ReflectionHelper.ParseReflectionName("System.Action`1[[System.Int32],[System.String", context));
294313
}
295314
}
296315
}

ICSharpCode.Decompiler.Tests/TypeSystem/TypeSystemLoaderTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1952,8 +1952,8 @@ public void FindRedirectedType()
19521952
{
19531953
var compilationWithSystemCore = new SimpleCompilation(SystemCore, Mscorlib);
19541954

1955-
var typeRef = ReflectionHelper.ParseReflectionName("System.Func`2, System.Core");
1956-
ITypeDefinition c = typeRef.Resolve(new SimpleTypeResolveContext(compilationWithSystemCore)).GetDefinition();
1955+
var type = ReflectionHelper.ParseReflectionName("System.Func`2, System.Core", new SimpleTypeResolveContext(compilationWithSystemCore));
1956+
ITypeDefinition c = type.GetDefinition();
19571957
Assert.That(c, Is.Not.Null, "System.Func<,> not found");
19581958
Assert.That(c.ParentModule.AssemblyName, Is.EqualTo("mscorlib"));
19591959
}

ICSharpCode.Decompiler/TypeSystem/FullTypeName.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ public FullTypeName(TopLevelTypeName topLevelTypeName)
7878
/// Constructs a FullTypeName by parsing the given reflection name.
7979
/// Note that FullTypeName can only represent type definition names. If the reflection name
8080
/// might refer to a parameterized type or array etc., use
81-
/// <see cref="ReflectionHelper.ParseReflectionName(string)"/> instead.
81+
/// <see cref="ReflectionHelper.ParseReflectionName(string, ITypeResolveContext)"/> instead.
8282
/// </summary>
8383
/// <remarks>
8484
/// Expected syntax: <c>NamespaceName '.' TopLevelTypeName ['`'#] { '+' NestedTypeName ['`'#] }</c>

ICSharpCode.Decompiler/TypeSystem/INamedElement.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@ public interface INamedElement
4646
/// Gets the full reflection name of the element.
4747
/// </summary>
4848
/// <remarks>
49-
/// For types, the reflection name can be parsed back into a ITypeReference by using
50-
/// <see cref="ReflectionHelper.ParseReflectionName(string)"/>.
49+
/// For types, the reflection name can be parsed back into a IType by using
50+
/// <see cref="ReflectionHelper.ParseReflectionName(string, ITypeResolveContext)"/>.
5151
/// </remarks>
5252
/// <returns>
5353
/// "System.Int32[]" for int[]<br/>

ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -260,12 +260,12 @@ public static TypeCode GetTypeCode(this IType type)
260260
/// it will look in all other assemblies of the compilation.
261261
/// </remarks>
262262
/// <seealso cref="FullTypeName(string)"/>
263-
public static ITypeReference ParseReflectionName(string reflectionTypeName)
263+
public static IType ParseReflectionName(string reflectionTypeName, ITypeResolveContext resolveContext)
264264
{
265265
if (reflectionTypeName == null)
266266
throw new ArgumentNullException(nameof(reflectionTypeName));
267267
int pos = 0;
268-
ITypeReference r = ParseReflectionName(reflectionTypeName, ref pos);
268+
IType r = ParseReflectionName(reflectionTypeName, ref pos).Resolve(resolveContext);
269269
if (pos < reflectionTypeName.Length)
270270
throw new ReflectionNameParseException(pos, "Expected end of type name");
271271
return r;

ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,8 +168,7 @@ public IType GetTypeFromSerializedName(string name)
168168
}
169169
try
170170
{
171-
return ReflectionHelper.ParseReflectionName(name)
172-
.Resolve(module != null ? new SimpleTypeResolveContext(module) : new SimpleTypeResolveContext(compilation));
171+
return ReflectionHelper.ParseReflectionName(name, module != null ? new SimpleTypeResolveContext(module) : new SimpleTypeResolveContext(compilation));
173172
}
174173
catch (ReflectionNameParseException ex)
175174
{

ICSharpCode.ILSpyX/Analyzers/Builtin/FindTypeInAttributeDecoder.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,7 @@ public TokenSearchResult GetTypeFromSerializedName(string name)
112112
}
113113
try
114114
{
115-
IType type = ReflectionHelper.ParseReflectionName(name)
116-
.Resolve(new SimpleTypeResolveContext(currentModule));
115+
IType type = ReflectionHelper.ParseReflectionName(name, new SimpleTypeResolveContext(currentModule));
117116
return GetResultFromResolvedType(type);
118117
}
119118
catch (ReflectionNameParseException)

0 commit comments

Comments
 (0)