diff --git a/ICSharpCode.Decompiler/CSharp/TypeSystem/AliasNamespaceReference.cs b/ICSharpCode.Decompiler/CSharp/TypeSystem/AliasNamespaceReference.cs
deleted file mode 100644
index 1bb991dee..000000000
--- a/ICSharpCode.Decompiler/CSharp/TypeSystem/AliasNamespaceReference.cs
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-
-using ICSharpCode.Decompiler.CSharp.Resolver;
-using ICSharpCode.Decompiler.Semantics;
-using ICSharpCode.Decompiler.TypeSystem;
-
-namespace ICSharpCode.Decompiler.CSharp.TypeSystem
-{
- ///
- /// Looks up an alias (identifier in front of :: operator).
- ///
- ///
- /// The member lookup performed by the :: operator is handled
- /// by .
- ///
- [Serializable]
- public sealed class AliasNamespaceReference : TypeOrNamespaceReference, ISupportsInterning
- {
- readonly string identifier;
-
- public AliasNamespaceReference(string identifier)
- {
- if (identifier == null)
- throw new ArgumentNullException(nameof(identifier));
- this.identifier = identifier;
- }
-
- public string Identifier {
- get { return identifier; }
- }
-
- public override ResolveResult Resolve(CSharpResolver resolver)
- {
- return resolver.ResolveAlias(identifier);
- }
-
- public override IType ResolveType(CSharpResolver resolver)
- {
- // alias cannot refer to types
- return SpecialType.NoType;
- }
-
- public override string ToString()
- {
- return identifier + "::";
- }
-
- int ISupportsInterning.GetHashCodeForInterning()
- {
- return identifier.GetHashCode();
- }
-
- bool ISupportsInterning.EqualsForInterning(ISupportsInterning other)
- {
- AliasNamespaceReference anr = other as AliasNamespaceReference;
- return anr != null && this.identifier == anr.identifier;
- }
- }
-}
diff --git a/ICSharpCode.Decompiler/CSharp/TypeSystem/MemberTypeOrNamespaceReference.cs b/ICSharpCode.Decompiler/CSharp/TypeSystem/MemberTypeOrNamespaceReference.cs
deleted file mode 100644
index 4418f9cd3..000000000
--- a/ICSharpCode.Decompiler/CSharp/TypeSystem/MemberTypeOrNamespaceReference.cs
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-using ICSharpCode.Decompiler.CSharp.Resolver;
-using ICSharpCode.Decompiler.Semantics;
-using ICSharpCode.Decompiler.TypeSystem;
-using ICSharpCode.Decompiler.TypeSystem.Implementation;
-using ICSharpCode.Decompiler.Util;
-
-namespace ICSharpCode.Decompiler.CSharp.TypeSystem
-{
- ///
- /// Reference to a qualified type or namespace name.
- ///
- [Serializable]
- public sealed class MemberTypeOrNamespaceReference : TypeOrNamespaceReference, ISupportsInterning
- {
- readonly TypeOrNamespaceReference target;
- readonly string identifier;
- readonly IList typeArguments;
- readonly NameLookupMode lookupMode;
-
- public MemberTypeOrNamespaceReference(TypeOrNamespaceReference target, string identifier, IList typeArguments, NameLookupMode lookupMode = NameLookupMode.Type)
- {
- if (target == null)
- throw new ArgumentNullException(nameof(target));
- if (identifier == null)
- throw new ArgumentNullException(nameof(identifier));
- this.target = target;
- this.identifier = identifier;
- this.typeArguments = typeArguments ?? EmptyList.Instance;
- this.lookupMode = lookupMode;
- }
-
- public string Identifier {
- get { return identifier; }
- }
-
- public TypeOrNamespaceReference Target {
- get { return target; }
- }
-
- public IList TypeArguments {
- get { return typeArguments; }
- }
-
- public NameLookupMode LookupMode {
- get { return lookupMode; }
- }
-
- ///
- /// Adds a suffix to the identifier.
- /// Does not modify the existing type reference, but returns a new one.
- ///
- public MemberTypeOrNamespaceReference AddSuffix(string suffix)
- {
- return new MemberTypeOrNamespaceReference(target, identifier + suffix, typeArguments, lookupMode);
- }
-
- public override ResolveResult Resolve(CSharpResolver resolver)
- {
- ResolveResult targetRR = target.Resolve(resolver);
- if (targetRR.IsError)
- return targetRR;
- IReadOnlyList typeArgs = typeArguments.Resolve(resolver.CurrentTypeResolveContext);
- return resolver.ResolveMemberAccess(targetRR, identifier, typeArgs, lookupMode);
- }
-
- public override IType ResolveType(CSharpResolver resolver)
- {
- TypeResolveResult trr = Resolve(resolver) as TypeResolveResult;
- return trr != null ? trr.Type : new UnknownType(null, identifier, typeArguments.Count);
- }
-
- public override string ToString()
- {
- if (typeArguments.Count == 0)
- return target.ToString() + "." + identifier;
- else
- return target.ToString() + "." + identifier + "<" + string.Join(",", typeArguments) + ">";
- }
-
- int ISupportsInterning.GetHashCodeForInterning()
- {
- int hashCode = 0;
- unchecked
- {
- hashCode += 1000000007 * target.GetHashCode();
- hashCode += 1000000033 * identifier.GetHashCode();
- hashCode += 1000000087 * typeArguments.GetHashCode();
- hashCode += 1000000021 * (int)lookupMode;
- }
- return hashCode;
- }
-
- bool ISupportsInterning.EqualsForInterning(ISupportsInterning other)
- {
- MemberTypeOrNamespaceReference o = other as MemberTypeOrNamespaceReference;
- return o != null && this.target == o.target
- && this.identifier == o.identifier && this.typeArguments == o.typeArguments
- && this.lookupMode == o.lookupMode;
- }
- }
-}
diff --git a/ICSharpCode.Decompiler/CSharp/TypeSystem/SimpleTypeOrNamespaceReference.cs b/ICSharpCode.Decompiler/CSharp/TypeSystem/SimpleTypeOrNamespaceReference.cs
deleted file mode 100644
index ded6bccbc..000000000
--- a/ICSharpCode.Decompiler/CSharp/TypeSystem/SimpleTypeOrNamespaceReference.cs
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-using System.Collections.Generic;
-
-using ICSharpCode.Decompiler.CSharp.Resolver;
-using ICSharpCode.Decompiler.Semantics;
-using ICSharpCode.Decompiler.TypeSystem;
-using ICSharpCode.Decompiler.TypeSystem.Implementation;
-using ICSharpCode.Decompiler.Util;
-
-namespace ICSharpCode.Decompiler.CSharp.TypeSystem
-{
- ///
- /// Represents a simple C# name. (a single non-qualified identifier with an optional list of type arguments)
- ///
- [Serializable]
- public sealed class SimpleTypeOrNamespaceReference : TypeOrNamespaceReference, ISupportsInterning
- {
- readonly string identifier;
- readonly IList typeArguments;
- readonly NameLookupMode lookupMode;
-
- public SimpleTypeOrNamespaceReference(string identifier, IList typeArguments, NameLookupMode lookupMode = NameLookupMode.Type)
- {
- if (identifier == null)
- throw new ArgumentNullException(nameof(identifier));
- this.identifier = identifier;
- this.typeArguments = typeArguments ?? EmptyList.Instance;
- this.lookupMode = lookupMode;
- }
-
- public string Identifier {
- get { return identifier; }
- }
-
- public IList TypeArguments {
- get { return typeArguments; }
- }
-
- public NameLookupMode LookupMode {
- get { return lookupMode; }
- }
-
- ///
- /// Adds a suffix to the identifier.
- /// Does not modify the existing type reference, but returns a new one.
- ///
- public SimpleTypeOrNamespaceReference AddSuffix(string suffix)
- {
- return new SimpleTypeOrNamespaceReference(identifier + suffix, typeArguments, lookupMode);
- }
-
- public override ResolveResult Resolve(CSharpResolver resolver)
- {
- var typeArgs = typeArguments.Resolve(resolver.CurrentTypeResolveContext);
- return resolver.LookupSimpleNameOrTypeName(identifier, typeArgs, lookupMode);
- }
-
- public override IType ResolveType(CSharpResolver resolver)
- {
- TypeResolveResult trr = Resolve(resolver) as TypeResolveResult;
- return trr != null ? trr.Type : new UnknownType(null, identifier, typeArguments.Count);
- }
-
- public override string ToString()
- {
- if (typeArguments.Count == 0)
- return identifier;
- else
- return identifier + "<" + string.Join(",", typeArguments) + ">";
- }
-
- int ISupportsInterning.GetHashCodeForInterning()
- {
- int hashCode = 0;
- unchecked
- {
- hashCode += 1000000021 * identifier.GetHashCode();
- hashCode += 1000000033 * typeArguments.GetHashCode();
- hashCode += 1000000087 * (int)lookupMode;
- }
- return hashCode;
- }
-
- bool ISupportsInterning.EqualsForInterning(ISupportsInterning other)
- {
- SimpleTypeOrNamespaceReference o = other as SimpleTypeOrNamespaceReference;
- return o != null && this.identifier == o.identifier
- && this.typeArguments == o.typeArguments && this.lookupMode == o.lookupMode;
- }
- }
-}
diff --git a/ICSharpCode.Decompiler/CSharp/TypeSystem/TypeOrNamespaceReference.cs b/ICSharpCode.Decompiler/CSharp/TypeSystem/TypeOrNamespaceReference.cs
deleted file mode 100644
index c9ed00c32..000000000
--- a/ICSharpCode.Decompiler/CSharp/TypeSystem/TypeOrNamespaceReference.cs
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-
-using ICSharpCode.Decompiler.CSharp.Resolver;
-using ICSharpCode.Decompiler.Semantics;
-using ICSharpCode.Decompiler.TypeSystem;
-
-namespace ICSharpCode.Decompiler.CSharp.TypeSystem
-{
- ///
- /// Represents a reference which could point to a type or namespace.
- ///
- [Serializable]
- public abstract class TypeOrNamespaceReference : ITypeReference
- {
- ///
- /// Resolves the reference and returns the ResolveResult.
- ///
- public abstract ResolveResult Resolve(CSharpResolver resolver);
-
- ///
- /// Returns the type that is referenced; or an UnknownType if the type isn't found.
- ///
- public abstract IType ResolveType(CSharpResolver resolver);
-
- ///
- /// Returns the namespace that is referenced; or null if no such namespace is found.
- ///
- public INamespace ResolveNamespace(CSharpResolver resolver)
- {
- NamespaceResolveResult nrr = Resolve(resolver) as NamespaceResolveResult;
- return nrr != null ? nrr.Namespace : null;
- }
-
- IType ITypeReference.Resolve(ITypeResolveContext context)
- {
- // Strictly speaking, we might have to resolve the type in a nested compilation, similar
- // to what we're doing with ConstantExpression.
- // However, in almost all cases this will work correctly - if the resulting type is only available in the
- // nested compilation and not in this, we wouldn't be able to map it anyways.
- var ctx = context as CSharpTypeResolveContext;
- if (ctx == null)
- {
- ctx = new CSharpTypeResolveContext(context.CurrentModule ?? context.Compilation.MainModule, null, context.CurrentTypeDefinition, context.CurrentMember);
- }
- return ResolveType(new CSharpResolver(ctx));
-
- // A potential issue might be this scenario:
-
- // Assembly 1:
- // class A { public class Nested {} }
-
- // Assembly 2: (references asm 1)
- // class B : A {}
-
- // Assembly 3: (references asm 1 and 2)
- // class C { public B.Nested Field; }
-
- // Assembly 4: (references asm 1 and 3, but not 2):
- // uses C.Field;
-
- // Here we would not be able to resolve 'B.Nested' in the compilation of assembly 4, as type B is missing there.
- }
- }
-}
diff --git a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj
index 284298a19..6d12fb24f 100644
--- a/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj
+++ b/ICSharpCode.Decompiler/ICSharpCode.Decompiler.csproj
@@ -335,12 +335,8 @@
-
-
-
-
@@ -620,7 +616,6 @@
-
diff --git a/ICSharpCode.Decompiler/TypeSystem/Implementation/GetClassTypeReference.cs b/ICSharpCode.Decompiler/TypeSystem/Implementation/GetClassTypeReference.cs
deleted file mode 100644
index 0c161ca5c..000000000
--- a/ICSharpCode.Decompiler/TypeSystem/Implementation/GetClassTypeReference.cs
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2010-2013 AlphaSierraPapa for the SharpDevelop Team
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy of this
-// software and associated documentation files (the "Software"), to deal in the Software
-// without restriction, including without limitation the rights to use, copy, modify, merge,
-// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
-// to whom the Software is furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in all copies or
-// substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-// DEALINGS IN THE SOFTWARE.
-
-using System;
-
-namespace ICSharpCode.Decompiler.TypeSystem.Implementation
-{
- ///
- /// Type Reference used when the fully qualified type name is known.
- ///
- [Serializable]
- public sealed class GetClassTypeReference : ITypeReference, ISupportsInterning
- {
- readonly IModuleReference module;
- readonly FullTypeName fullTypeName;
- readonly bool? isReferenceType;
-
- ///
- /// Creates a new GetClassTypeReference that searches a type definition.
- ///
- /// The full name of the type.
- /// A reference to the module containing this type.
- /// If this parameter is null, the GetClassTypeReference will search in all
- /// assemblies belonging to the compilation.
- ///
- public GetClassTypeReference(FullTypeName fullTypeName, IModuleReference module = null, bool? isReferenceType = null)
- {
- this.fullTypeName = fullTypeName;
- this.module = module;
- this.isReferenceType = isReferenceType;
- }
-
- ///
- /// Creates a new GetClassTypeReference that searches a top-level type in all assemblies.
- ///
- /// The namespace name containing the type, e.g. "System.Collections.Generic".
- /// The name of the type, e.g. "List".
- /// The number of type parameters, (e.g. 1 for List<T>).
- public GetClassTypeReference(string namespaceName, string name, int typeParameterCount = 0, bool? isReferenceType = null)
- {
- this.fullTypeName = new TopLevelTypeName(namespaceName, name, typeParameterCount);
- this.isReferenceType = isReferenceType;
- }
-
- ///
- /// Creates a new GetClassTypeReference that searches a top-level type in the specified assembly.
- ///
- /// A reference to the assembly containing this type.
- /// If this parameter is null, the GetClassTypeReference will search in all assemblies belonging to the ICompilation.
- /// The namespace name containing the type, e.g. "System.Collections.Generic".
- /// The name of the type, e.g. "List".
- /// The number of type parameters, (e.g. 1 for List<T>).
- public GetClassTypeReference(IModuleReference module, string namespaceName, string name, int typeParameterCount = 0, bool? isReferenceType = null)
- {
- this.module = module;
- this.fullTypeName = new TopLevelTypeName(namespaceName, name, typeParameterCount);
- this.isReferenceType = isReferenceType;
- }
-
- ///
- /// Gets the assembly reference.
- /// This property returns null if the GetClassTypeReference is searching in all assemblies
- /// of the compilation.
- ///
- public IModuleReference Module { get { return module; } }
-
- ///
- /// Gets the full name of the type this reference is searching for.
- ///
- public FullTypeName FullTypeName { get { return fullTypeName; } }
-
- internal static IType ResolveInAllAssemblies(ICompilation compilation, in FullTypeName fullTypeName)
- {
- foreach (var asm in compilation.Modules)
- {
- IType type = asm.GetTypeDefinition(fullTypeName);
- if (type != null)
- return type;
- }
- return null;
- }
-
- public IType Resolve(ITypeResolveContext context)
- {
- if (context == null)
- throw new ArgumentNullException(nameof(context));
-
- IType type = null;
- if (module == null)
- {
- // No assembly specified: look in all assemblies, but prefer the current assembly
- if (context.CurrentModule != null)
- {
- type = context.CurrentModule.GetTypeDefinition(fullTypeName);
- }
- if (type == null)
- {
- type = ResolveInAllAssemblies(context.Compilation, in fullTypeName);
- }
- }
- else
- {
- // Assembly specified: only look in the specified assembly.
- // But if that's not loaded in the compilation, allow fall back to other assemblies.
- // (the non-loaded assembly might be a facade containing type forwarders -
- // for example, when referencing a portable library from a non-portable project)
- IModule asm = module.Resolve(context);
- if (asm != null)
- {
- type = asm.GetTypeDefinition(fullTypeName);
- }
- else
- {
- type = ResolveInAllAssemblies(context.Compilation, in fullTypeName);
- }
- }
- return type ?? new UnknownType(fullTypeName, isReferenceType);
- }
-
- public override string ToString()
- {
- return fullTypeName.ToString() + (module != null ? ", " + module.ToString() : null);
- }
-
- int ISupportsInterning.GetHashCodeForInterning()
- {
- unchecked
- {
- return 33 * module.GetHashCode() + fullTypeName.GetHashCode();
- }
- }
-
- bool ISupportsInterning.EqualsForInterning(ISupportsInterning other)
- {
- GetClassTypeReference o = other as GetClassTypeReference;
- return o != null && module == o.module && fullTypeName == o.fullTypeName && isReferenceType == o.isReferenceType;
- }
- }
-}
diff --git a/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs b/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs
index de3416191..1c9a0664b 100644
--- a/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/ReflectionHelper.cs
@@ -17,7 +17,6 @@
// DEALINGS IN THE SOFTWARE.
using System;
-using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection.Metadata;
@@ -257,231 +256,6 @@ namespace ICSharpCode.Decompiler.TypeSystem
}
}
- static bool IsReflectionNameSpecialCharacter(char c)
- {
- switch (c)
- {
- case '+':
- case '`':
- case '[':
- case ']':
- case ',':
- case '*':
- case '&':
- return true;
- default:
- return false;
- }
- }
-
- ///
- /// Parses the reflection name starting at pos.
- /// If local is true, only parses local type names, not assembly qualified type names.
- ///
- static ITypeReference ParseReflectionName(string reflectionTypeName, ref int pos, bool local = false)
- {
- if (pos == reflectionTypeName.Length)
- throw new ReflectionNameParseException(pos, "Unexpected end");
- ITypeReference reference;
- if (reflectionTypeName[pos] == '`')
- {
- // type parameter reference
- pos++;
- if (pos == reflectionTypeName.Length)
- throw new ReflectionNameParseException(pos, "Unexpected end");
- if (reflectionTypeName[pos] == '`')
- {
- // method type parameter reference
- pos++;
- int index = ReadTypeParameterCount(reflectionTypeName, ref pos);
- reference = TypeParameterReference.Create(SymbolKind.Method, index);
- }
- else
- {
- // class type parameter reference
- int index = ReadTypeParameterCount(reflectionTypeName, ref pos);
- reference = TypeParameterReference.Create(SymbolKind.TypeDefinition, index);
- }
- }
- else
- {
- // not a type parameter reference: read the actual type name
- string typeName = ReadTypeName(reflectionTypeName, ref pos, out int tpc);
- string assemblyName = local ? null : SkipAheadAndReadAssemblyName(reflectionTypeName, pos);
- reference = CreateGetClassTypeReference(assemblyName, typeName, tpc);
- }
- // read type suffixes
- while (pos < reflectionTypeName.Length)
- {
- switch (reflectionTypeName[pos++])
- {
- case '+':
- int tpc;
- string typeName = ReadTypeName(reflectionTypeName, ref pos, out tpc);
- reference = new NestedTypeReference(reference, typeName, tpc);
- break;
- case '*':
- reference = new PointerTypeReference(reference);
- break;
- case '&':
- reference = new ByReferenceTypeReference(reference);
- break;
- case '[':
- // this might be an array or a generic type
- if (pos == reflectionTypeName.Length)
- throw new ReflectionNameParseException(pos, "Unexpected end");
- if (reflectionTypeName[pos] != ']' && reflectionTypeName[pos] != ',')
- {
- // it's a generic type
- List typeArguments = new List();
- bool first = true;
- while (first || pos < reflectionTypeName.Length && reflectionTypeName[pos] == ',')
- {
- if (first)
- {
- first = false;
- }
- else
- {
- pos++; // skip ','
- }
- if (pos < reflectionTypeName.Length && reflectionTypeName[pos] == '[')
- {
- // non-local type names are enclosed in another set of []
- pos++;
-
- typeArguments.Add(ParseReflectionName(reflectionTypeName, ref pos));
-
- if (pos < reflectionTypeName.Length && reflectionTypeName[pos] == ']')
- pos++;
- else
- throw new ReflectionNameParseException(pos, "Expected end of type argument");
- }
- else
- {
- // local type names occur directly in the outer []
- typeArguments.Add(ParseReflectionName(reflectionTypeName, ref pos, local: true));
- }
- }
-
- if (pos < reflectionTypeName.Length && reflectionTypeName[pos] == ']')
- {
- pos++;
- reference = new ParameterizedTypeReference(reference, typeArguments);
- }
- else
- {
- throw new ReflectionNameParseException(pos, "Expected end of generic type");
- }
- }
- else
- {
- // it's an array
- int dimensions = 1;
- while (pos < reflectionTypeName.Length && reflectionTypeName[pos] == ',')
- {
- dimensions++;
- pos++;
- }
- if (pos < reflectionTypeName.Length && reflectionTypeName[pos] == ']')
- {
- pos++; // end of array
- reference = new ArrayTypeReference(reference, dimensions);
- }
- else
- {
- throw new ReflectionNameParseException(pos, "Invalid array modifier");
- }
- }
- break;
- case ',' when !local:
- // assembly qualified name, ignore everything up to the end/next ']'
- while (pos < reflectionTypeName.Length && reflectionTypeName[pos] != ']')
- pos++;
- break;
- default:
- pos--; // reset pos to the character we couldn't read
- if (reflectionTypeName[pos] == ']' || reflectionTypeName[pos] == ',')
- return reference; // return from a nested generic
- else
- throw new ReflectionNameParseException(pos, "Unexpected character: '" + reflectionTypeName[pos] + "'");
- }
- }
- return reference;
- }
-
- static ITypeReference CreateGetClassTypeReference(string assemblyName, string typeName, int tpc)
- {
- IModuleReference assemblyReference;
- if (assemblyName != null)
- {
- assemblyReference = new DefaultAssemblyReference(assemblyName);
- }
- else
- {
- assemblyReference = null;
- }
- int pos = typeName.LastIndexOf('.');
- if (pos < 0)
- return new GetClassTypeReference(assemblyReference, string.Empty, typeName, tpc);
- else
- return new GetClassTypeReference(assemblyReference, typeName.Substring(0, pos), typeName.Substring(pos + 1), tpc);
- }
-
- static string SkipAheadAndReadAssemblyName(string reflectionTypeName, int pos)
- {
- int nestingLevel = 0;
- while (pos < reflectionTypeName.Length)
- {
- switch (reflectionTypeName[pos++])
- {
- case '[':
- nestingLevel++;
- break;
- case ']':
- if (nestingLevel == 0)
- return null;
- nestingLevel--;
- break;
- case ',':
- if (nestingLevel == 0)
- {
- // first skip the whitespace
- while (pos < reflectionTypeName.Length && reflectionTypeName[pos] == ' ')
- pos++;
- // everything up to the end/next ']' is the assembly name
- int endPos = pos;
- while (endPos < reflectionTypeName.Length && reflectionTypeName[endPos] != ']')
- endPos++;
- return reflectionTypeName.Substring(pos, endPos - pos);
- }
- break;
- }
- }
- return null;
- }
-
- static string ReadTypeName(string reflectionTypeName, ref int pos, out int tpc)
- {
- int startPos = pos;
- // skip the simple name portion:
- while (pos < reflectionTypeName.Length && !IsReflectionNameSpecialCharacter(reflectionTypeName[pos]))
- pos++;
- if (pos == startPos)
- throw new ReflectionNameParseException(pos, "Expected type name");
- string typeName = reflectionTypeName.Substring(startPos, pos - startPos);
- if (pos < reflectionTypeName.Length && reflectionTypeName[pos] == '`')
- {
- pos++;
- tpc = ReadTypeParameterCount(reflectionTypeName, ref pos);
- }
- else
- {
- tpc = 0;
- }
- return typeName;
- }
-
internal static int ReadTypeParameterCount(string reflectionTypeName, ref int pos)
{
int startPos = pos;
diff --git a/ICSharpCode.Decompiler/TypeSystem/TupleType.cs b/ICSharpCode.Decompiler/TypeSystem/TupleType.cs
index d77387f4f..8a4d9c2c9 100644
--- a/ICSharpCode.Decompiler/TypeSystem/TupleType.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/TupleType.cs
@@ -375,44 +375,6 @@ namespace ICSharpCode.Decompiler.TypeSystem
}
}
- public class TupleTypeReference : ITypeReference
- {
- ///
- /// Gets the types of the tuple elements.
- ///
- public ImmutableArray ElementTypes { get; }
-
- ///
- /// Gets the names of the tuple elements.
- ///
- public ImmutableArray ElementNames { get; }
-
- public IModuleReference ValueTupleAssembly { get; }
-
- public TupleTypeReference(ImmutableArray elementTypes)
- {
- this.ElementTypes = elementTypes;
- }
-
- public TupleTypeReference(ImmutableArray elementTypes,
- ImmutableArray elementNames = default(ImmutableArray),
- IModuleReference valueTupleAssembly = null)
- {
- this.ValueTupleAssembly = valueTupleAssembly;
- this.ElementTypes = elementTypes;
- this.ElementNames = elementNames;
- }
-
- public IType Resolve(ITypeResolveContext context)
- {
- return new TupleType(context.Compilation,
- ElementTypes.Select(t => t.Resolve(context)).ToImmutableArray(),
- ElementNames,
- ValueTupleAssembly?.Resolve(context)
- );
- }
- }
-
public static class TupleTypeExtensions
{
public static IType TupleUnderlyingTypeOrSelf(this IType type)
diff --git a/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs b/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs
index 1262beef9..6d60033a0 100644
--- a/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs
+++ b/ICSharpCode.Decompiler/TypeSystem/TypeProvider.cs
@@ -148,14 +148,19 @@ namespace ICSharpCode.Decompiler.TypeSystem
{
IModule resolvedModule = module?.GetDeclaringModule(handle);
var fullTypeName = handle.GetFullTypeName(reader);
- IType type;
+ IType type = null;
if (resolvedModule != null)
{
type = resolvedModule.GetTypeDefinition(fullTypeName);
}
else
{
- type = GetClassTypeReference.ResolveInAllAssemblies(compilation, in fullTypeName);
+ foreach (var asm in compilation.Modules)
+ {
+ type = asm.GetTypeDefinition(fullTypeName);
+ if (type != null)
+ return type;
+ }
}
return type ?? new UnknownType(fullTypeName, IsReferenceType(reader, handle, rawTypeKind));
}