예제 #1
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var node = LookupNode();

            foreach (var child in CodeModelService.GetAttributeNodes(node))
            {
                CodeModelService.GetAttributeNameAndOrdinal(
                    node,
                    child,
                    out var childName,
                    out var ordinal
                    );
                if (childName == name)
                {
                    element = (EnvDTE.CodeElement)CodeAttribute.Create(
                        State,
                        FileCodeModel,
                        this.ParentElement,
                        childName,
                        ordinal
                        );
                    return(true);
                }
            }

            element = null;
            return(false);
        }
        internal EnvDTE.CodeParameter AddParameter(EnvDTE.CodeElement parent, SyntaxNode containerNode, string name, object type, object position)
        {
            var typeSymbol = CodeModelService.GetTypeSymbol(type, this.GetSemanticModel(), containerNode.SpanStart);
            var typeName   = typeSymbol.GetEscapedFullName();

            var parameterNode  = CodeModelService.CreateParameterNode(CodeModelService.GetUnescapedName(name), typeName);
            var insertionIndex = CodeModelService.PositionVariantToParameterInsertionIndex(position, containerNode, fileCodeModel: this);

            var newNode = InsertParameter(containerNode, parameterNode, insertionIndex);

            // Since parameters form part of the NodeKey for functions, delegates, and indexers,
            // creating a CodeParameter hooked up to the correct parent is a little tricky. After
            // the call to InsertParameter, the syntax tree has been updated, but not the NodeKey
            // map or the NodeKey in the parent CodeParameter. If we delegate the creation of the
            // CodeParameter to CodeModelService.CreateInternalCodeElement, it will attempt to
            // look up an element in the NodeKey map based on the new syntax tree. This will fail,
            // causing it to create a new, duplicate element for the parent. Later, when we
            // reacquire the NodeKeys, the original element will get the proper NodeKey, while the
            // duplicate will be updated to a meaningless NodeKey. Since the duplicate is the one
            // being used by the CodeParameter, most operations on it will then fail.
            // Instead, we need to have the parent passed in to us.
            var parentObj = ComAggregate.GetManagedObject <AbstractCodeMember>(parent);

            return(CodeParameter.Create(this.State, parentObj, CodeModelService.GetParameterName(newNode)));
        }
예제 #3
0
        /*======================= PUBLIC ========================================*/
        /************************ Events *****************************************/
        /************************ Properties *************************************/
        /************************ Construction ***********************************/
        /************************ Methods ****************************************/
        /************************ Fields *****************************************/
        /************************ Static *****************************************/
        /*----------------------- GetCodeElement --------------------------------*/
        /// <summary>
        /// Gets the <see cref="EnvDTE.CodeElement"/> of the text point
        /// </summary>
        /// <param name="tp"></param>
        /// <returns></returns>
        public static EnvDTE.CodeElement GetCodeElement(this EnvDTE.TextPoint tp)
        {
            var scopes = new List <EnvDTE.vsCMElement>()
            {
                EnvDTE.vsCMElement.vsCMElementFunction,
                EnvDTE.vsCMElement.vsCMElementProperty,
                EnvDTE.vsCMElement.vsCMElementEnum,
                EnvDTE.vsCMElement.vsCMElementClass,
                EnvDTE.vsCMElement.vsCMElementInterface,
                EnvDTE.vsCMElement.vsCMElementNamespace,
            };

            EnvDTE.CodeElement retval = null;
            foreach (var s in scopes)
            {
                try
                {
                    var scope = (EnvDTE.vsCMElement)s;
                    retval = tp.CodeElement[scope];
                    if (retval != null)
                    {
                        break;
                    }
                }
                catch {; }
            }
            return(retval);
        } // end of function - GetCodeElement
예제 #4
0
        private static bool FindMethodInCodeElement(EnvDTE.CodeElement codeElement, string fullyQualifiedMethodName,
                                                    out EnvDTE.CodeElement discoveredMethodElement)
        {
            if (codeElement.Kind == EnvDTE.vsCMElement.vsCMElementClass)
            {
                if (Debugger.IsAttached)
                {
                    WriteToOutputWindow("Processing class: {0}", codeElement.FullName);
                }

                foreach (EnvDTE.CodeElement classChildCodeElement in codeElement.Children)
                {
                    if (classChildCodeElement.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                    {
                        if (fullyQualifiedMethodName == classChildCodeElement.FullName)
                        {
                            discoveredMethodElement = classChildCodeElement;
                            return(true);
                        }
                    }
                }
            }

            foreach (EnvDTE.CodeElement childElement in codeElement.Children)
            {
                if (FindMethodInCodeElement(childElement, fullyQualifiedMethodName, out discoveredMethodElement))
                {
                    return(true);
                }
            }

            discoveredMethodElement = null;
            return(false);
        }
예제 #5
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var node = LookupNode();

            // Inherits statements
            foreach (var child in CodeModelService.GetInheritsNodes(node))
            {
                CodeModelService.GetInheritsNamespaceAndOrdinal(node, child, out var childName, out var ordinal);
                if (childName == name)
                {
                    element = FileCodeModel.GetOrCreateCodeElement <EnvDTE.CodeElement>(child);
                    return(true);
                }
            }

            // Implements statements
            foreach (var child in CodeModelService.GetImplementsNodes(node))
            {
                CodeModelService.GetImplementsNamespaceAndOrdinal(node, child, out var childName, out var ordinal);
                if (childName == name)
                {
                    element = FileCodeModel.GetOrCreateCodeElement <EnvDTE.CodeElement>(child);
                    return(true);
                }
            }

            element = null;
            return(false);
        }
예제 #6
0
        private static bool FindMethodInCodeElement(EnvDTE.CodeElement codeElement, string fullyQualifiedMethodName,
                                                    out EnvDTE.CodeElement discoveredMethodElement)
        {
            if (codeElement.Kind == EnvDTE.vsCMElement.vsCMElementClass)
            {
                foreach (EnvDTE.CodeElement classChildCodeElement in codeElement.Children)
                {
                    if (classChildCodeElement.Kind == EnvDTE.vsCMElement.vsCMElementFunction)
                    {
                        if (fullyQualifiedMethodName == classChildCodeElement.FullName)
                        {
                            discoveredMethodElement = classChildCodeElement;
                            return(true);
                        }
                    }
                }
            }

            foreach (EnvDTE.CodeElement childElement in codeElement.Children)
            {
                if (FindMethodInCodeElement(childElement, fullyQualifiedMethodName, out discoveredMethodElement))
                {
                    return(true);
                }
            }

            discoveredMethodElement = null;
            return(false);
        }
예제 #7
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var node = LookupNode();

            var currentIndex = 0;

            // Inherits statements
            var inheritsNodes     = CodeModelService.GetInheritsNodes(node);
            var inheritsNodeCount = inheritsNodes.Count();

            if (index < currentIndex + inheritsNodeCount)
            {
                var child = inheritsNodes.ElementAt(index - currentIndex);
                element = FileCodeModel.GetOrCreateCodeElement <EnvDTE.CodeElement>(child);
                return(true);
            }

            currentIndex += inheritsNodeCount;

            // Implements statements
            var implementsNodes     = CodeModelService.GetImplementsNodes(node);
            var implementsNodeCount = implementsNodes.Count();

            if (index < currentIndex + implementsNodeCount)
            {
                var child = implementsNodes.ElementAt(index - currentIndex);
                element = FileCodeModel.GetOrCreateCodeElement <EnvDTE.CodeElement>(child);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #8
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            if (name != null)
            {
                // When searching by name it may or may not be the fully qualified named,
                // but we need the fully qualified name for comparison.
                var node          = LookupNode();
                var semanticModel = FileCodeModel.GetSemanticModel();

                name = CodeModelService.GetFullyQualifiedName(name, node.SpanStart, semanticModel);
            }

            foreach (var child in GetBaseTypes())
            {
                var childName = child.GetEscapedFullName();
                if (childName == name)
                {
                    var projectId = FileCodeModel.GetProjectId();
                    element = CodeModelService.CreateCodeType(this.State, projectId, child);
                    return(true);
                }
            }

            element = null;
            return(false);
        }
예제 #9
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var node          = LookupNode();
            var parentElement = !this.IsRootNamespace ? (AbstractCodeElement)this.Parent : null;

            var currentIndex = 0;

            // Option statements
            var optionNodes     = CodeModelService.GetOptionNodes(node);
            var optionNodeCount = optionNodes.Count();

            if (index < currentIndex + optionNodeCount)
            {
                var child = optionNodes.ElementAt(index - currentIndex);
                element = CreateCodeOptionsStatement(child, node);
                return(true);
            }

            currentIndex += optionNodeCount;

            // Imports/using statements
            var importNodes     = CodeModelService.GetImportNodes(node);
            var importNodeCount = importNodes.Count();

            if (index < currentIndex + importNodeCount)
            {
                var child = importNodes.ElementAt(index - currentIndex);
                element = CreateCodeImport(child, parentElement);
                return(true);
            }

            currentIndex += importNodeCount;

            // Attributes
            var attributeNodes     = CodeModelService.GetAttributeNodes(node);
            var attributeNodeCount = attributeNodes.Count();

            if (index < currentIndex + attributeNodeCount)
            {
                var child = attributeNodes.ElementAt(index - currentIndex);
                element = CreateCodeAttribute(child, node, parentElement);
                return(true);
            }

            currentIndex += attributeNodeCount;

            // Members
            var memberNodes     = CodeModelService.GetLogicalSupportedMemberNodes(node);
            var memberNodeCount = memberNodes.Count();

            if (index < currentIndex + memberNodeCount)
            {
                var child = memberNodes.ElementAt(index - currentIndex);
                element = FileCodeModel.GetOrCreateCodeElement <EnvDTE.CodeElement>(child);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #10
0
        private static TextSpan CodeElementSpan(EnvDTE.CodeElement element)
        {
            TextSpan span = new TextSpan();

            if (null == element)
            {
                return(span);
            }

            span.iStartLine = element.StartPoint.Line;
            if (span.iStartLine > 1)
            {
                span.iStartLine -= 1;
            }
            span.iStartIndex = element.StartPoint.DisplayColumn;

            EnvDTE.TextPoint endPoint = element.EndPoint;
            if (null == endPoint)
            {
                endPoint = element.StartPoint;
            }
            span.iEndLine = endPoint.Line;
            if (span.iEndLine > 1)
            {
                span.iEndLine -= 1;
            }
            span.iEndIndex = endPoint.DisplayColumn;

            return(span);
        }
예제 #11
0
        public void RenameNoUI(EnvDTE.CodeElement element, string newName, bool fPreview, bool fSearchComments, bool fOverloads)
        {
            // TODO: Support options

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

            codeElement?.RenameSymbol(newName);
        }
예제 #12
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var node          = LookupNode();
            var parentElement = !IsRootNamespace
                ? (AbstractCodeElement)Parent
                : null;

            // Option statements
            foreach (var child in CodeModelService.GetOptionNodes(node))
            {
                string childName;
                int    ordinal;
                CodeModelService.GetOptionNameAndOrdinal(node, child, out childName, out ordinal);
                if (childName == name)
                {
                    element = CodeOptionsStatement.Create(State, FileCodeModel, childName, ordinal);
                    return(true);
                }
            }

            // Imports/using statements
            foreach (var child in CodeModelService.GetImportNodes(node))
            {
                var childName = CodeModelService.GetImportNamespaceOrType(child);
                if (childName == name)
                {
                    element = CodeImport.Create(State, FileCodeModel, parentElement, childName);
                    return(true);
                }
            }

            // Attributes
            foreach (var child in CodeModelService.GetAttributeNodes(node))
            {
                string childName;
                int    ordinal;
                CodeModelService.GetAttributeNameAndOrdinal(node, child, out childName, out ordinal);
                if (childName == name)
                {
                    element = (EnvDTE.CodeElement)CodeAttribute.Create(State, FileCodeModel, parentElement, childName, ordinal);
                    return(true);
                }
            }

            // Members
            foreach (var child in CodeModelService.GetLogicalSupportedMemberNodes(node))
            {
                var childName = CodeModelService.GetName(child);
                if (childName == name)
                {
                    element = FileCodeModel.CreateCodeElement <EnvDTE.CodeElement>(child);
                    return(true);
                }
            }

            element = null;
            return(false);
        }
 private static TextSpan CodeElementSpan(EnvDTE.CodeElement element)
 {
     try
     {
         return(SpanFromTextPoints(element.StartPoint, element.EndPoint));
     }
     catch
     {
         return(new TextSpan());
     }
 }
예제 #14
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            if (index < _typeSymbols.Length)
            {
                element = this.State.CodeModelService.CreateCodeType(this.State, _projectId, _typeSymbols[index]);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #15
0
        public static CodeElement ToInternalCodeElement(this EnvDTE.CodeElement vsCodeElement)
        {
            var vsContainingProject = vsCodeElement.ProjectItem?.ContainingProject;
            var containingProject   = vsContainingProject != null
                ? new Project(vsContainingProject.FullName)
                : (Project?)null;

            var codeElementKind = vsCodeElement.Kind.ToInternalKind();

            return(new CodeElement(vsCodeElement.FullName, codeElementKind, containingProject));
        }
예제 #16
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            if (index >= 0 && index < EnumerateOverloads().Length)
            {
                element = EnumerateOverloads()[index];
                return(true);
            }

            element = null;
            return(false);
        }
예제 #17
0
        internal void OnCodeElementCreated(SyntaxNodeKey nodeKey, EnvDTE.CodeElement element)
        {
            // If we're creating an element with the same node key as an element that's already in the table, just remove
            // the old element. The old element will continue to function but the new element will replace it in the cache.

            if (_codeElementTable.ContainsKey(nodeKey))
            {
                _codeElementTable.Remove(nodeKey);
            }

            _codeElementTable.Add(nodeKey, element);
        }
예제 #18
0
        internal void GetElementsForCodeModelEvent(
            CodeModelEvent codeModelEvent,
            out EnvDTE.CodeElement element,
            out object parentElement
            )
        {
            parentElement = GetParentElementForCodeModelEvent(codeModelEvent);

            if (codeModelEvent.Node == null)
            {
                element = this.CodeModelService.CreateUnknownRootNamespaceCodeElement(
                    this.State,
                    this
                    );
            }
            else if (this.CodeModelService.IsParameterNode(codeModelEvent.Node))
            {
                element = GetParameterElementForCodeModelEvent(codeModelEvent, parentElement);
            }
            else if (this.CodeModelService.IsAttributeNode(codeModelEvent.Node))
            {
                element = GetAttributeElementForCodeModelEvent(codeModelEvent, parentElement);
            }
            else if (this.CodeModelService.IsAttributeArgumentNode(codeModelEvent.Node))
            {
                element = GetAttributeArgumentElementForCodeModelEvent(
                    codeModelEvent,
                    parentElement
                    );
            }
            else
            {
                if (codeModelEvent.Type == CodeModelEventType.Remove)
                {
                    element = this.CodeModelService.CreateUnknownCodeElement(
                        this.State,
                        this,
                        codeModelEvent.Node
                        );
                }
                else
                {
                    element = this.GetOrCreateCodeElement <EnvDTE.CodeElement>(codeModelEvent.Node);
                }
            }

            if (element == null)
            {
                Debug.Fail("We should have created an element for this event!");
            }

            Debug.Assert(codeModelEvent.Type != CodeModelEventType.Remove || parentElement != null);
        }
예제 #19
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var index = _typeSymbols.IndexOf(t => t.Name == name);

            if (index >= 0 && index < _typeSymbols.Length)
            {
                element = this.State.CodeModelService.CreateCodeType(this.State, _projectId, _typeSymbols[index]);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #20
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var parts = GetParts();

            if (index < parts.Length)
            {
                element = parts[index];
                return(true);
            }

            element = null;
            return(false);
        }
예제 #21
0
        /// <summary>
        /// Displays the selection dialog box and returns a <seealso cref="CLRType"/> object
        /// </summary>
        /// <param name="context"></param>
        /// <param name="provider"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            object newValue = base.EditValue(context, provider, value);

            if (newValue is EnvDTE.CodeElement)
            {
                EnvDTE.CodeElement codeElement = newValue as EnvDTE.CodeElement;
                TCLRType           newCLRType  = new TCLRType();
                newCLRType.Init(codeElement.FullName);
                return(newCLRType);
            }
            return(newValue);
        }
예제 #22
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var children = GetChildren();

            if (index < children.Length)
            {
                element = children[index];
                return(true);
            }

            element = null;
            return(false);
        }
예제 #23
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            foreach (var collection in _collections)
            {
                if (ErrorHandler.Succeeded(collection.Item(name, out element)))
                {
                    return(true);
                }
            }

            element = null;
            return(false);
        }
예제 #24
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var parameters = GetParameters();

            if (index < parameters.Length)
            {
                element = (EnvDTE.CodeElement)ExternalCodeParameter.Create(this.State, _projectId, parameters[index], this.ParentElement);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #25
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var baseTypes = GetBaseTypes();
            if (index < baseTypes.Count())
            {
                var child = baseTypes.ElementAt(index);
                var projectId = FileCodeModel.GetProjectId();
                element = CodeModelService.CreateCodeType(this.State, projectId, child);
                return true;
            }

            element = null;
            return false;
        }
예제 #26
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            foreach (var part in GetParts())
            {
                if (part.Name == name)
                {
                    element = part;
                    return(true);
                }
            }

            element = null;
            return(false);
        }
예제 #27
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var children = GetChildren();
            var index    = children.IndexOf(e => e.Name == name);

            if (index < children.Length)
            {
                element = children[index];
                return(true);
            }

            element = null;
            return(false);
        }
예제 #28
0
        protected override bool TryGetItemByName(string name, out EnvDTE.CodeElement element)
        {
            var parameters = GetParameters();
            var index      = parameters.IndexOf(p => p.Name == name);

            if (index >= 0 && index < parameters.Length)
            {
                element = (EnvDTE.CodeElement)ExternalCodeParameter.Create(this.State, _projectId, parameters[index], this.ParentElement);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #29
0
        protected override bool TryGetItemByIndex(int index, out EnvDTE.CodeElement element)
        {
            var parameters = this.ParentElement.GetParameters();

            if (index < parameters.Length)
            {
                var parameter = parameters[index];
                element = (EnvDTE.CodeElement)CodeParameter.Create(this.State, this.ParentElement, parameter.Name);
                return(true);
            }

            element = null;
            return(false);
        }
예제 #30
0
        public int GetMemberNavigationPoint(string pszClassName, string pszUniqueMemberID, TextSpan[] pSpanNavPoint, out uint pItemID)
        {
            // Validate the parameters
            if (string.IsNullOrEmpty(pszClassName))
            {
                throw new System.ArgumentNullException("pszClassName");
            }
            if (string.IsNullOrEmpty(pszUniqueMemberID))
            {
                throw new System.ArgumentNullException("pszUniqueMemberID");
            }
            if ((null == pSpanNavPoint) || (0 == pSpanNavPoint.Length))
            {
                throw new ArgumentNullException("pSpanNavPoint");
            }
            // Get the implementation class
            CodeClassInfo implInfo = ImplementationClass(pszClassName);

            if ((null == implInfo) || (null == implInfo.CodeClass))
            {
                throw new System.ArgumentException("pszClassName");
            }
            EnvDTE.CodeClass implClass = implInfo.CodeClass;

            // Verify that the unique id is valid.
            string memberName = MemberNameFromUniqueId(pszUniqueMemberID);

            if (string.IsNullOrEmpty(memberName))
            {
                throw new System.ArgumentException();
            }
            // Remove the '_' added by the file code model
            if (memberName[0] == '_')
            {
                memberName = memberName.Substring(1);
            }

            // Get the code element for the member.
            EnvDTE.CodeElement member = GetClassMember(implClass, memberName);
            if (null == member)
            {
                throw new System.ArgumentException();
            }

            // Set the output variables.
            pSpanNavPoint[0] = CodeElementSpan(member);
            pItemID          = implInfo.ItemId;

            return(VSConstants.S_OK);
        }