Exemplo n.º 1
0
        internal List <GlobalNodeKey> GetCurrentNodeKeys()
        {
            var currentNodeKeys = new List <GlobalNodeKey>();

            foreach (var element in _codeElementTable.Values)
            {
                var keyedElement = ComAggregate.TryGetManagedObject <AbstractKeyedCodeElement>(element);
                if (keyedElement == null)
                {
                    continue;
                }

                if (keyedElement.TryLookupNode(out var node))
                {
                    var nodeKey = keyedElement.NodeKey;
                    currentNodeKeys.Add(new GlobalNodeKey(nodeKey, new SyntaxPath(node)));
                }
            }

            return(currentNodeKeys);
        }
Exemplo n.º 2
0
        public void Remove(object element)
        {
            var codeElement = ComAggregate.TryGetManagedObject <AbstractCodeElement>(element);

            if (codeElement == null)
            {
                codeElement = ComAggregate.TryGetManagedObject <AbstractCodeElement>(
                    this.CodeElements.Item(element)
                    );
            }

            if (codeElement == null)
            {
                throw new ArgumentException(
                          ServicesVSResources.Element_is_not_valid,
                          nameof(element)
                          );
            }

            codeElement.Delete();
        }
Exemplo n.º 3
0
        public void RemoveMember(object element)
        {
            // Is this an EnvDTE.CodeElement that we created? If so, try to get the underlying code element object.
            var abstractCodeElement = ComAggregate.TryGetManagedObject <AbstractCodeElement>(
                element
                );

            if (abstractCodeElement == null)
            {
                if (element is EnvDTE.CodeElement codeElement)
                {
                    // Is at least an EnvDTE.CodeElement? If so, try to retrieve it from the Members collection by name.
                    // Note: This might throw an ArgumentException if the name isn't found in the collection.

                    abstractCodeElement = ComAggregate.TryGetManagedObject <AbstractCodeElement>(
                        this.Members.Item(codeElement.Name)
                        );
                }
                else if (element is string || element is int)
                {
                    // Is this a string or int? If so, try to retrieve it from the Members collection. Again, this will
                    // throw an ArgumentException if the name or index isn't found in the collection.

                    abstractCodeElement = ComAggregate.TryGetManagedObject <AbstractCodeElement>(
                        this.Members.Item(element)
                        );
                }
            }

            if (abstractCodeElement == null)
            {
                throw new ArgumentException(
                          ServicesVSResources.Element_is_not_valid,
                          nameof(element)
                          );
            }

            abstractCodeElement.Delete();
        }
Exemplo n.º 4
0
        public void RemoveParameter(object element)
        {
            FileCodeModel.EnsureEditor(() =>
            {
                // The parameters are part of the node key, so we need to update it
                // after removing a parameter.
                var node     = LookupNode();
                var nodePath = new SyntaxPath(node);

                var codeElement = ComAggregate.TryGetManagedObject <AbstractCodeElement>(element);

                codeElement ??= ComAggregate.TryGetManagedObject <AbstractCodeElement>(this.Parameters.Item(element));

                if (codeElement == null)
                {
                    throw new ArgumentException(ServicesVSResources.Element_is_not_valid, nameof(element));
                }

                codeElement.Delete();

                ReacquireNodeKey(nodePath, CancellationToken.None);
            });
        }
Exemplo n.º 5
0
        private EnvDTE.CodeElement GetParameterElementForCodeModelEvent(CodeModelEvent codeModelEvent, EnvDTE.CodeElements parentParameters, object parentElement)
        {
            if (parentParameters == null)
            {
                return(null);
            }

            var parameterName = this.CodeModelService.GetName(codeModelEvent.Node);

            if (codeModelEvent.Type == CodeModelEventType.Remove)
            {
                var parentCodeElement = ComAggregate.TryGetManagedObject <AbstractCodeMember>(parentElement);
                if (parentCodeElement != null)
                {
                    return((EnvDTE.CodeElement)CodeParameter.Create(this.State, parentCodeElement, parameterName));
                }
            }
            else
            {
                return(parentParameters.Item(parameterName));
            }

            return(null);
        }
Exemplo n.º 6
0
        private EnvDTE.CodeElement GetAttributeArgumentForCodeModelEvent(CodeModelEvent codeModelEvent, EnvDTE.CodeElements parentAttributeArguments, object parentElement)
        {
            if (parentAttributeArguments == null)
            {
                return(null);
            }

            CodeModelService.GetAttributeArgumentParentAndIndex(codeModelEvent.Node, out var attributeNode, out var ordinal);

            if (codeModelEvent.Type == CodeModelEventType.Remove)
            {
                var parentCodeElement = ComAggregate.TryGetManagedObject <CodeAttribute>(parentElement);
                if (parentCodeElement != null)
                {
                    return((EnvDTE.CodeElement)CodeAttributeArgument.Create(this.State, parentCodeElement, ordinal));
                }
            }
            else
            {
                return(parentAttributeArguments.Item(ordinal + 1)); // Needs to be 1-based to call back into code model
            }

            return(null);
        }
Exemplo n.º 7
0
        internal T GetOrCreateCodeElement <T>(SyntaxNode node)
        {
            var nodeKey = CodeModelService.TryGetNodeKey(node);

            if (!nodeKey.IsEmpty)
            {
                // Since the node already has a key, check to see if a code element already
                // exists for it. If so, return that element it it's still valid; otherwise,
                // remove it from the table.
                if (_codeElementTable.TryGetValue(nodeKey, out var codeElement))
                {
                    if (codeElement != null)
                    {
                        var element = ComAggregate.TryGetManagedObject <AbstractCodeElement>(
                            codeElement
                            );
                        if (element.IsValidNode())
                        {
                            if (codeElement is T tcodeElement)
                            {
                                return(tcodeElement);
                            }

                            throw new InvalidOperationException(
                                      $"Found a valid code element for {nodeKey}, but it is not of type, {typeof(T).ToString()}"
                                      );
                        }
                    }
                }

                // Go ahead and remove the nodeKey from the table. At this point, we'll be creating a new one.
                _codeElementTable.Remove(nodeKey);
            }

            return((T)CodeModelService.CreateInternalCodeElement(this.State, this, node));
        }