Spark.Emit.HLSL.EmitContextHLSL.FormatDiagnostics C# (CSharp) Method

FormatDiagnostics() public method

public FormatDiagnostics ( string hlslMessage, IDiagnosticsCollection diagnostics, string profile ) : void
hlslMessage string
diagnostics IDiagnosticsCollection
profile string
return void
        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));
                }
            }
        }