Browse Source

Fixed SD2-380: TODO Parsing Bug.

OpenTaskView now sorts it's entries, this prevent having the task entries "jump around" if you edit a file containing tasks.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@355 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 21 years ago
parent
commit
6a9bf64985
  1. 40
      src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs
  2. 2
      src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs
  3. 47
      src/Main/Base/Project/Src/Gui/Pads/OpenTaskView.cs

40
src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs

@ -44,9 +44,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
return new Token(Tokens.Identifier, x, y, s); return new Token(Tokens.Identifier, x, y, s);
} }
if (Char.IsDigit(ch)) { Token token;
return ReadDigit(ch, Col - 1);
}
switch (ch) { switch (ch) {
case '/': case '/':
@ -54,6 +52,8 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
if (peek == '/' || peek == '*') { if (peek == '/' || peek == '*') {
ReadComment(); ReadComment();
continue; continue;
} else {
token = ReadOperator('/');
} }
break; break;
case '#': case '#':
@ -63,36 +63,44 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
this.specialTracker.AddPreProcessingDirective(directive, argument.Trim(), start, new Point(start.X + directive.Length + argument.Length, start.Y)); this.specialTracker.AddPreProcessingDirective(directive, argument.Trim(), start, new Point(start.X + directive.Length + argument.Length, start.Y));
continue; continue;
case '"': case '"':
return ReadString(); token = ReadString();
break;
case '\'': case '\'':
return ReadChar(); token = ReadChar();
break;
case '@': case '@':
int next = ReaderRead(); int next = ReaderRead();
if (next == -1) { if (next == -1) {
errors.Error(Line, Col, String.Format("EOF after @")); errors.Error(Line, Col, String.Format("EOF after @"));
continue;
} else { } else {
int x = Col - 1; int x = Col - 1;
int y = Line; int y = Line;
ch = (char)next; ch = (char)next;
if (ch == '"') { if (ch == '"') {
return ReadVerbatimString(); token = ReadVerbatimString();
} else if (Char.IsLetterOrDigit(ch)) {
token = new Token(Tokens.Identifier, x - 1, y, ReadIdent(ch));
} else {
errors.Error(y, x, String.Format("Unexpected char in Lexer.Next() : {0}", ch));
continue;
} }
if (Char.IsLetterOrDigit(ch)) {
return new Token(Tokens.Identifier, x - 1, y, ReadIdent(ch));
} }
errors.Error(y, x, String.Format("Unexpected char in Lexer.Next() : {0}", ch)); break;
default:
if (Char.IsDigit(ch)) {
token = ReadDigit(ch, Col - 1);
} else {
token = ReadOperator(ch);
} }
break; break;
} }
Token token = ReadOperator(ch); // try error recovery (token = null -> continue with next char)
if (token != null) {
// try error recovery :)
if (token == null) {
return Next();
}
return token; return token;
} }
}
return new Token(Tokens.EOF, Col, Line, String.Empty); return new Token(Tokens.EOF, Col, Line, String.Empty);
} }
@ -702,7 +710,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp
curWord.Length = 0; curWord.Length = 0;
if (specialCommentHash.ContainsKey(tag)) { if (specialCommentHash.ContainsKey(tag)) {
Point p = new Point(Col, Line); Point p = new Point(Col, Line);
string comment = ReadToEOL(); string comment = ch + ReadToEOL();
tagComments.Add(new TagComment(tag, comment, p, new Point(Col, Line))); tagComments.Add(new TagComment(tag, comment, p, new Point(Col, Line)));
sb.Append(comment); sb.Append(comment);
break; break;

2
src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs

@ -542,7 +542,7 @@ namespace ICSharpCode.NRefactory.Parser.VB
curWord.Length = 0; curWord.Length = 0;
if (specialCommentHash.ContainsKey(tag)) { if (specialCommentHash.ContainsKey(tag)) {
Point p = new Point(Col, Line); Point p = new Point(Col, Line);
string comment = ReadToEOL(); string comment = ch + ReadToEOL();
tagComments.Add(new TagComment(tag, comment, p, new Point(Col, Line))); tagComments.Add(new TagComment(tag, comment, p, new Point(Col, Line)));
sb.Append(comment); sb.Append(comment);
break; break;

47
src/Main/Base/Project/Src/Gui/Pads/OpenTaskView.cs

@ -59,7 +59,6 @@ namespace ICSharpCode.SharpDevelop.Gui
TaskService.Added += new TaskEventHandler(TaskServiceAdded); TaskService.Added += new TaskEventHandler(TaskServiceAdded);
TaskService.Removed += new TaskEventHandler(TaskServiceRemoved); TaskService.Removed += new TaskEventHandler(TaskServiceRemoved);
ProjectService.EndBuild += SelectTaskView;
ProjectService.SolutionLoaded += OnCombineOpen; ProjectService.SolutionLoaded += OnCombineOpen;
ProjectService.SolutionClosed += OnCombineClosed; ProjectService.SolutionClosed += OnCombineClosed;
@ -81,7 +80,6 @@ namespace ICSharpCode.SharpDevelop.Gui
listView.ItemActivate += new EventHandler(ListViewItemActivate); listView.ItemActivate += new EventHandler(ListViewItemActivate);
listView.MouseMove += new MouseEventHandler(ListViewMouseMove); listView.MouseMove += new MouseEventHandler(ListViewMouseMove);
listView.Resize += new EventHandler(ListViewResize); listView.Resize += new EventHandler(ListViewResize);
listView.CreateControl();
ShowResults2(null, null); ShowResults2(null, null);
} }
@ -104,18 +102,6 @@ namespace ICSharpCode.SharpDevelop.Gui
listView.Items.Clear(); listView.Items.Clear();
} }
void SelectTaskView(object sender, EventArgs e)
{
if (TaskService.TaskCount > 0) {
WorkbenchSingleton.SafeThreadCall(this, "SelectTaskView2");
}
}
void SelectTaskView2()
{
WorkbenchSingleton.Workbench.WorkbenchLayout.ActivatePad(this.GetType().FullName);
}
void ListViewItemActivate(object sender, EventArgs e) void ListViewItemActivate(object sender, EventArgs e)
{ {
if (listView.FocusedItem != null) { if (listView.FocusedItem != null) {
@ -189,9 +175,34 @@ namespace ICSharpCode.SharpDevelop.Gui
}); });
item.ImageIndex = item.StateImageIndex = imageIndex; item.ImageIndex = item.StateImageIndex = imageIndex;
item.Tag = task; item.Tag = task;
listView.Items.Add(item); // insert new item into sorted list (binary search)
int left = 0;
int right = listView.Items.Count - 1;
while (left <= right) {
int m = left + (right - left) / 2;
if (CompareItems(item, listView.Items[m])) {
left = m + 1;
} else {
right = m - 1;
}
}
listView.Items.Insert(left, item);
} }
/// <summary>Returns true when a &gt; b</summary>
bool CompareItems(ListViewItem a, ListViewItem b)
{
// insert sorted by: Directory, FileName, Line
int res = string.Compare(a.SubItems[4].Text, b.SubItems[4].Text, StringComparison.InvariantCultureIgnoreCase);
if (res > 0) return true;
if (res < 0) return false;
res = string.Compare(a.SubItems[3].Text, b.SubItems[3].Text, StringComparison.InvariantCultureIgnoreCase);
if (res > 0) return true;
if (res < 0) return false;
Task x = (Task)a.Tag;
Task y = (Task)b.Tag;
return x.Line > y.Line;
}
void TaskServiceCleared(object sender, EventArgs e) void TaskServiceCleared(object sender, EventArgs e)
{ {
@ -208,6 +219,7 @@ namespace ICSharpCode.SharpDevelop.Gui
void TaskServiceRemoved(object sender, TaskEventArgs e) void TaskServiceRemoved(object sender, TaskEventArgs e)
{ {
Task task = e.Task; Task task = e.Task;
if (task.TaskType == TaskType.Comment) {
for (int i = 0; i < listView.Items.Count; ++i) { for (int i = 0; i < listView.Items.Count; ++i) {
if ((Task)listView.Items[i].Tag == task) { if ((Task)listView.Items[i].Tag == task) {
listView.Items.RemoveAt(i); listView.Items.RemoveAt(i);
@ -215,6 +227,7 @@ namespace ICSharpCode.SharpDevelop.Gui
} }
} }
} }
}
/// <summary> /// <summary>
@ -232,10 +245,6 @@ namespace ICSharpCode.SharpDevelop.Gui
void ShowResults2(object sender, EventArgs e) void ShowResults2(object sender, EventArgs e)
{ {
// listView.CreateControl is called in the constructor now.
if (!listView.IsHandleCreated) {
return;
}
listView.BeginUpdate(); listView.BeginUpdate();
listView.Items.Clear(); listView.Items.Clear();

Loading…
Cancel
Save