Browse Source

Fixed some bugs in code completion and error drawing.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@122 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 20 years ago
parent
commit
42b4743835
  1. 2
      src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs
  2. 2
      src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs
  3. 11
      src/Main/Base/Project/Src/Services/Tasks/TaskService.cs
  4. 128
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/ErrorDrawer.cs
  5. 2
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/IndexerInsightDataProvider.cs
  6. 1
      src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

2
src/Main/Base/Project/Src/Dom/NRefactoryResolver/NRefactoryResolver.cs

@ -739,7 +739,7 @@ namespace ICSharpCode.SharpDevelop.Dom.NRefactoryResolver
} }
result.AddRange(projectContent.GetNamespaceContents("")); result.AddRange(projectContent.GetNamespaceContents(""));
foreach (IUsing u in cu.Usings) { foreach (IUsing u in cu.Usings) {
if (u != null && (u.Region == null || u.Region.IsInside(caretLine, caretColumn))) { if (u != null) {
foreach (string name in u.Usings) { foreach (string name in u.Usings) {
result.AddRange(projectContent.GetNamespaceContents(name)); result.AddRange(projectContent.GetNamespaceContents(name));
} }

2
src/Main/Base/Project/Src/Services/ParserService/CaseSensitiveProjectContent.cs

@ -318,7 +318,7 @@ namespace ICSharpCode.Core
} }
foreach (IUsing u in unit.Usings) { foreach (IUsing u in unit.Usings) {
if (u != null && (u.Region == null || u.Region.IsInside(caretLine, caretColumn))) { if (u != null) {
string nameSpace = u.SearchNamespace(name); string nameSpace = u.SearchNamespace(name);
if (nameSpace != null) { if (nameSpace != null) {
return nameSpace; return nameSpace;

11
src/Main/Base/Project/Src/Services/Tasks/TaskService.cs

@ -177,15 +177,14 @@ namespace ICSharpCode.Core
for (int i = 0; i < newTasks.Count; ++i) { for (int i = 0; i < newTasks.Count; ++i) {
for (int j = 0; j < oldTasks.Count; ++j) { for (int j = 0; j < oldTasks.Count; ++j) {
if (newTasks[i].Line == oldTasks[j].Line && if (oldTasks[j] != null &&
newTasks[i].Line == oldTasks[j].Line &&
newTasks[i].Column == oldTasks[j].Column && newTasks[i].Column == oldTasks[j].Column &&
newTasks[i].Description == oldTasks[j].Description) { newTasks[i].Description == oldTasks[j].Description)
{
newTasks[i] = null; newTasks[i] = null;
oldTasks[j] = null; oldTasks[j] = null;
++i; break;
if (i >= newTasks.Count) {
break;
}
} }
} }
} }

128
src/Main/Base/Project/Src/TextEditor/Gui/Editor/ErrorDrawer.cs

@ -24,16 +24,26 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
/// </summary> /// </summary>
public class VisualError : TextMarker public class VisualError : TextMarker
{ {
public VisualError(int offset, int length, string description, bool isError) : base(offset, length, TextMarkerType.WaveLine, isError ? Color.Red : Color.Orange) Task task;
public Task Task {
get {
return task;
}
}
public VisualError(int offset, int length, Task task)
: base(offset, length, TextMarkerType.WaveLine, (task.TaskType == TaskType.Error) ? Color.Red : Color.Orange)
{ {
base.ToolTip = description.Replace("&", "&&&"); this.task = task;
base.ToolTip = task.Description.Replace("&", "&&&");
} }
} }
/// <summary> /// <summary>
/// This class draws error underlines. /// This class draws error underlines.
/// </summary> /// </summary>
public class ErrorDrawer public class ErrorDrawer : IDisposable
{ {
ArrayList errors = new ArrayList(); ArrayList errors = new ArrayList();
TextEditorControl textEditor; TextEditorControl textEditor;
@ -42,55 +52,111 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{ {
this.textEditor = textEditor; this.textEditor = textEditor;
// TODO: Tasks Changed!!! TaskService.Added += new TaskEventHandler(OnAdded);
// TaskService.TasksChanged += new EventHandler(SetErrors); TaskService.Removed += new TaskEventHandler(OnRemoved);
TaskService.Cleared += new EventHandler(OnCleared);
textEditor.FileNameChanged += new EventHandler(SetErrors); textEditor.FileNameChanged += new EventHandler(SetErrors);
} }
void ClearErrors() /// <summary>
/// Deregisters the event handlers so the error drawer (and associated TextEditorControl)
/// can be garbage collected.
/// </summary>
public void Dispose()
{
TaskService.Added -= new TaskEventHandler(OnAdded);
TaskService.Removed -= new TaskEventHandler(OnRemoved);
TaskService.Cleared -= new EventHandler(OnCleared);
textEditor.FileNameChanged -= new EventHandler(SetErrors);
ClearErrors();
}
void OnAdded(object sender, TaskEventArgs e)
{
AddTask(e.Task, true);
}
void OnRemoved(object sender, TaskEventArgs e)
{
Task t = e.Task;
List<TextMarker> markers = textEditor.Document.MarkerStrategy.TextMarker;
for (int i = 0; i < markers.Count; ++i) {
VisualError ve = markers[i] as VisualError;
if (ve != null && ve.Task == t) {
markers.RemoveAt(i);
textEditor.Refresh();
break;
}
}
}
void OnCleared(object sender, EventArgs e)
{
if (ClearErrors()) {
textEditor.Refresh();
}
}
/// <summary>
/// Clears all TextMarkers representing errors.
/// </summary>
/// <returns>Returns true when there were markers deleted, false when there were no error markers.</returns>
bool ClearErrors()
{ {
bool removed = false;
List<TextMarker> markers = textEditor.Document.MarkerStrategy.TextMarker; List<TextMarker> markers = textEditor.Document.MarkerStrategy.TextMarker;
for (int i = 0; i < markers.Count;) { for (int i = 0; i < markers.Count;) {
if (markers[i] is VisualError) { if (markers[i] is VisualError) {
removed = true;
markers.RemoveAt(i); markers.RemoveAt(i);
} else { } else {
i++; // Check next one i++; // Check next one
} }
} }
return removed;
} }
void SetErrors(object sender, EventArgs e) bool CheckTask(Task task)
{ {
ClearErrors(); if (textEditor.FileName == null)
if (textEditor.FileName == null) { return false;
return; if (task.FileName == null || task.FileName.Length == 0 || task.Column < 0)
} return false;
if (task.TaskType != TaskType.Warning && task.TaskType != TaskType.Error)
foreach (Task task in TaskService.Tasks) { return false;
if (task.FileName == null || task.FileName.Length == 0 || task.Column < 0) { return string.Equals(Path.GetFullPath(task.FileName), Path.GetFullPath(textEditor.FileName), StringComparison.CurrentCultureIgnoreCase);
continue; }
}
if (Path.GetFullPath(task.FileName).ToLower() == Path.GetFullPath(textEditor.FileName).ToLower() && (task.TaskType == TaskType.Warning || task.TaskType == TaskType.Error)) { void AddTask(Task task, bool refresh)
if (task.Line >= 0 && task.Line < textEditor.Document.TotalNumberOfLines) { {
LineSegment line = textEditor.Document.GetLineSegment(task.Line); if (!CheckTask(task)) return;
if (line.Words != null) { if (task.Line >= 0 && task.Line < textEditor.Document.TotalNumberOfLines) {
int offset = line.Offset + task.Column; LineSegment line = textEditor.Document.GetLineSegment(task.Line);
foreach (TextWord tw in line.Words) { if (line.Words != null) {
if (task.Column >= tw.Offset && task.Column < (tw.Offset + tw.Length)) { int offset = line.Offset + task.Column;
textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(offset, tw.Length, task.Description, task.TaskType == TaskType.Error)); foreach (TextWord tw in line.Words) {
break; if (task.Column >= tw.Offset && task.Column < (tw.Offset + tw.Length)) {
} textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(offset, tw.Length, task));
if (refresh) {
textEditor.Refresh();
} }
return;
} }
/* }
}
/*
int startOffset = offset;//Math.Min(textEditor.Document.TextLength, TextUtilities.FindWordStart(textEditor.Document, offset)); int startOffset = offset;//Math.Min(textEditor.Document.TextLength, TextUtilities.FindWordStart(textEditor.Document, offset));
int endOffset = Math.Max(1, TextUtilities.FindWordEnd(textEditor.Document, offset)); int endOffset = Math.Max(1, TextUtilities.FindWordEnd(textEditor.Document, offset));
textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(startOffset, endOffset - startOffset + 1, task.Description, task.TaskType == TaskType.Error));*/ textEditor.Document.MarkerStrategy.TextMarker.Add(new VisualError(startOffset, endOffset - startOffset + 1, task.Description, task.TaskType == TaskType.Error));*/
}
}
} }
}
void SetErrors(object sender, EventArgs e)
{
ClearErrors();
foreach (Task task in TaskService.Tasks) {
AddTask(task, false);
}
textEditor.Refresh(); textEditor.Refresh();
} }
} }

2
src/Main/Base/Project/Src/TextEditor/Gui/Editor/InsightWindow/IndexerInsightDataProvider.cs

@ -75,9 +75,9 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
if (projectContent == null) if (projectContent == null)
return; return;
IClass c = projectContent.GetClass(type.FullyQualifiedName); IClass c = projectContent.GetClass(type.FullyQualifiedName);
bool canViewProtected = c.IsTypeInInheritanceTree(result.CallingClass);
if (c == null) if (c == null)
return; return;
bool canViewProtected = c.IsTypeInInheritanceTree(result.CallingClass);
foreach (IIndexer i in c.Indexer) { foreach (IIndexer i in c.Indexer) {
if (i.IsAccessible(result.CallingClass, canViewProtected)) { if (i.IsAccessible(result.CallingClass, canViewProtected)) {
methods.Add(i); methods.Add(i);

1
src/Main/Base/Project/Src/TextEditor/Gui/Editor/SharpDevelopTextAreaControl.cs

@ -92,6 +92,7 @@ namespace ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor
{ {
base.Dispose(Disposing); base.Dispose(Disposing);
if (disposing) { if (disposing) {
errorDrawer.Dispose();
CloseCodeCompletionWindow(this, EventArgs.Empty); CloseCodeCompletionWindow(this, EventArgs.Empty);
CloseInsightWindow(this, EventArgs.Empty); CloseInsightWindow(this, EventArgs.Empty);
} }

Loading…
Cancel
Save