@ -51,6 +51,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -51,6 +51,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
// lazy-loaded:
IAttribute [ ] customAttributes ;
IMember [ ] members ;
IField [ ] fields ;
IProperty [ ] properties ;
IEvent [ ] events ;
IMethod [ ] methods ;
List < IType > directBaseTypes ;
string defaultMemberName ;
internal MetadataTypeDefinition ( MetadataAssembly assembly , TypeDefinitionHandle handle )
{
@ -65,7 +72,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -65,7 +72,13 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
// Find DeclaringType + KnownTypeCode:
if ( fullTypeName . IsNested ) {
this . DeclaringTypeDefinition = assembly . GetDefinition ( td . GetDeclaringType ( ) ) ;
// Create type parameters:
this . TypeParameters = MetadataTypeParameter . Create ( assembly , this . DeclaringTypeDefinition , this , td . GetGenericParameters ( ) ) ;
} else {
// Create type parameters:
this . TypeParameters = MetadataTypeParameter . Create ( assembly , this , td . GetGenericParameters ( ) ) ;
var topLevelTypeName = fullTypeName . TopLevelTypeName ;
for ( int i = 0 ; i < KnownTypeReference . KnownTypeCodeCount ; i + + ) {
var ktr = KnownTypeReference . Get ( ( KnownTypeCode ) i ) ;
@ -92,8 +105,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -92,8 +105,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
} else {
this . Kind = TypeKind . Class ;
}
// Create type parameters:
this . TypeParameters = MetadataTypeParameter . Create ( assembly , this , td . GetGenericParameters ( ) ) ;
}
public override string ToString ( )
@ -119,8 +130,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -119,8 +130,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
}
#region Members
IMember [ ] members ;
public IReadOnlyList < IMember > Members {
get {
var members = LazyInit . VolatileRead ( ref this . members ) ;
@ -131,8 +140,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -131,8 +140,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
}
}
IField [ ] fields ;
public IEnumerable < IField > Fields {
get {
var fields = LazyInit . VolatileRead ( ref this . fields ) ;
@ -152,8 +159,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -152,8 +159,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
}
}
IProperty [ ] properties ;
public IEnumerable < IProperty > Properties {
get {
var properties = LazyInit . VolatileRead ( ref this . properties ) ;
@ -169,8 +174,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -169,8 +174,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
}
}
IEvent [ ] events ;
public IEnumerable < IEvent > Events {
get {
var events = LazyInit . VolatileRead ( ref this . events ) ;
@ -186,8 +189,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -186,8 +189,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
}
}
IMethod [ ] methods ;
public IEnumerable < IMethod > Methods {
get {
var methods = LazyInit . VolatileRead ( ref this . methods ) ;
@ -199,6 +200,14 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -199,6 +200,14 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
foreach ( MethodDefinitionHandle h in methodsCollection ) {
methodsList . Add ( assembly . GetDefinition ( h ) ) ;
}
if ( this . Kind = = TypeKind . Struct | | this . Kind = = TypeKind . Enum ) {
methodsList . Add ( new FakeMethod ( Compilation , SymbolKind . Constructor ) {
DeclaringType = this ,
Name = ".ctor" ,
ReturnType = Compilation . FindType ( KnownTypeCode . Void ) ,
Accessibility = IsAbstract ? Accessibility . Protected : Accessibility . Public ,
} ) ;
}
return LazyInit . GetOrSet ( ref this . methods , methodsList . ToArray ( ) ) ;
}
}
@ -225,8 +234,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -225,8 +234,6 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
IReadOnlyList < IType > IType . TypeArguments = > TypeParameters ;
List < IType > directBaseTypes ;
public IEnumerable < IType > DirectBaseTypes {
get {
var baseTypes = LazyInit . VolatileRead ( ref this . directBaseTypes ) ;
@ -335,6 +342,27 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
@@ -335,6 +342,27 @@ namespace ICSharpCode.Decompiler.TypeSystem.Implementation
return b . Build ( ) ;
}
public string DefaultMemberName {
get {
string defaultMemberName = LazyInit . VolatileRead ( ref this . defaultMemberName ) ;
if ( defaultMemberName ! = null )
return defaultMemberName ;
var metadata = assembly . metadata ;
var typeDefinition = metadata . GetTypeDefinition ( handle ) ;
foreach ( var h in typeDefinition . GetCustomAttributes ( ) ) {
var a = metadata . GetCustomAttribute ( h ) ;
if ( ! a . IsKnownAttribute ( metadata , KnownAttribute . DefaultMember ) )
continue ;
var value = a . DecodeValue ( assembly . TypeProvider ) ;
if ( value . FixedArguments . Length = = 1 & & value . FixedArguments [ 0 ] . Value is string name ) {
defaultMemberName = name ;
break ;
}
}
return LazyInit . GetOrSet ( ref this . defaultMemberName , defaultMemberName ? ? "Item" ) ;
}
}
#endregion
public Accessibility Accessibility {