mirror of https://github.com/icsharpcode/ILSpy.git
9 changed files with 7 additions and 815 deletions
@ -1,77 +0,0 @@
@@ -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 |
||||
{ |
||||
/// <summary>
|
||||
/// Looks up an alias (identifier in front of :: operator).
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The member lookup performed by the :: operator is handled
|
||||
/// by <see cref="MemberTypeOrNamespaceReference"/>.
|
||||
/// </remarks>
|
||||
[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; |
||||
} |
||||
} |
||||
} |
||||
@ -1,122 +0,0 @@
@@ -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 |
||||
{ |
||||
/// <summary>
|
||||
/// Reference to a qualified type or namespace name.
|
||||
/// </summary>
|
||||
[Serializable] |
||||
public sealed class MemberTypeOrNamespaceReference : TypeOrNamespaceReference, ISupportsInterning |
||||
{ |
||||
readonly TypeOrNamespaceReference target; |
||||
readonly string identifier; |
||||
readonly IList<ITypeReference> typeArguments; |
||||
readonly NameLookupMode lookupMode; |
||||
|
||||
public MemberTypeOrNamespaceReference(TypeOrNamespaceReference target, string identifier, IList<ITypeReference> 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<ITypeReference>.Instance; |
||||
this.lookupMode = lookupMode; |
||||
} |
||||
|
||||
public string Identifier { |
||||
get { return identifier; } |
||||
} |
||||
|
||||
public TypeOrNamespaceReference Target { |
||||
get { return target; } |
||||
} |
||||
|
||||
public IList<ITypeReference> TypeArguments { |
||||
get { return typeArguments; } |
||||
} |
||||
|
||||
public NameLookupMode LookupMode { |
||||
get { return lookupMode; } |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Adds a suffix to the identifier.
|
||||
/// Does not modify the existing type reference, but returns a new one.
|
||||
/// </summary>
|
||||
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<IType> 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; |
||||
} |
||||
} |
||||
} |
||||
@ -1,109 +0,0 @@
@@ -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 |
||||
{ |
||||
/// <summary>
|
||||
/// Represents a simple C# name. (a single non-qualified identifier with an optional list of type arguments)
|
||||
/// </summary>
|
||||
[Serializable] |
||||
public sealed class SimpleTypeOrNamespaceReference : TypeOrNamespaceReference, ISupportsInterning |
||||
{ |
||||
readonly string identifier; |
||||
readonly IList<ITypeReference> typeArguments; |
||||
readonly NameLookupMode lookupMode; |
||||
|
||||
public SimpleTypeOrNamespaceReference(string identifier, IList<ITypeReference> typeArguments, NameLookupMode lookupMode = NameLookupMode.Type) |
||||
{ |
||||
if (identifier == null) |
||||
throw new ArgumentNullException(nameof(identifier)); |
||||
this.identifier = identifier; |
||||
this.typeArguments = typeArguments ?? EmptyList<ITypeReference>.Instance; |
||||
this.lookupMode = lookupMode; |
||||
} |
||||
|
||||
public string Identifier { |
||||
get { return identifier; } |
||||
} |
||||
|
||||
public IList<ITypeReference> TypeArguments { |
||||
get { return typeArguments; } |
||||
} |
||||
|
||||
public NameLookupMode LookupMode { |
||||
get { return lookupMode; } |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Adds a suffix to the identifier.
|
||||
/// Does not modify the existing type reference, but returns a new one.
|
||||
/// </summary>
|
||||
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; |
||||
} |
||||
} |
||||
} |
||||
@ -1,82 +0,0 @@
@@ -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 |
||||
{ |
||||
/// <summary>
|
||||
/// Represents a reference which could point to a type or namespace.
|
||||
/// </summary>
|
||||
[Serializable] |
||||
public abstract class TypeOrNamespaceReference : ITypeReference |
||||
{ |
||||
/// <summary>
|
||||
/// Resolves the reference and returns the ResolveResult.
|
||||
/// </summary>
|
||||
public abstract ResolveResult Resolve(CSharpResolver resolver); |
||||
|
||||
/// <summary>
|
||||
/// Returns the type that is referenced; or an <c>UnknownType</c> if the type isn't found.
|
||||
/// </summary>
|
||||
public abstract IType ResolveType(CSharpResolver resolver); |
||||
|
||||
/// <summary>
|
||||
/// Returns the namespace that is referenced; or null if no such namespace is found.
|
||||
/// </summary>
|
||||
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.
|
||||
} |
||||
} |
||||
} |
||||
@ -1,154 +0,0 @@
@@ -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 |
||||
{ |
||||
/// <summary>
|
||||
/// Type Reference used when the fully qualified type name is known.
|
||||
/// </summary>
|
||||
[Serializable] |
||||
public sealed class GetClassTypeReference : ITypeReference, ISupportsInterning |
||||
{ |
||||
readonly IModuleReference module; |
||||
readonly FullTypeName fullTypeName; |
||||
readonly bool? isReferenceType; |
||||
|
||||
/// <summary>
|
||||
/// Creates a new GetClassTypeReference that searches a type definition.
|
||||
/// </summary>
|
||||
/// <param name="fullTypeName">The full name of the type.</param>
|
||||
/// <param name="module">A reference to the module containing this type.
|
||||
/// If this parameter is null, the GetClassTypeReference will search in all
|
||||
/// assemblies belonging to the compilation.
|
||||
/// </param>
|
||||
public GetClassTypeReference(FullTypeName fullTypeName, IModuleReference module = null, bool? isReferenceType = null) |
||||
{ |
||||
this.fullTypeName = fullTypeName; |
||||
this.module = module; |
||||
this.isReferenceType = isReferenceType; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Creates a new GetClassTypeReference that searches a top-level type in all assemblies.
|
||||
/// </summary>
|
||||
/// <param name="namespaceName">The namespace name containing the type, e.g. "System.Collections.Generic".</param>
|
||||
/// <param name="name">The name of the type, e.g. "List".</param>
|
||||
/// <param name="typeParameterCount">The number of type parameters, (e.g. 1 for List<T>).</param>
|
||||
public GetClassTypeReference(string namespaceName, string name, int typeParameterCount = 0, bool? isReferenceType = null) |
||||
{ |
||||
this.fullTypeName = new TopLevelTypeName(namespaceName, name, typeParameterCount); |
||||
this.isReferenceType = isReferenceType; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Creates a new GetClassTypeReference that searches a top-level type in the specified assembly.
|
||||
/// </summary>
|
||||
/// <param name="module">A reference to the assembly containing this type.
|
||||
/// If this parameter is null, the GetClassTypeReference will search in all assemblies belonging to the ICompilation.</param>
|
||||
/// <param name="namespaceName">The namespace name containing the type, e.g. "System.Collections.Generic".</param>
|
||||
/// <param name="name">The name of the type, e.g. "List".</param>
|
||||
/// <param name="typeParameterCount">The number of type parameters, (e.g. 1 for List<T>).</param>
|
||||
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; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Gets the assembly reference.
|
||||
/// This property returns null if the GetClassTypeReference is searching in all assemblies
|
||||
/// of the compilation.
|
||||
/// </summary>
|
||||
public IModuleReference Module { get { return module; } } |
||||
|
||||
/// <summary>
|
||||
/// Gets the full name of the type this reference is searching for.
|
||||
/// </summary>
|
||||
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; |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue