private void GenerateMetadataNodes( MetadataNode parentNode, string nodeName, OrderPreservingMultiDictionary <string, MetadataDefinition> .ValueSet definitionsWithSameName) { if (!UnicodeCharacterUtilities.IsValidIdentifier(nodeName)) { return; } var childNode = MetadataNode.Allocate(nodeName); _parentToChildren.Add(parentNode, childNode); // Add all child members var definitionMap = OrderPreservingMultiDictionary <string, MetadataDefinition> .GetInstance(); try { foreach (var definition in definitionsWithSameName) { LookupMetadataDefinitions(definition, definitionMap); } foreach (var kvp in definitionMap) { GenerateMetadataNodes(childNode, kvp.Key, kvp.Value); } } finally { definitionMap.Free(); } }
public MetadataInfoCreator( Workspace workspace, SolutionKey solutionKey, Checksum checksum, PortableExecutableReference reference ) { _workspace = workspace; _solutionKey = solutionKey; _checksum = checksum; _reference = reference; _metadataReader = null; _allTypeDefinitions = new List <MetadataDefinition>(); _containsExtensionsMethod = false; _inheritanceMap = OrderPreservingMultiDictionary <string, string> .GetInstance(); _parentToChildren = OrderPreservingMultiDictionary < MetadataNode, MetadataNode > .GetInstance(); _extensionMethodToParameterTypeInfo = new MultiDictionary <MetadataNode, ParameterTypeInfo>(); _rootNode = MetadataNode.Allocate(name: ""); }
private void GenerateMetadataNodes( MetadataNode parentNode, string nodeName, OrderPreservingMultiDictionary < string, MetadataDefinition > .ValueSet definitionsWithSameName ) { if (!UnicodeCharacterUtilities.IsValidIdentifier(nodeName)) { return; } var childNode = MetadataNode.Allocate(nodeName); _parentToChildren.Add(parentNode, childNode); // Add all child members var definitionMap = OrderPreservingMultiDictionary < string, MetadataDefinition > .GetInstance(); try { foreach (var definition in definitionsWithSameName) { if (definition.Kind == MetadataDefinitionKind.Member) { // We need to support having multiple methods with same name but different receiver type. _extensionMethodToParameterTypeInfo.Add( childNode, definition.ReceiverTypeInfo ); } LookupMetadataDefinitions(definition, definitionMap); } foreach (var(name, definitions) in definitionMap) { GenerateMetadataNodes(childNode, name, definitions); } } finally { definitionMap.Free(); } }
public MetadataInfoCreator( Solution solution, Checksum checksum, PortableExecutableReference reference, CancellationToken cancellationToken) { _solution = solution; _checksum = checksum; _reference = reference; _cancellationToken = cancellationToken; _metadataReader = null; _allTypeDefinitions = new List <MetadataDefinition>(); _inheritanceMap = OrderPreservingMultiDictionary <string, string> .GetInstance(); _parentToChildren = OrderPreservingMultiDictionary <MetadataNode, MetadataNode> .GetInstance(); _rootNode = MetadataNode.Allocate(name: ""); }
private MetadataNode GetOrCreateChildNode( MetadataNode currentNode, string simpleName) { foreach (var childNode in _parentToChildren[currentNode]) { if (childNode.Name == simpleName) { // Found an existing child node. Just return that and all // future parts off of it. return(childNode); } } // Couldn't find a child node with this name. Make a new node for // it and return that for all future parts to be added to. var newChildNode = MetadataNode.Allocate(simpleName); _parentToChildren.Add(currentNode, newChildNode); return(newChildNode); }