private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, NamespaceReferenceHandle namespaceRefHandle, MetadataReader reader) { NamespaceReference namespaceReference = reader.GetNamespaceReference(namespaceRefHandle); Handle parentHandle = namespaceReference.ParentScopeOrNamespace; HandleType parentHandleType = parentHandle.HandleType; if (parentHandleType == HandleType.NamespaceReference) { AppendNamespaceHashCode(ref builder, parentHandle.ToNamespaceReferenceHandle(reader), reader); string namespaceNamePart = reader.GetString(namespaceReference.Name); builder.Append(namespaceNamePart); builder.Append("."); } else { Debug.Assert(parentHandleType == HandleType.ScopeReference); Debug.Assert(String.IsNullOrEmpty(reader.GetString(namespaceReference.Name)), "Root namespace with a name?"); } }
} // Read public static uint Read(this NativeReader reader, uint offset, out NamespaceReferenceHandle[] values) { uint count; offset = reader.DecodeUnsigned(offset, out count); if (count == 0) { values = s_emptyNamespaceReferenceHandleArray; } else { values = new NamespaceReferenceHandle[count]; for (uint i = 0; i < count; ++i) { NamespaceReferenceHandle tmp; offset = reader.Read(offset, out tmp); values[i] = tmp; } } return offset; } // Read
} // Read public static uint Read(this NativeReader reader, uint offset, out NamespaceReferenceHandle handle) { uint value; offset = reader.DecodeUnsigned(offset, out value); handle = new NamespaceReferenceHandle((int)value); handle._Validate(); return offset; } // Read
internal static string GetNamespaceName(this MetadataReader metadataReader, NamespaceReferenceHandle namespaceReferenceHandle) { if (namespaceReferenceHandle.IsNull(metadataReader)) { return null; } else { // TODO! Cache this result, or do something to make it more efficient. NamespaceReference namespaceReference = namespaceReferenceHandle.GetNamespaceReference(metadataReader); string name = metadataReader.GetString(namespaceReference.Name) ?? ""; if (namespaceReference.ParentScopeOrNamespace.HandleType == HandleType.NamespaceReference) { string parentName = metadataReader.GetNamespaceName(namespaceReference.ParentScopeOrNamespace.ToNamespaceReferenceHandle(metadataReader)); if (!string.IsNullOrEmpty(parentName)) { name = parentName + "." + name; } } return name; } }
} // IsNull internal bool IsNull(NamespaceReferenceHandle handle) { return (handle._value & 0x00FFFFFF) == 0; } // IsNull
} // ToHandle internal Handle ToHandle(NamespaceReferenceHandle handle) { return new Handle(handle._value); } // ToHandle
} // GetNamespaceDefinition public NamespaceReference GetNamespaceReference(NamespaceReferenceHandle handle) { var record = new NamespaceReference() { _reader = this, _handle = handle }; var offset = (uint)handle.Offset; offset = _streamReader.Read(offset, out record._parentScopeOrNamespace); offset = _streamReader.Read(offset, out record._name); return record; } // GetNamespaceReference
} // Equals public bool Equals(NamespaceReferenceHandle handle) { return _value == handle._value; } // Equals
} // Read public static uint Read(this NativeReader reader, uint offset, out NamespaceReferenceHandle[] values) { uint count; offset = reader.DecodeUnsigned(offset, out count); #if !NETFX_45 if (count == 0) { values = Array.Empty<NamespaceReferenceHandle>(); } else #endif { values = new NamespaceReferenceHandle[count]; for (uint i = 0; i < count; ++i) { NamespaceReferenceHandle tmp; offset = reader.Read(offset, out tmp); values[i] = tmp; } } return offset; } // Read