Hello guys,
this should be fairly common problem, however I have not find the solution yet.
I am logging errors in two ways:
1) When you work with IWpfTextView individually.
This is the code I am using:
internal class TaskListPresenter
{
private readonly ICodeService _codeService;
private readonly ErrorListProvider _errorList;
private readonly IWpfTextView _textView;
private int _bufferTrackIndex = 0;
private IVsSolution _vsSolution;
public TaskListPresenter(IWpfTextView textView, IServiceProvider serviceProvider)
{
_textView = textView;
_textView.TextBuffer.Changed += OnTextBufferChanged;
_textView.Closed += OnTextViewClosed;
_codeService = serviceProvider.GetService(typeof (ICodeService)) as ICodeService;
_vsSolution = serviceProvider.GetService(typeof(SVsSolution)) as IVsSolution;
_errorList = new ErrorListProvider(serviceProvider);
CreateErrors(_bufferTrackIndex);
}
private void OnTextViewClosed(object sender, EventArgs e)
{
// when a text view is closed we want to remove the corresponding errors from the error list
ClearErrors();
}
private void OnTextBufferChanged(object sender, TextContentChangedEventArgs e)
{
var dt = new DispatcherTimer(DispatcherPriority.Send);
dt.Tick += (s, ev) =>
{
dt.Stop();
CreateErrors(++_bufferTrackIndex);
};
dt.Interval = TimeSpan.FromMilliseconds(2500);
dt.Start();
}
private void ClearErrors()
{
_errorList.Tasks.Clear();
}
private void CreateErrors(int index)
{
// if the track index is not the same as passed index,
// it means that this is "old"
if (_bufferTrackIndex != index)
return;
var textBuffer = _textView.TextBuffer;
var report = _codeService.Analyze(textBuffer.CurrentSnapshot.GetText());
ClearErrors();
var uniqueFileName =
_textView.TextBuffer.Properties.GetProperty<ITextDocument>(typeof (ITextDocument)).FilePath;
IVsHierarchy objVsHierarchy = null;
var project = ProjectFileHelper.GetContainingProject(uniqueFileName);
if (project != null)
ErrorHandler.ThrowOnFailure(_vsSolution.GetProjectOfUniqueName(project.UniqueName, out objVsHierarchy));
foreach (var message in report.Issues)
{
var sourceSpan = message.SourceSpan;
int startIndex =
textBuffer.CurrentSnapshot.GetLineFromLineNumber(sourceSpan.Location.Line).Start.Position +
sourceSpan.Location.Column;
//var span = new Span(message.SourceSpan.Location.Position, message.SourceSpan.Length);
var span = new Span(startIndex, sourceSpan.Length);
// creates the instance that will be added to the Error List
var task = new ErrorTask
{
Category = TaskCategory.All,
Priority = TaskPriority.Normal,
Document = uniqueFileName,
ErrorCategory = TranslateErrorCategory(message.IssueType),
Text = message.Content,
Line = message.SourceSpan.Location.Line,
Column = message.SourceSpan.Location.Column,
HierarchyItem = objVsHierarchy
};
task.Navigate += OnTaskNavigate;
_errorList.Tasks.Add(task);
}
}
}
As you can see, nothing fancy. If you change buffer in IWpfTextView, it'll create errors & log these.Now, I also "log" errors in second place, namely when you rebuild/build.
This happens in my custom MSBUILD task, I use 'new TaskLoggingHelper(this.Log)' Microsoft class to actually log my error messages.
The problem comes from the fact that my errors are now duplicated:
Say I work with IWpfTextView AFTER I've rebuild the project, I will add "duplicate" error now.
The problem is that I have no "connection" between those different logging mechanisms.
One has no idea about another(nor its messages) and vice versa. How do you deal with this? Custom MPF project.
C#/C++ | WPF/DirectShow/OpenGL/Winapi/