// Get the name of a metadata typeRef public string GetMetadataUsageName(MetadataUsage usage) { switch (usage.Type) { case MetadataUsageType.TypeInfo: case MetadataUsageType.Type: return(GetMetadataUsageType(usage).Name); case MetadataUsageType.MethodDef: var method = GetMetadataUsageMethod(usage); return($"{method.DeclaringType.Name}.{method.Name}"); case MetadataUsageType.FieldInfo: var fieldRef = Package.FieldRefs[usage.SourceIndex]; var type = GetMetadataUsageType(usage); var field = type.DeclaredFields.First(f => f.Index == type.Definition.fieldStart + fieldRef.fieldIndex); return($"{type.Name}.{field.Name}"); case MetadataUsageType.StringLiteral: return(Package.StringLiterals[usage.SourceIndex]); case MetadataUsageType.MethodRef: type = GetMetadataUsageType(usage); method = GetMetadataUsageMethod(usage); return($"{type.Name}.{method.Name}"); } throw new NotImplementedException("Unknown metadata usage type: " + usage.Type); }
// Get the type used in a metadata usage public TypeInfo GetMetadataUsageType(MetadataUsage usage) => usage.Type switch {