예제 #1
0
 internal override ITypeReference/*?*/ GetAsTypeReference(PEFileToObjectModel peFileToObjectModel, IMetadataReaderModuleReference module) {
   foreach (var aref in peFileToObjectModel.GetAssemblyReferences()) {
     var assemRef = aref as AssemblyReference;
     if (assemRef == null) continue;
     if (assemRef.AssemblyIdentity.Equals(this.AssemblyIdentity))
       return this.TypeName.GetAsTypeReference(peFileToObjectModel, assemRef);
   }
   if (module.ContainingAssembly.AssemblyIdentity.Equals(this.AssemblyIdentity))
     return this.TypeName.GetAsTypeReference(peFileToObjectModel, module);
   AssemblyFlags flags = this.Retargetable ? AssemblyFlags.Retargetable : (AssemblyFlags)0;
   return this.TypeName.GetAsTypeReference(peFileToObjectModel, new AssemblyReference(peFileToObjectModel, 0, this.AssemblyIdentity, flags));
 }
예제 #2
0
 internal override ITypeReference/*?*/ GetAsTypeReference(PEFileToObjectModel peFileToObjectModel, IMetadataReaderModuleReference module) {
   ITypeReference/*?*/ elementType = this.ElementType.GetAsTypeReference(peFileToObjectModel, module);
   if (elementType == null) return null;
   if (this.Rank == 0)
     return Vector.GetVector(elementType, peFileToObjectModel.InternFactory);
   else
     return Matrix.GetMatrix(elementType, this.Rank, peFileToObjectModel.InternFactory);
 }
예제 #3
0
 internal override ITypeReference GetAsTypeReference(
   PEFileToObjectModel peFileToObjectModel,
   IMetadataReaderModuleReference module
 ) {
   ITypeReference/*?*/ targetType = this.TargetType.GetAsTypeReference(peFileToObjectModel, module);
   if (targetType == null) return null;
   return ManagedPointerType.GetManagedPointerType(targetType, peFileToObjectModel.InternFactory);
 }
예제 #4
0
 internal override INamedTypeDefinition/*?*/ ResolveNominalTypeName(IMetadataReaderModuleReference module) {
   var containingType = this.ContainingTypeName.ResolveNominalTypeName(module);
   if (containingType == null) return null;
   return TypeHelper.GetNestedType(containingType, this.UnmangledTypeName, (int)this.GenericParameterCount);
 }
예제 #5
0
 internal override ITypeReference/*?*/ GetAsTypeReference(PEFileToObjectModel peFileToObjectModel, IMetadataReaderModuleReference module) {
   var nominalType = this.GenericTemplate.GetAsNomimalType(peFileToObjectModel, module);
   if (nominalType == null) return null;
   int argumentUsed;
   return this.GetSpecializedTypeReference(peFileToObjectModel, nominalType, out argumentUsed, mostNested: true);
 }
예제 #6
0
 internal override INamedTypeDefinition/*?*/ ResolveNominalTypeName(IMetadataReaderModuleReference module) {
   var readerModule = module.ResolvedModule as Module;
   if (readerModule != null) {
     var peFileToObjectModel = readerModule.PEFileToObjectModel;
     if (this.NamespaceName == null)
       return peFileToObjectModel.ResolveNamespaceTypeDefinition(
         peFileToObjectModel.NameTable.EmptyName,
         this.Name
       );
     else
       return peFileToObjectModel.ResolveNamespaceTypeDefinition(
         this.NamespaceName.FullyQualifiedName,
         this.Name
       );
   }
   IUnitNamespace containingNamespace;
   if (this.NamespaceName == null)
     containingNamespace = module.ResolvedModule.UnitNamespaceRoot;
   else
     containingNamespace = this.NamespaceName.Resolve(module.ResolvedModule);
   if (containingNamespace == null) return null;
   foreach (var member in containingNamespace.GetMembersNamed(this.UnmangledTypeName, false)) {
     var t = member as INamedTypeDefinition;
     if (t != null && t.GenericParameterCount == this.GenericParameterCount) return t;
   }
   var assembly = module as IAssembly;
   if (assembly == null) return null;
   foreach (var alias in assembly.ExportedTypes) {
     var nsAlias = alias as INamespaceAliasForType;
     if (nsAlias == null || nsAlias.Name != this.UnmangledTypeName) continue;
     var aliasedType = nsAlias.AliasedType.ResolvedType;
     if (aliasedType.GenericParameterCount == this.GenericParameterCount) return aliasedType;
   }      
   return null;
 }
예제 #7
0
 internal override IMetadataReaderNamedTypeReference/*?*/ GetAsNomimalType(
   PEFileToObjectModel peFileToObjectModel,
   IMetadataReaderModuleReference module
 ) {
   return new NestedTypeNameTypeReference(module, this, peFileToObjectModel);
 }
예제 #8
0
 internal abstract INamedTypeDefinition/*?*/ ResolveNominalTypeName(IMetadataReaderModuleReference module);
예제 #9
0
 internal override IMetadataReaderNamedTypeReference/*?*/ GetAsNomimalType(
   PEFileToObjectModel peFileToObjectModel,
   IMetadataReaderModuleReference module
 ) {
   var typeRef = new NamespaceTypeNameTypeReference(module, this, peFileToObjectModel);
   var redirectedTypeRef = peFileToObjectModel.ModuleReader.metadataReaderHost.Redirect(peFileToObjectModel.Module, typeRef) as INamespaceTypeReference;
   if (redirectedTypeRef != typeRef && redirectedTypeRef != null) {
     var namespaceName = this.GetNamespaceName(peFileToObjectModel.NameTable, redirectedTypeRef.ContainingUnitNamespace as INestedUnitNamespaceReference);
     var mangledName = redirectedTypeRef.Name;
     if (redirectedTypeRef.GenericParameterCount > 0)
       mangledName = peFileToObjectModel.NameTable.GetNameFor(redirectedTypeRef.Name.Value+"`"+redirectedTypeRef.GenericParameterCount);
     var redirectedNamespaceTypeName = new NamespaceTypeName(peFileToObjectModel.NameTable, namespaceName, mangledName, redirectedTypeRef.Name);
     return new NamespaceTypeNameTypeReference(module, redirectedNamespaceTypeName, peFileToObjectModel);
   }
   return typeRef;
 }
예제 #10
0
 internal IMetadataReaderNamedTypeReference GetAsNamedTypeReference(
   PEFileToObjectModel peFileToObjectModel, IMetadataReaderModuleReference module
 ) {
   return this.GetAsNomimalType(peFileToObjectModel, module);
 }
예제 #11
0
 internal abstract IMetadataReaderNamedTypeReference/*?*/ GetAsNomimalType(
   PEFileToObjectModel peFileToObjectModel,
   IMetadataReaderModuleReference module
 );
예제 #12
0
 internal abstract ITypeReference/*?*/ GetAsTypeReference(
   PEFileToObjectModel peFileToObjectModel,
   IMetadataReaderModuleReference module
 );
예제 #13
0
    //^ invariant this.PEFileReader.TypeSpecTable.NumberOfRows >= 1 ==> this.ModuleTypeSpecHashtable != null;

    TypeRefReference CreateTypeRefReference(
      uint typeRefRowId,
      TypeRefRow typeRefRow,
      IMetadataReaderNamedTypeReference/*?*/ parentModuleTypeReference,
      IMetadataReaderModuleReference moduleReference,
      MetadataReaderSignatureTypeCode 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 == MetadataReaderSignatureTypeCode.NotModulePrimitive) {
            moduleTypeRefReference = new NamespaceTypeRefReferenceWithoutPrimitiveTypeCode(
              this,
              mangledTypeName,
              typeRefRowId,
              moduleReference,
              namespaceReference,
              signatureTypeCode == MetadataReaderSignatureTypeCode.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 == MetadataReaderSignatureTypeCode.ValueType
          );
        }
      } else {
        if (genericParamCount == 0) {
          moduleTypeRefReference = new NonGenericNestedTypeRefReference(
            this,
            mangledTypeName,
            typeRefRowId,
            moduleReference,
            parentModuleTypeReference,
            signatureTypeCode == MetadataReaderSignatureTypeCode.ValueType
          );
        } else {
          IName iTypeName = this.NameTable.GetNameFor(typeName);
          moduleTypeRefReference = new GenericNestedTypeRefReference(
            this,
            iTypeName,
            typeRefRowId,
            moduleReference,
            parentModuleTypeReference,
            mangledTypeName,
            genericParamCount,
            signatureTypeCode == MetadataReaderSignatureTypeCode.ValueType
          );
        }
      }
      return moduleTypeRefReference;
    }
예제 #14
0
 internal NamespaceReference GetNamespaceReferenceForString(
   IMetadataReaderModuleReference moduleReference,
   IName iNamespaceFullName
 ) {
   NamespaceReference/*?*/ retNamespaceReference = this.NamespaceReferenceINameHashtable.Find(moduleReference.InternedModuleId, (uint)iNamespaceFullName.UniqueKey);
   if (retNamespaceReference != null)
     return retNamespaceReference;
   string namespaceFullName = iNamespaceFullName.Value;
   if (namespaceFullName.Length == 0) {
     retNamespaceReference = new RootNamespaceReference(this, moduleReference);
   } else {
     int lastDot = namespaceFullName.LastIndexOf('.');
     string namespaceName = namespaceFullName;
     string namespacePrefix = "";
     if (lastDot != -1) {
       namespacePrefix = namespaceFullName.Substring(0, lastDot);
       namespaceName = namespaceFullName.Substring(lastDot + 1, namespaceFullName.Length - lastDot - 1);
     }
     IName iNamespacePrefix = this.NameTable.GetNameFor(namespacePrefix);
     NamespaceReference parentNamespaceReference = this.GetNamespaceReferenceForString(moduleReference, iNamespacePrefix);
     IName iNamespaceName = this.NameTable.GetNameFor(namespaceName);
     retNamespaceReference = new NestedNamespaceReference(this, iNamespaceName, iNamespaceFullName, parentNamespaceReference);
   }
   this.NamespaceReferenceINameHashtable.Add(moduleReference.InternedModuleId, (uint)iNamespaceFullName.UniqueKey, retNamespaceReference);
   return retNamespaceReference;
 }