diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs index b9e53fd060..be9067605f 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/CSharp/Lexer.cs +++ b/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); } - if (Char.IsDigit(ch)) { - return ReadDigit(ch, Col - 1); - } + Token token; switch (ch) { case '/': @@ -54,6 +52,8 @@ namespace ICSharpCode.NRefactory.Parser.CSharp if (peek == '/' || peek == '*') { ReadComment(); continue; + } else { + token = ReadOperator('/'); } break; case '#': @@ -63,35 +63,43 @@ namespace ICSharpCode.NRefactory.Parser.CSharp this.specialTracker.AddPreProcessingDirective(directive, argument.Trim(), start, new Point(start.X + directive.Length + argument.Length, start.Y)); continue; case '"': - return ReadString(); + token = ReadString(); + break; case '\'': - return ReadChar(); + token = ReadChar(); + break; case '@': int next = ReaderRead(); if (next == -1) { errors.Error(Line, Col, String.Format("EOF after @")); + continue; } else { int x = Col - 1; int y = Line; ch = (char)next; if (ch == '"') { - return ReadVerbatimString(); - } - if (Char.IsLetterOrDigit(ch)) { - return new Token(Tokens.Identifier, x - 1, y, ReadIdent(ch)); + 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; } - 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; } - Token token = ReadOperator(ch); - - // try error recovery :) - if (token == null) { - return Next(); + // try error recovery (token = null -> continue with next char) + if (token != null) { + return token; } - return token; } return new Token(Tokens.EOF, Col, Line, String.Empty); @@ -270,11 +278,11 @@ namespace ICSharpCode.NRefactory.Parser.CSharp if (d < long.MinValue || d > long.MaxValue) { islong = true; - isunsigned = true; + isunsigned = true; } else if (d < uint.MinValue || d > uint.MaxValue) { - islong = true; + islong = true; } else if (d < int.MinValue || d > int.MaxValue) { - isunsigned = true; + isunsigned = true; } Token token; @@ -606,7 +614,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp return new Token(Tokens.LessThan, x, y); case '>': switch (ReaderPeek()) { -// Removed because of generics: + // Removed because of generics: // case '>': // ReaderRead(); // if (ReaderPeek() != -1) { @@ -640,7 +648,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp // Prevent OverflowException when ReaderPeek returns -1 int tmp = ReaderPeek(); if (tmp > 0 && Char.IsDigit((char)tmp)) { - return ReadDigit('.', Col - 1); + return ReadDigit('.', Col - 1); } return new Token(Tokens.Dot, x, y); case ')': @@ -702,7 +710,7 @@ namespace ICSharpCode.NRefactory.Parser.CSharp curWord.Length = 0; if (specialCommentHash.ContainsKey(tag)) { Point p = new Point(Col, Line); - string comment = ReadToEOL(); + string comment = ch + ReadToEOL(); tagComments.Add(new TagComment(tag, comment, p, new Point(Col, Line))); sb.Append(comment); break; diff --git a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs index bdd3306fb5..6a80c7fefb 100644 --- a/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs +++ b/src/Libraries/NRefactory/Project/Src/Lexer/VBNet/Lexer.cs @@ -542,7 +542,7 @@ namespace ICSharpCode.NRefactory.Parser.VB curWord.Length = 0; if (specialCommentHash.ContainsKey(tag)) { Point p = new Point(Col, Line); - string comment = ReadToEOL(); + string comment = ch + ReadToEOL(); tagComments.Add(new TagComment(tag, comment, p, new Point(Col, Line))); sb.Append(comment); break; diff --git a/src/Main/Base/Project/Src/Gui/Pads/OpenTaskView.cs b/src/Main/Base/Project/Src/Gui/Pads/OpenTaskView.cs index ca2b6aec82..3b89fa8002 100644 --- a/src/Main/Base/Project/Src/Gui/Pads/OpenTaskView.cs +++ b/src/Main/Base/Project/Src/Gui/Pads/OpenTaskView.cs @@ -59,7 +59,6 @@ namespace ICSharpCode.SharpDevelop.Gui TaskService.Added += new TaskEventHandler(TaskServiceAdded); TaskService.Removed += new TaskEventHandler(TaskServiceRemoved); - ProjectService.EndBuild += SelectTaskView; ProjectService.SolutionLoaded += OnCombineOpen; ProjectService.SolutionClosed += OnCombineClosed; @@ -81,7 +80,6 @@ namespace ICSharpCode.SharpDevelop.Gui listView.ItemActivate += new EventHandler(ListViewItemActivate); listView.MouseMove += new MouseEventHandler(ListViewMouseMove); listView.Resize += new EventHandler(ListViewResize); - listView.CreateControl(); ShowResults2(null, null); } @@ -104,18 +102,6 @@ namespace ICSharpCode.SharpDevelop.Gui 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) { if (listView.FocusedItem != null) { @@ -189,9 +175,34 @@ namespace ICSharpCode.SharpDevelop.Gui }); item.ImageIndex = item.StateImageIndex = imageIndex; 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); } + /// Returns true when a > b + 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) { @@ -208,10 +219,12 @@ namespace ICSharpCode.SharpDevelop.Gui void TaskServiceRemoved(object sender, TaskEventArgs e) { Task task = e.Task; - for (int i = 0; i < listView.Items.Count; ++i) { - if ((Task)listView.Items[i].Tag == task) { - listView.Items.RemoveAt(i); - break; + if (task.TaskType == TaskType.Comment) { + for (int i = 0; i < listView.Items.Count; ++i) { + if ((Task)listView.Items[i].Tag == task) { + listView.Items.RemoveAt(i); + break; + } } } } @@ -232,10 +245,6 @@ namespace ICSharpCode.SharpDevelop.Gui void ShowResults2(object sender, EventArgs e) { - // listView.CreateControl is called in the constructor now. - if (!listView.IsHandleCreated) { - return; - } listView.BeginUpdate(); listView.Items.Clear();