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); }
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; }
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); }
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); }
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); }
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); }
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)); } } }