Skip to content

Commit

Permalink
Add error list navigation
Browse files Browse the repository at this point in the history
  • Loading branch information
nosami committed Nov 11, 2019
1 parent 632f842 commit 7d6cb07
Showing 1 changed file with 63 additions and 28 deletions.
91 changes: 63 additions & 28 deletions Src/VimMac/VimHost.cs
Original file line number Diff line number Diff line change
Expand Up @@ -486,39 +486,74 @@ public bool NavigateTo(VirtualSnapshotPoint point)
}
}

public FSharpOption<ListItem> NavigateToListItem(ListKind listKind, NavigationKind navigationKind, FSharpOption<int> argument, bool hasBang)
public FSharpOption<ListItem> NavigateToListItem(ListKind listKind, NavigationKind navigationKind, FSharpOption<int> argumentOption, bool hasBang)
{
// public enum ListKind
//{
// Error,
// Location
//}
//public enum NavigationKind
//{
// First,
// Last,
// Next,
// Previous
//}

//public class ListItem
//{
// internal string _message;

// internal int _listLength;

// internal int _itemNumber;
if (listKind == ListKind.Error)
{
var errors = IdeServices.TaskService.Errors;
if (errors.Count > 0)
{
var argument = argumentOption.IsSome() ? new int?(argumentOption.Value) : null;

// public int ItemNumber => _itemNumber;
var currentIndex = errors.CurrentLocationTask == null ? -1 : errors.IndexOf(errors.CurrentLocationTask);
var index = GetListItemIndex(navigationKind, argument, currentIndex, errors.Count);

// public int ListLength => _listLength;
if (index.HasValue)
{
var errorItem = errors.ElementAt(index.Value);
errors.CurrentLocationTask = errorItem;
errorItem.SelectInPad();
errorItem.JumpToPosition();

// Item number is one-based.
var listItem = new ListItem(index.Value + 1, errors.Count, errorItem.Message);
return FSharpOption.CreateForReference(listItem);
}
}
}
return FSharpOption<ListItem>.None;
}

// public string Message => _message;
/// <summary>
/// Convert the specified navigation instructions into an index for the
/// new list item
/// </summary>
/// <param name="navigationKind">the kind of navigation</param>
/// <param name="argument">an optional argument for the navigation</param>
/// <param name="current">the zero-based index of the current list item</param>
/// <param name="length">the length of the list</param>
/// <returns>a zero-based index into the list</returns>
private static int? GetListItemIndex(NavigationKind navigationKind, int? argument, int? current, int length)
{
var argumentOffset = argument ?? 1;
var currentIndex = current ?? -1;
var newIndex = -1;

// The 'first' and 'last' navigation kinds are one-based.
switch (navigationKind)
{
case NavigationKind.First:
newIndex = argument.HasValue ? argument.Value - 1 : 0;
break;
case NavigationKind.Last:
newIndex = argument.HasValue ? argument.Value - 1 : length - 1;
break;
case NavigationKind.Next:
newIndex = currentIndex + argumentOffset;
break;
case NavigationKind.Previous:
newIndex = currentIndex - argumentOffset;
break;
default:
Contract.Assert(false);
break;
}

// public ListItem(int _itemNumber, int _listLength, string _message)
// : this();
//}
return FSharpOption<ListItem>.None;
if (newIndex >= 0 && newIndex < length)
{
return newIndex;
}
return null;
}

public bool OpenLink(string link)
Expand Down

0 comments on commit 7d6cb07

Please sign in to comment.