/// <summary> /// This method resolves TypeRef as a non exported type. i.e. the said type reference refers to the type /// in the type def table direcly rather than exported type table of the assembly. /// </summary> /// <param name="moduleTypeRefReference"></param> /// <returns></returns> internal TypeBase/*?*/ ResolveModuleTypeRefReference( TypeRefReference moduleTypeRefReference ) { uint typeRefRowId = moduleTypeRefReference.TypeRefRowId; if (typeRefRowId == 0) { return null; } TypeRefRow typeRefRow = this.PEFileReader.TypeRefTable[typeRefRowId]; IName namespaceName = this.GetNameFromOffset(typeRefRow.Namespace); IName typeName = moduleTypeRefReference.MangledTypeName; uint resolutionScope = typeRefRow.ResolutionScope; uint tokenType = resolutionScope & TokenTypeIds.TokenTypeMask; uint rowId = resolutionScope & TokenTypeIds.RIDMask; TypeBase/*?*/ retModuleType = null; switch (tokenType) { case TokenTypeIds.Module: retModuleType = this.ResolveNamespaceTypeDefinition(namespaceName, typeName); break; case TokenTypeIds.ModuleRef: { ModuleReference/*?*/ modRef = this.GetModuleReferenceAt(rowId); if (modRef != null) { Module/*?*/ module = this.ResolveModuleRefReference(modRef); if (module != null) { PEFileToObjectModel modulePEFileToObjectModel = module.PEFileToObjectModel; retModuleType = modulePEFileToObjectModel.ResolveNamespaceTypeDefinition(namespaceName, typeName); if (retModuleType != null) return retModuleType; } } break; } case TokenTypeIds.AssemblyRef: { AssemblyReference/*?*/ assemRef = this.GetAssemblyReferenceAt(rowId); if (assemRef == null) { return null; } var internalAssembly = assemRef.ResolvedAssembly as Assembly; if (internalAssembly != null) { PEFileToObjectModel assemblyPEFileToObjectModel = internalAssembly.PEFileToObjectModel; retModuleType = assemblyPEFileToObjectModel.ResolveNamespaceTypeDefinition(namespaceName, typeName); if (retModuleType != null) { return retModuleType; } break; } break; } case TokenTypeIds.TypeRef: { TypeRefReference/*?*/ parentTypeReference = this.GetTypeRefReferenceAtRowWorker(rowId); if (parentTypeReference == null) { return null; } TypeBase/*?*/ parentModuleType = this.ResolveModuleTypeRefReference(parentTypeReference); if (parentModuleType != null) { retModuleType = parentModuleType.PEFileToObjectModel.ResolveNestedTypeDefinition(parentModuleType, typeName); } break; } default: break; } return retModuleType; }
//^ invariant this.PEFileReader.TypeSpecTable.NumberOfRows >= 1 ==> this.ModuleTypeSpecHashtable != null; TypeRefReference CreateTypeRefReference( uint typeRefRowId, TypeRefRow typeRefRow, TypeRefReference/*?*/ parentModuleTypeReference, IModuleModuleReference moduleReference, ModuleSignatureTypeCode signatureTypeCode ) { IName mangledTypeName = this.GetNameFromOffset(typeRefRow.Name); ushort genericParamCount; string typeName; TypeCache.SplitMangledTypeName(mangledTypeName.Value, out typeName, out genericParamCount); TypeRefReference moduleTypeRefReference; if (parentModuleTypeReference == null) { IName namespaceFullName = this.GetNameFromOffset(typeRefRow.Namespace); NamespaceReference namespaceReference = this.GetNamespaceReferenceForString(moduleReference, namespaceFullName); if (genericParamCount == 0) { if (signatureTypeCode == ModuleSignatureTypeCode.NotModulePrimitive) { moduleTypeRefReference = new NamespaceTypeRefReferenceWithoutPrimitiveTypeCode( this, mangledTypeName, typeRefRowId, moduleReference, namespaceReference, signatureTypeCode == ModuleSignatureTypeCode.ValueType ); } else { moduleTypeRefReference = new NamespaceTypeRefReferenceWithPrimitiveTypeCode( this, mangledTypeName, typeRefRowId, moduleReference, namespaceReference, signatureTypeCode ); } } else { IName iTypeName = this.NameTable.GetNameFor(typeName); moduleTypeRefReference = new GenericNamespaceTypeRefReference( this, iTypeName, typeRefRowId, moduleReference, namespaceReference, mangledTypeName, genericParamCount, signatureTypeCode == ModuleSignatureTypeCode.ValueType ); } } else { if (genericParamCount == 0) { moduleTypeRefReference = new NonGenericNestedTypeRefReference( this, mangledTypeName, typeRefRowId, moduleReference, parentModuleTypeReference, signatureTypeCode == ModuleSignatureTypeCode.ValueType ); } else { IName iTypeName = this.NameTable.GetNameFor(typeName); moduleTypeRefReference = new GenericNestedTypeRefReference( this, iTypeName, typeRefRowId, moduleReference, parentModuleTypeReference, mangledTypeName, genericParamCount, signatureTypeCode == ModuleSignatureTypeCode.ValueType ); } } return moduleTypeRefReference; }