150 lines
5.8 KiB
C#
Raw Permalink Normal View History

using ANX.Framework.Content.Pipeline;
using Microsoft.Build.Framework;
using Microsoft.VisualStudio.Project;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ANX.Framework.VisualStudio
{
public class ErrorLoggingHelper : MarshalByRefObject
{
public enum MessageImportance
{
Error = 0,
Warning = 1,
Info = 2,
BuildLog = 3,
}
ErrorListProvider errorProvider;
IVsOutputWindowPane outputWindow;
ProjectNode projectNode;
public ErrorLoggingHelper(ProjectNode projectNode, ErrorListProvider errorProvider)
{
if (errorProvider == null)
throw new ArgumentNullException("errorProvider");
this.errorProvider = errorProvider;
this.projectNode = projectNode;
}
public ErrorLoggingHelper(ProjectNode projectNode, ErrorListProvider errorProvider, IVsOutputWindowPane outputWindow)
: this(projectNode, errorProvider)
{
this.outputWindow = outputWindow;
}
public void LogMessage(string subcategory, string code, string helpKeyword, string file, int lineNumber, int columnNumber, MessageImportance importance, string message, params object[] messageArgs)
{
if (message == null)
throw new ArgumentNullException("message");
int index = -1;
if (subcategory != null)
{
index = errorProvider.Subcategories.IndexOf(subcategory);
if (index == -1)
{
index = errorProvider.Subcategories.Add(subcategory);
}
}
if (importance != MessageImportance.BuildLog)
{
errorProvider.Tasks.Add(new Microsoft.VisualStudio.Shell.ErrorTask()
{
ErrorCategory = (TaskErrorCategory)importance,
HierarchyItem = projectNode,
Priority = (TaskPriority)importance,
Category = TaskCategory.BuildCompile,
Column = columnNumber,
Document = file,
HelpKeyword = helpKeyword,
SubcategoryIndex = index,
Line = lineNumber,
Text = string.Format(message, messageArgs) });
}
if (this.outputWindow != null)
{
string finalMesssage = message;
if (messageArgs != null)
finalMesssage = string.Format(message, messageArgs);
this.outputWindow.OutputStringThreadSafe(finalMesssage + Environment.NewLine);
}
}
public void LogMessage(string file, string message, params object[] messageArgs)
{
LogMessage(null, null, null, file, 0, 0, MessageImportance.BuildLog, message, messageArgs);
}
public void LogError(string file, string message, params object[] messageArgs)
{
this.LogCriticalMessage(null, null, null, file, 0, 0, message, messageArgs);
}
public void LogError(Exception exception)
{
int lineNumber = 0;
int columnNumber = 0;
if (exception is InvalidContentException)
{
var exc = (InvalidContentException)exception;
var identity = exc.ContentIdentity;
if (identity != null)
{
identity.TryGetLineAndColumn(out lineNumber, out columnNumber);
}
}
this.LogCriticalMessage(null, null, exception.HelpLink, exception.TargetSite.DeclaringType.Assembly.Location, lineNumber, columnNumber, exception.Message + Environment.NewLine + exception.StackTrace);
}
public void LogCriticalMessage(string subcategory, string code, string helpKeyword, string file, int lineNumber, int columnNumber, string message, params object[] messageArgs)
{
LogMessage(subcategory, code, helpKeyword, file, lineNumber, columnNumber, MessageImportance.Error, message, messageArgs);
}
public void LogWarning(string helpLink, ContentIdentity contentIdentity, string filename, string message, params Object[] messageArgs)
{
int lineNumber = 0;
int columnNumber = 0;
if (contentIdentity != null)
contentIdentity.TryGetLineAndColumn(out lineNumber, out columnNumber);
this.LogWarning(null, null, helpLink, filename, lineNumber, columnNumber, message, messageArgs);
}
public void LogMessage(string helpLink, ContentIdentity contentIdentity, string file, string message, params Object[] messageArgs)
{
this.LogMessage(helpLink, contentIdentity, file, MessageImportance.BuildLog, message, messageArgs);
}
public void LogMessage(string helpLink, ContentIdentity contentIdentity, string file, MessageImportance importance, string message, params Object[] messageArgs)
{
int lineNumber = 0;
int columnNumber = 0;
if (contentIdentity != null)
contentIdentity.TryGetLineAndColumn(out lineNumber, out columnNumber);
this.LogMessage(null, null, helpLink, file, lineNumber, columnNumber, importance, message, messageArgs);
}
public void LogWarning(string subcategory, string warningCode, string helpKeyword, string file, int lineNumber, int columnNumber, string message, params object[] messageArgs)
{
LogMessage(subcategory, warningCode, helpKeyword, file, lineNumber, columnNumber, MessageImportance.Warning, message, messageArgs);
}
}
}