|
|
|
@ -54,10 +54,10 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -54,10 +54,10 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
accessibility = part.Accessibility; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
IReadOnlyList<ITypeParameter> typeParameters; |
|
|
|
|
|
|
|
|
|
IList<ITypeParameter> typeParameters; |
|
|
|
|
|
|
|
|
|
public IList<ITypeParameter> TypeParameters { |
|
|
|
|
public IReadOnlyList<ITypeParameter> TypeParameters { |
|
|
|
|
get { |
|
|
|
|
var result = LazyInit.VolatileRead(ref this.typeParameters); |
|
|
|
|
if (result != null) { |
|
|
|
@ -83,30 +83,32 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -83,30 +83,32 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
return LazyInit.GetOrSet(ref this.typeParameters, result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
IReadOnlyList<IAttribute> attributes; |
|
|
|
|
|
|
|
|
|
IList<IAttribute> attributes; |
|
|
|
|
|
|
|
|
|
public IList<IAttribute> Attributes { |
|
|
|
|
public IReadOnlyList<IAttribute> Attributes { |
|
|
|
|
get { |
|
|
|
|
var result = LazyInit.VolatileRead(ref this.attributes); |
|
|
|
|
if (result != null) { |
|
|
|
|
return result; |
|
|
|
|
} |
|
|
|
|
result = new List<IAttribute>(); |
|
|
|
|
var newResult = new List<IAttribute>(); |
|
|
|
|
var context = parentContext.WithCurrentTypeDefinition(this); |
|
|
|
|
foreach (IUnresolvedTypeDefinition part in parts) { |
|
|
|
|
ITypeResolveContext parentContextForPart = part.CreateResolveContext(context); |
|
|
|
|
foreach (var attr in part.Attributes) { |
|
|
|
|
result.Add(attr.CreateResolvedAttribute(parentContextForPart)); |
|
|
|
|
newResult.Add(attr.CreateResolvedAttribute(parentContextForPart)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (result.Count == 0) |
|
|
|
|
if (newResult.Count == 0) |
|
|
|
|
result = EmptyList<IAttribute>.Instance; |
|
|
|
|
else |
|
|
|
|
result = newResult; |
|
|
|
|
return LazyInit.GetOrSet(ref this.attributes, result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IList<IUnresolvedTypeDefinition> Parts { |
|
|
|
|
public IReadOnlyList<IUnresolvedTypeDefinition> Parts { |
|
|
|
|
get { return parts; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -117,13 +119,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -117,13 +119,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
public virtual TypeKind Kind { |
|
|
|
|
get { return parts[0].Kind; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#region NestedTypes
|
|
|
|
|
IList<ITypeDefinition> nestedTypes; |
|
|
|
|
IReadOnlyList<ITypeDefinition> nestedTypes; |
|
|
|
|
|
|
|
|
|
public IList<ITypeDefinition> NestedTypes { |
|
|
|
|
public IReadOnlyList<ITypeDefinition> NestedTypes { |
|
|
|
|
get { |
|
|
|
|
IList<ITypeDefinition> result = LazyInit.VolatileRead(ref this.nestedTypes); |
|
|
|
|
IReadOnlyList<ITypeDefinition> result = LazyInit.VolatileRead(ref this.nestedTypes); |
|
|
|
|
if (result != null) { |
|
|
|
|
return result; |
|
|
|
|
} else { |
|
|
|
@ -132,7 +134,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -132,7 +134,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
from nestedTypeRef in part.NestedTypes |
|
|
|
|
group nestedTypeRef by new { nestedTypeRef.Name, nestedTypeRef.TypeParameters.Count } into g |
|
|
|
|
select new DefaultResolvedTypeDefinition(new SimpleTypeResolveContext(this), g.ToArray()) |
|
|
|
|
).ToList<ITypeDefinition>().AsReadOnly(); |
|
|
|
|
).ToList<ITypeDefinition>(); |
|
|
|
|
return LazyInit.GetOrSet(ref this.nestedTypes, result); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -140,7 +142,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -140,7 +142,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region Members
|
|
|
|
|
sealed class MemberList : IList<IMember> |
|
|
|
|
sealed class MemberList : IReadOnlyList<IMember> |
|
|
|
|
{ |
|
|
|
|
internal readonly ITypeResolveContext[] contextPerMember; |
|
|
|
|
internal readonly IUnresolvedMember[] unresolvedMembers; |
|
|
|
@ -173,17 +175,12 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -173,17 +175,12 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
} |
|
|
|
|
return LazyInit.GetOrSet(ref resolvedMembers[index], unresolvedMembers[index].CreateResolved(contextPerMember[index])); |
|
|
|
|
} |
|
|
|
|
set { throw new NotSupportedException(); } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int Count { |
|
|
|
|
get { return resolvedMembers.Length; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool ICollection<IMember>.IsReadOnly { |
|
|
|
|
get { return true; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public int IndexOf(IMember item) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < this.Count; i++) { |
|
|
|
@ -193,43 +190,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -193,43 +190,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void IList<IMember>.Insert(int index, IMember item) |
|
|
|
|
{ |
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void IList<IMember>.RemoveAt(int index) |
|
|
|
|
{ |
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ICollection<IMember>.Add(IMember item) |
|
|
|
|
{ |
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ICollection<IMember>.Clear() |
|
|
|
|
{ |
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool ICollection<IMember>.Contains(IMember item) |
|
|
|
|
{ |
|
|
|
|
return IndexOf(item) >= 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ICollection<IMember>.CopyTo(IMember[] array, int arrayIndex) |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < this.Count; i++) { |
|
|
|
|
array[arrayIndex + i] = this[i]; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool ICollection<IMember>.Remove(IMember item) |
|
|
|
|
{ |
|
|
|
|
throw new NotSupportedException(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IEnumerator<IMember> GetEnumerator() |
|
|
|
|
{ |
|
|
|
|
for (int i = 0; i < this.Count; i++) { |
|
|
|
@ -247,7 +207,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -247,7 +207,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
{ |
|
|
|
|
public readonly string Name; |
|
|
|
|
public readonly int TypeParameterCount; |
|
|
|
|
public readonly IList<IParameter> Parameters; |
|
|
|
|
public readonly IReadOnlyList<IParameter> Parameters; |
|
|
|
|
public readonly List<IUnresolvedMethod> Parts = new List<IUnresolvedMethod>(); |
|
|
|
|
public readonly List<ITypeResolveContext> Contexts = new List<ITypeResolveContext>(); |
|
|
|
|
|
|
|
|
@ -336,7 +296,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -336,7 +296,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
return LazyInit.GetOrSet(ref this.memberList, result); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IList<IMember> Members { |
|
|
|
|
public IReadOnlyList<IMember> Members { |
|
|
|
|
get { return GetMemberList(); } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -497,17 +457,12 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -497,17 +457,12 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
get { return parts[0].TypeParameters.Count; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IList<IType> TypeArguments { |
|
|
|
|
public IReadOnlyList<IType> TypeArguments { |
|
|
|
|
get { |
|
|
|
|
// ToList() call is necessary because IList<> isn't covariant
|
|
|
|
|
return TypeParameters.ToList<IType>(); |
|
|
|
|
return TypeParameters; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public bool IsParameterized { |
|
|
|
|
get { return false; } |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#region DirectBaseTypes
|
|
|
|
|
IList<IType> directBaseTypes; |
|
|
|
|
|
|
|
|
@ -714,7 +669,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -714,7 +669,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IEnumerable<IType> GetNestedTypes(IList<IType> typeArguments, Predicate<ITypeDefinition> filter = null, GetMemberOptions options = GetMemberOptions.None) |
|
|
|
|
public IEnumerable<IType> GetNestedTypes(IReadOnlyList<IType> typeArguments, Predicate<ITypeDefinition> filter = null, GetMemberOptions options = GetMemberOptions.None) |
|
|
|
|
{ |
|
|
|
|
return GetMembersHelper.GetNestedTypes(this, typeArguments, filter, options); |
|
|
|
|
} |
|
|
|
@ -785,7 +740,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -785,7 +740,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public virtual IEnumerable<IMethod> GetMethods(IList<IType> typeArguments, Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None) |
|
|
|
|
public virtual IEnumerable<IMethod> GetMethods(IReadOnlyList<IType> typeArguments, Predicate<IUnresolvedMethod> filter = null, GetMemberOptions options = GetMemberOptions.None) |
|
|
|
|
{ |
|
|
|
|
return GetMembersHelper.GetMethods(this, typeArguments, filter, options); |
|
|
|
|
} |
|
|
|
@ -884,7 +839,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -884,7 +839,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
return GetInterfaceImplementation(new[] { interfaceMember })[0]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public IList<IMember> GetInterfaceImplementation(IList<IMember> interfaceMembers) |
|
|
|
|
public IReadOnlyList<IMember> GetInterfaceImplementation(IReadOnlyList<IMember> interfaceMembers) |
|
|
|
|
{ |
|
|
|
|
// TODO: review the subtle rules for interface reimplementation,
|
|
|
|
|
// write tests and fix this method.
|
|
|
|
@ -923,7 +878,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -923,7 +878,7 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
|
|
|
|
|
return TypeParameterSubstitution.Identity; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public TypeParameterSubstitution GetSubstitution(IList<IType> methodTypeArguments) |
|
|
|
|
public TypeParameterSubstitution GetSubstitution(IReadOnlyList<IType> methodTypeArguments) |
|
|
|
|
{ |
|
|
|
|
return TypeParameterSubstitution.Identity; |
|
|
|
|
} |
|
|
|
|