Beispiel #1
0
            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();
                }
            }
Beispiel #2
0
            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: "");
            }
Beispiel #3
0
            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();
                }
            }
Beispiel #4
0
            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: "");
            }
Beispiel #5
0
            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);
            }