public LocationPreviewItem(FilePreviewItem parent, LocationInfo locationInfo, VariableType type) { _lineNo = locationInfo.Line; _columnNo = locationInfo.Column; _parent = parent; string text = locationInfo.ProjectEntry.GetLine(locationInfo.Line); string trimmed = text.TrimStart(_whitespace); _text = trimmed; _type = type; _span = new Span(_columnNo - (text.Length - trimmed.Length) - 1, parent.Engine.OriginalName.Length); if (String.Compare(_text, _span.Start, parent.Engine.OriginalName, 0, parent.Engine.OriginalName.Length) != 0) { // we are renaming a name mangled name (or we have a bug where the names aren't lining up). Debug.Assert(_text.Substring(_span.Start, _span.Length + 1 + parent.Engine.PrivatePrefix.Length) == "_" + parent.Engine.PrivatePrefix + parent.Engine.OriginalName); if (parent.Engine.Request.Name.StartsWith("__")) { // if we're renaming to a private prefix name then we just rename the non-prefixed portion _span = new Span(_span.Start + 1 + parent.Engine.PrivatePrefix.Length, _span.Length); _columnNo += 1 + parent.Engine.PrivatePrefix.Length; } else { // otherwise we renmae the prefixed and non-prefixed portion _span = new Span(_span.Start, _span.Length + 1 + parent.Engine.PrivatePrefix.Length); } } }
private List<FilePreviewItem> CreatePreviewItems() { Dictionary<string, FilePreviewItem> files = new Dictionary<string, FilePreviewItem>(); Dictionary<FilePreviewItem, HashSet<LocationInfo>> allItems = new Dictionary<FilePreviewItem, HashSet<LocationInfo>>(); foreach (var variable in _variables) { switch (variable.Type) { case VariableType.Definition: case VariableType.Reference: string file = variable.Location.FilePath; FilePreviewItem fileItem; HashSet<LocationInfo> curLocations; if (!files.TryGetValue(file, out fileItem)) { files[file] = fileItem = new FilePreviewItem(this, file); allItems[fileItem] = curLocations = new HashSet<LocationInfo>(LocationInfo.FullComparer); } else { curLocations = allItems[fileItem]; } if (!curLocations.Contains(variable.Location)) { fileItem.Items.Add(new LocationPreviewItem(fileItem, variable.Location, variable.Type)); curLocations.Add(variable.Location); } break; } } List<FilePreviewItem> fileItems = new List<FilePreviewItem>(files.Values); foreach (var fileItem in fileItems) { fileItem.Items.Sort(LocationComparer); } fileItems.Sort(FileComparer); return fileItems; }
private static int FileComparer(FilePreviewItem left, FilePreviewItem right) { return String.Compare(left.Filename, right.Filename, StringComparison.OrdinalIgnoreCase); }