private void EmitTypeToken(EcmaType type, SignatureContext context) { ModuleToken token = context.GetModuleTokenForType(type); EmitToken(token.Token); }
public void EmitTypeSignature(TypeDesc typeDesc, SignatureContext context) { if (typeDesc is RuntimeDeterminedType runtimeDeterminedType) { switch (runtimeDeterminedType.RuntimeDeterminedDetailsType.Kind) { case GenericParameterKind.Type: EmitElementType(CorElementType.ELEMENT_TYPE_VAR); break; case GenericParameterKind.Method: EmitElementType(CorElementType.ELEMENT_TYPE_MVAR); break; default: throw new NotImplementedException(); } EmitUInt((uint)runtimeDeterminedType.RuntimeDeterminedDetailsType.Index); return; } if (typeDesc.HasInstantiation && !typeDesc.IsGenericDefinition) { EmitInstantiatedTypeSignature((InstantiatedType)typeDesc, context); return; } switch (typeDesc.Category) { case TypeFlags.Array: EmitArrayTypeSignature((ArrayType)typeDesc, context); return; case TypeFlags.SzArray: EmitSzArrayTypeSignature((ArrayType)typeDesc, context); return; case TypeFlags.Pointer: EmitPointerTypeSignature((PointerType)typeDesc, context); return; case TypeFlags.ByRef: EmitByRefTypeSignature((ByRefType)typeDesc, context); break; case TypeFlags.Void: EmitElementType(CorElementType.ELEMENT_TYPE_VOID); return; case TypeFlags.Boolean: EmitElementType(CorElementType.ELEMENT_TYPE_BOOLEAN); return; case TypeFlags.Char: EmitElementType(CorElementType.ELEMENT_TYPE_CHAR); return; case TypeFlags.SByte: EmitElementType(CorElementType.ELEMENT_TYPE_I1); return; case TypeFlags.Byte: EmitElementType(CorElementType.ELEMENT_TYPE_U1); return; case TypeFlags.Int16: EmitElementType(CorElementType.ELEMENT_TYPE_I2); return; case TypeFlags.UInt16: EmitElementType(CorElementType.ELEMENT_TYPE_U2); return; case TypeFlags.Int32: EmitElementType(CorElementType.ELEMENT_TYPE_I4); return; case TypeFlags.UInt32: EmitElementType(CorElementType.ELEMENT_TYPE_U4); return; case TypeFlags.Int64: EmitElementType(CorElementType.ELEMENT_TYPE_I8); return; case TypeFlags.UInt64: EmitElementType(CorElementType.ELEMENT_TYPE_U8); return; case TypeFlags.IntPtr: EmitElementType(CorElementType.ELEMENT_TYPE_I); return; case TypeFlags.UIntPtr: EmitElementType(CorElementType.ELEMENT_TYPE_U); return; case TypeFlags.Single: EmitElementType(CorElementType.ELEMENT_TYPE_R4); return; case TypeFlags.Double: EmitElementType(CorElementType.ELEMENT_TYPE_R8); return; case TypeFlags.Interface: case TypeFlags.Class: if (typeDesc.IsString) { EmitElementType(CorElementType.ELEMENT_TYPE_STRING); } else if (typeDesc.IsObject) { EmitElementType(CorElementType.ELEMENT_TYPE_OBJECT); } else if (typeDesc.IsCanonicalDefinitionType(CanonicalFormKind.Specific)) { EmitElementType(CorElementType.ELEMENT_TYPE_CANON_ZAPSIG); } else { ModuleToken token = context.GetModuleTokenForType((EcmaType)typeDesc); EmitModuleOverride(token.Module, context); EmitElementType(CorElementType.ELEMENT_TYPE_CLASS); EmitToken(token.Token); } return; case TypeFlags.ValueType: case TypeFlags.Nullable: case TypeFlags.Enum: if (typeDesc.IsWellKnownType(WellKnownType.TypedReference)) { EmitElementType(CorElementType.ELEMENT_TYPE_TYPEDBYREF); return; } { ModuleToken token = context.GetModuleTokenForType((EcmaType)typeDesc); EmitModuleOverride(token.Module, context); EmitElementType(CorElementType.ELEMENT_TYPE_VALUETYPE); EmitToken(token.Token); return; } default: throw new NotImplementedException(); } }