Beispiel #1
0
        private IList <XSourceEntity> GetTypeMembers(XSourceTypeSymbol type)
        {
            var members = new List <XSourceEntity>();

            if (type.IsPartial && !type.IsGlobal && !XSettings.EditorNavigationExcludeMembersFromOtherFiles)
            {
                var usings = new List <string>();
                usings.Add(type.Namespace);
                var fullType = _file.Project.Lookup(type.Name, usings);
                if (fullType != null)
                {
                    members.AddRange(fullType.XMembers);
                }
            }
            else
            {
                members.AddRange(type.XMembers);
                foreach (XSourceTypeSymbol child in type.Children)
                {
                    members.Add(child);
                    members.AddRange(child.XMembers);
                }
            }
            return(members);
        }
Beispiel #2
0
        private void SelectContainingMember(int newLine)
        {
            if (_file == null)
            {
                return;
            }
            XSourceEntity selectedElement = _file.FindMemberAtRow(newLine);

            if (selectedElement == _lastSelected && !SettingsChanged)
            {
                return;
            }
            XSourceTypeSymbol parentType = null;

            if (selectedElement is XSourceMemberSymbol)
            {
                parentType = (XSourceTypeSymbol)selectedElement.Parent;
            }
            else if (selectedElement is XSourceTypeSymbol)
            {
                parentType = selectedElement as XSourceTypeSymbol;
            }
            else
            {
                parentType = _file.GlobalType;
            }
            bool newType = true;

            if (parentType != null && _lastType != null && parentType.FullName == _lastType.FullName)
            {
                newType = false;
            }
            var nothingChanged = _file.ContentHashCode == this._lastHashCode && !SettingsChanged && !relatedFilesChanged;

            if (nothingChanged)
            {
                if (newType && XSettings.EditorNavigationMembersOfCurrentTypeOnly)
                {
                    _selectedTypeIndex = findSelectedType(parentType);
                    loadMemberCombos(_selectedTypeIndex, newLine);
                    _lastHashCode = _file.ContentHashCode;
                    _lastType     = parentType;
                    _saveSettings();
                    return;
                }
                // when not on a new type or when the member combo is already complete then we
                // can select the entry in the existing members combobox
                _selectedMemberIndex = findSelectedMember(selectedElement);
                _selectedTypeIndex   = findSelectedType(parentType);
                _lastSelected        = selectedElement;
                _lastType            = parentType;
            }
            else
            {
                reloadCombos(newLine);
            }
            return;
        }
Beispiel #3
0
        private List <string> GetUsings()
        {
            IXSymbol scope;

            scope = Member;
            var scopes = new List <string>();

            if (File != null)
            {
                scopes.AddRange(File.Usings);
            }
            while (scope != null)
            {
                string ns = "";
                if (scope is XSourceTypeSymbol && !XSourceTypeSymbol.IsGlobalType(scope))
                {
                    ns = scope.FullName;
                }
                if (scope.Kind == Kind.Namespace)
                {
                    ns = scope.FullName;
                }
                if (ns?.Length > 0)
                {
                    var elements = ns.Split(".".ToCharArray());
                    ns = "";
                    for (int i = 0; i < elements.Length; i++)
                    {
                        if (i > 0)
                        {
                            ns += "." + elements[i];
                        }
                        else
                        {
                            ns = elements[0];
                        }
                        if (!scopes.Contains(ns))
                        {
                            scopes.Add(ns);
                        }
                    }
                }
                scope = scope.Parent;
            }
            if (!string.IsNullOrEmpty(CurrentNamespace) && !scopes.Contains(CurrentNamespace))
            {
                scopes.Add(CurrentNamespace);
            }

            return(scopes);
        }
Beispiel #4
0
 private int findSelectedType(XSourceTypeSymbol type)
 {
     if (type != null)
     {
         for (int i = 0; i < _types.Count; i++)
         {
             if (String.Compare(_types[i].Entity.FullName, type.FullName, true) == 0)
             {
                 return(i);
             }
         }
     }
     return(-1);
 }
Beispiel #5
0
        private int SearchInsertionPoint(XSourceTypeSymbol typeEntity)
        {
            int insertAt = Math.Min(typeEntity.Range.EndLine, this.m_textView.TextSnapshot.LineCount - 1);

            foreach (XSourceMemberSymbol mbr in typeEntity.XMembers)
            {
                if ((mbr.Kind == Kind.Constructor) || (mbr.Kind == Kind.Method) || (mbr.Kind == Kind.Property))
                {
                    insertAt = mbr.Range.StartLine;
                    break;
                }
            }
            return(insertAt);
        }
Beispiel #6
0
        public static XSourceTypeSymbol FindNamespace(int position, XFile file)
        {
            if (file == null)
            {
                return(null);
            }
            if (file.TypeList == null)
            {
                return(null);
            }
            //
            XSourceTypeSymbol found = null;

            foreach (XSourceTypeSymbol eltType in file.TypeList.Values)
            {
                if (eltType.Interval.ContainsInclusive(position))
                {
                    if (eltType.Kind.IsType() && eltType.Kind != Kind.Delegate)
                    {
                        found = eltType;
                    }
                    if (eltType.Kind == Kind.Namespace)
                    {
                        return(eltType);
                    }
                }
            }
            //
            if (found != null)
            {
                string name = found.Name;
                if (found.Namespace?.Length > 0)
                {
                    name = found.Namespace + "." + name;
                }
                var pos = name.LastIndexOf('.');
                if (pos > 0)
                {
                    name = name.Substring(0, pos);
                }
                XSourceTypeSymbol nSpace = new XSourceTypeSymbol(name, Kind.Namespace, Modifiers.Public, found.Range, found.Interval, file);
                return(nSpace);
            }
#if TRACE
            // a source file without a namespace is really not a problem
            //Support.Debug(String.Format("Cannot find namespace at position {0} in file {0} .", position, fileName));
#endif
            return(null);
        }
Beispiel #7
0
        private void InitDescription(XSourceEntity member) //, _VSOBJDESCOPTIONS flags, IVsObjectBrowserDescription3 description)
        {
            description = new List <Tuple <string, VSOBDESCRIPTIONSECTION> >();
            string descText;

            if (member != null)
            {
                string modifier = "";
                string access   = "";
                if ((member is XSourceTypeSymbol) && (member.Kind != Kind.Namespace))
                {
                    modifier = member.Modifiers.ToDisplayString();
                    access   = member.Visibility.ToDisplayString();
                }
                else if ((member is XSourceMemberSymbol) && ((member.Kind != Kind.Function) && (member.Kind != Kind.Procedure)))
                {
                    modifier = member.Modifiers.ToDisplayString();
                    access   = member.Visibility.ToDisplayString();
                }
                //
                if (!string.IsNullOrEmpty(modifier))
                {
                    description.Add(Item(modifier + " ", VSOBDESCRIPTIONSECTION.OBDS_ATTRIBUTE));
                }
                //
                if (!string.IsNullOrEmpty(access))
                {
                    description.Add(Item(access + " ", VSOBDESCRIPTIONSECTION.OBDS_ATTRIBUTE));
                }
                //
                if (member.Kind != Kind.Field)
                {
                    VSOBDESCRIPTIONSECTION descName = VSOBDESCRIPTIONSECTION.OBDS_MISC;
                    descText = XSettings.FormatKeyword(member.Kind.DisplayName()) + " ";
                    if (member.Kind == Kind.Constructor)
                    {
                        descName = VSOBDESCRIPTIONSECTION.OBDS_NAME;
                    }
                    description.Add(Item(descText, descName));
                }
                if (member.Kind != Kind.Constructor)
                {
                    descText = member.Name;
                    description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_NAME));
                }
                // Parameters ?
                if (member.Kind.HasParameters())
                {
                    descText = "(";
                    description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    XSourceMemberSymbol realmember;
                    XSourceTypeSymbol   type = member as XSourceTypeSymbol;
                    if (member.Kind == Kind.Delegate && type?.XMembers.Count > 0)
                    {
                        realmember = type.XMembers[0];
                    }
                    else
                    {
                        realmember = member as XSourceMemberSymbol;
                    }

                    if (realmember != null && realmember.HasParameters)
                    {
                        //
                        int paramNum = 1;
                        foreach (IXParameterSymbol param in realmember.Parameters)
                        {
                            descText = param.Name;
                            description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_PARAM));
                            descText = param.ParamTypeDesc;
                            description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                            descText = param.TypeName;
                            //
                            description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_TYPE));
                            // Need a comma ?
                            if (paramNum < realmember.ParameterCount)
                            {
                                paramNum++;
                                descText = ",";
                                description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_COMMA));
                            }
                        }
                    }
                    descText = ")";
                    description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                }
                if (member.Kind.HasReturnType())
                {
                    descText = XLiterals.AsKeyWord;
                    description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    descText = member.TypeName;
                    description.Add(Item(descText, VSOBDESCRIPTIONSECTION.OBDS_TYPE));
                }

                description.Add(Item(null, VSOBDESCRIPTIONSECTION.OBDS_ENDDECL));
            }
            //
            if (member.File?.Project != null)
            {
                string        summary = null, returns = null, remarks = null;
                List <string> pNames        = new List <string>();
                List <string> pDescriptions = new List <string>();
                if (member is XSourceMemberSymbol symbol1)
                {
                    summary = XSharpXMLDocMember.GetMemberSummary(symbol1, member.File?.Project, out returns, out remarks);
                    XSharpXMLDocMember.GetMemberParameters(symbol1, member.File?.Project, pNames, pDescriptions);
                }
                else if (member is XSourceTypeSymbol symbol)
                {
                    summary = XSharpXMLDocMember.GetTypeSummary(symbol, member.File?.Project, out returns, out remarks);
                }
                if (!string.IsNullOrEmpty(summary))
                {
                    description.Add(Item(NEWLINE, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    description.Add(Item(SUMMARY, VSOBDESCRIPTIONSECTION.OBDS_NAME));
                    description.Add(Item(summary, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                }
                if (pNames.Count > 0)
                {
                    description.Add(Item(NEWLINE, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    description.Add(Item(PARAMETERS, VSOBDESCRIPTIONSECTION.OBDS_NAME));
                    for (int i = 0; i < pNames.Count; i++)
                    {
                        description.Add(Item(NEWLINE + pNames[i], VSOBDESCRIPTIONSECTION.OBDS_PARAM));
                        description.Add(Item(" : ", VSOBDESCRIPTIONSECTION.OBDS_MISC));
                        description.Add(Item(pDescriptions[i], VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    }
                }
                if (!string.IsNullOrEmpty(returns))
                {
                    description.Add(Item(NEWLINE, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    description.Add(Item(RETURNS, VSOBDESCRIPTIONSECTION.OBDS_NAME));
                    description.Add(Item(returns, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                }
                if (!string.IsNullOrEmpty(remarks))
                {
                    description.Add(Item(NEWLINE, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                    description.Add(Item(REMARKS, VSOBDESCRIPTIONSECTION.OBDS_NAME));
                    description.Add(Item(remarks, VSOBDESCRIPTIONSECTION.OBDS_MISC));
                }
            }
        }