internal NamespaceChain(MetadataReader reader, NamespaceDefinitionHandle innerMostNamespaceHandle) { NamespaceDefinition currentNamespaceDefinition = innerMostNamespaceHandle.GetNamespaceDefinition(reader); ConstantStringValueHandle currentNameHandle = currentNamespaceDefinition.Name; Handle currentNamespaceHandle = innerMostNamespaceHandle.ToHandle(reader); LowLevelList<String> names = new LowLevelList<String>(); for (;;) { String name = currentNameHandle.GetStringOrNull(reader); names.Add(name); currentNamespaceHandle = currentNamespaceDefinition.ParentScopeOrNamespace; HandleType handleType = currentNamespaceHandle.HandleType; if (handleType == HandleType.ScopeDefinition) break; if (handleType == HandleType.NamespaceDefinition) { NamespaceDefinitionHandle nsHandle = currentNamespaceHandle.ToNamespaceDefinitionHandle(reader); currentNamespaceDefinition = nsHandle.GetNamespaceDefinition(reader); currentNameHandle = currentNamespaceDefinition.Name; continue; } throw new BadImageFormatException(SR.Bif_InvalidMetadata); } DefiningScope = currentNamespaceHandle.ToScopeDefinitionHandle(reader); int count = names.Count; if (count == 0) { // Every namespace chain has to start with the root namespace. throw new BadImageFormatException(); } else if (count == 1) { // The root namespace. For compat with the desktop, TypeInfo.NameSpaces returns null in this case. NameSpace = null; } else { // Namespace has at least one non-root component. StringBuilder sb = new StringBuilder(); int idx = count - 1; while (idx-- != 0) { String name = names[idx]; if (name == null) throw new BadImageFormatException(); // null namespace fragment found in middle. sb.Append(name); if (idx != 0) sb.Append('.'); } NameSpace = sb.ToString(); } }
private LowLevelDictionary<string, QHandle> CreateCaseInsensitiveTypeDictionary() { // // Collect all of the *non-nested* types and type-forwards. // // The keys are full typenames in lower-cased form. // The value is a tuple containing either a TypeDefinitionHandle or TypeForwarderHandle and the associated Reader // for that handle. // // We do not store nested types here. The container type is resolved and chosen first, then the nested type chosen from // that. If we chose the wrong container type and fail the match as a result, that's too bad. (The desktop CLR has the // same issue.) // LowLevelDictionary<string, QHandle> dict = new LowLevelDictionary<string, QHandle>(); foreach (QScopeDefinition scope in AllScopes) { MetadataReader reader = scope.Reader; ScopeDefinition scopeDefinition = scope.ScopeDefinition; IEnumerable<NamespaceDefinitionHandle> topLevelNamespaceHandles = new NamespaceDefinitionHandle[] { scopeDefinition.RootNamespaceDefinition }; IEnumerable<NamespaceDefinitionHandle> allNamespaceHandles = reader.GetTransitiveNamespaces(topLevelNamespaceHandles); foreach (NamespaceDefinitionHandle namespaceHandle in allNamespaceHandles) { string ns = namespaceHandle.ToNamespaceName(reader); if (ns.Length != 0) ns = ns + "."; ns = ns.ToLower(); NamespaceDefinition namespaceDefinition = namespaceHandle.GetNamespaceDefinition(reader); foreach (TypeDefinitionHandle typeDefinitionHandle in namespaceDefinition.TypeDefinitions) { string fullName = ns + typeDefinitionHandle.GetTypeDefinition(reader).Name.GetString(reader).ToLower(); QHandle existingValue; if (!dict.TryGetValue(fullName, out existingValue)) { dict.Add(fullName, new QHandle(reader, typeDefinitionHandle)); } } foreach (TypeForwarderHandle typeForwarderHandle in namespaceDefinition.TypeForwarders) { string fullName = ns + typeForwarderHandle.GetTypeForwarder(reader).Name.GetString(reader).ToLower(); QHandle existingValue; if (!dict.TryGetValue(fullName, out existingValue)) { dict.Add(fullName, new QHandle(reader, typeForwarderHandle)); } } } } return dict; }
private static void AppendNamespaceHashCode(ref HashCodeBuilder builder, NamespaceDefinitionHandle namespaceDefHandle, MetadataReader reader) { NamespaceDefinition namespaceDefinition = reader.GetNamespaceDefinition(namespaceDefHandle); Handle parentHandle = namespaceDefinition.ParentScopeOrNamespace; HandleType parentHandleType = parentHandle.HandleType; if (parentHandleType == HandleType.NamespaceDefinition) { AppendNamespaceHashCode(ref builder, parentHandle.ToNamespaceDefinitionHandle(reader), reader); string namespaceNamePart = reader.GetString(namespaceDefinition.Name); builder.Append(namespaceNamePart); builder.Append("."); } else { Debug.Assert(parentHandleType == HandleType.ScopeDefinition); Debug.Assert(String.IsNullOrEmpty(reader.GetString(namespaceDefinition.Name)), "Root namespace with a name?"); } }
} // Read public static uint Read(this NativeReader reader, uint offset, out NamespaceDefinitionHandle[] values) { uint count; offset = reader.DecodeUnsigned(offset, out count); if (count == 0) { values = s_emptyNamespaceDefinitionHandleArray; } else { values = new NamespaceDefinitionHandle[count]; for (uint i = 0; i < count; ++i) { NamespaceDefinitionHandle tmp; offset = reader.Read(offset, out tmp); values[i] = tmp; } } return offset; } // Read
} // Read public static uint Read(this NativeReader reader, uint offset, out NamespaceDefinitionHandle handle) { uint value; offset = reader.DecodeUnsigned(offset, out value); handle = new NamespaceDefinitionHandle((int)value); handle._Validate(); return offset; } // Read
internal static string GetNamespaceName(this MetadataReader metadataReader, NamespaceDefinitionHandle namespaceDefinitionHandle) { if (namespaceDefinitionHandle.IsNull(metadataReader)) { return null; } else { // TODO! Cache this result, or do something to make it more efficient. NamespaceDefinition namespaceDefinition = namespaceDefinitionHandle.GetNamespaceDefinition(metadataReader); string name = metadataReader.GetString(namespaceDefinition.Name) ?? ""; if (namespaceDefinition.ParentScopeOrNamespace.HandleType == HandleType.NamespaceDefinition) { string parentName = metadataReader.GetNamespaceName(namespaceDefinition.ParentScopeOrNamespace.ToNamespaceDefinitionHandle(metadataReader)); if (!string.IsNullOrEmpty(parentName)) { name = parentName + "." + name; } } return name; } }
} // IsNull internal bool IsNull(NamespaceDefinitionHandle handle) { return (handle._value & 0x00FFFFFF) == 0; } // IsNull
} // ToHandle internal Handle ToHandle(NamespaceDefinitionHandle handle) { return new Handle(handle._value); } // ToHandle
} // GetNamedArgument public NamespaceDefinition GetNamespaceDefinition(NamespaceDefinitionHandle handle) { var record = new NamespaceDefinition() { _reader = this, _handle = handle }; var offset = (uint)handle.Offset; offset = _streamReader.Read(offset, out record._parentScopeOrNamespace); offset = _streamReader.Read(offset, out record._name); offset = _streamReader.Read(offset, out record._typeDefinitions); offset = _streamReader.Read(offset, out record._typeForwarders); offset = _streamReader.Read(offset, out record._namespaceDefinitions); return record; } // GetNamespaceDefinition
} // Equals public bool Equals(NamespaceDefinitionHandle handle) { return _value == handle._value; } // Equals
} // Read public static uint Read(this NativeReader reader, uint offset, out NamespaceDefinitionHandle[] values) { uint count; offset = reader.DecodeUnsigned(offset, out count); #if !NETFX_45 if (count == 0) { values = Array.Empty<NamespaceDefinitionHandle>(); } else #endif { values = new NamespaceDefinitionHandle[count]; for (uint i = 0; i < count; ++i) { NamespaceDefinitionHandle tmp; offset = reader.Read(offset, out tmp); values[i] = tmp; } } return offset; } // Read