public void FormatDiagnostics(
string hlslMessage,
IDiagnosticsCollection diagnostics,
string profile)
{
DumpedShaderInfo dumpedShader = null;
DumpedFileInfo dumpedFile = null;
var lines = hlslMessage.Split(new string[] { Environment.NewLine, "\n" }, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
string rangeEndStr = "): ";
int rangeEndIdx = line.IndexOf(rangeEndStr);
int hlslLineNumber = 1;
int hlslLineIdx = 0;
int hlslColNumber = 0;
string messageStr = line;
if (rangeEndIdx >= 0)
{
var rangeStr = line.Substring(0, rangeEndIdx);
rangeStr = rangeStr.Substring(rangeStr.LastIndexOf('(') + 1);
var lineStr = rangeStr.Substring(0, rangeStr.IndexOf(','));
hlslLineNumber = int.Parse(lineStr);
hlslLineIdx = hlslLineNumber - 1;
var hlslColStr = rangeStr.Substring(rangeStr.IndexOf(',') + 1);
hlslColNumber = int.Parse(hlslColStr);
messageStr = line.Substring(rangeEndIdx + rangeEndStr.Length);
}
var severityEndStr = " ";
int severityEndIdx = messageStr.IndexOf(severityEndStr);
var severityStr = messageStr.Substring(0, severityEndIdx);
Severity severity = Severity.Error;
switch (severityStr)
{
case "error":
severity = Severity.Error;
break;
case "warning":
severity = Severity.Warning;
break;
default:
break;
}
messageStr = messageStr.Substring(severityEndIdx + severityEndStr.Length);
int errorCodeSplitIdx = messageStr.IndexOf(':');
var errorCodeStr = messageStr.Substring(0, errorCodeSplitIdx);
messageStr = messageStr.Substring(errorCodeSplitIdx + 1);
if (dumpedShader == null)
{
dumpedShader = DumpShader();
}
var action = ActionForHLSLDiagnostic(errorCodeStr, dumpedShader.lineErrorMasks[hlslLineIdx]);
if (action >= DiagnosticAction.Report)
{
var sparkRange = dumpedShader.sparkLineRanges[hlslLineIdx];
diagnostics.Add(
severity,
sparkRange,
string.Format("HLSL compiler {0} {1}:{2}", severityStr, errorCodeStr, messageStr));
}
if (action >= DiagnosticAction.DumpAndReport && dumpedFile == null)
{
dumpedFile = DumpFile(dumpedShader, profile);
var hlslRemappedLineNumber = dumpedShader.hlslLineRemap[hlslLineIdx];
var hlslRange = new SourceRange(
dumpedFile.path,
new SourcePos(hlslRemappedLineNumber, hlslColNumber));
diagnostics.Add(
severity,
hlslRange,
string.Format("{0}:{1}", errorCodeStr, messageStr));
}
}
}