private void _LoadIssuesFromFile(string csvFile) { using (var file = new Godot.File()) { try { Error openError = file.Open(csvFile, Godot.File.ModeFlags.Read); if (openError != Error.Ok) { return; } while (!file.EofReached()) { string[] csvColumns = file.GetCsvLine(); if (csvColumns.Length == 1 && csvColumns[0].Empty()) { return; } if (csvColumns.Length != 7) { GD.PushError($"Expected 7 columns, got {csvColumns.Length}"); continue; } var issue = new BuildIssue { Warning = csvColumns[0] == "warning", File = csvColumns[1], Line = int.Parse(csvColumns[2]), Column = int.Parse(csvColumns[3]), Code = csvColumns[4], Message = csvColumns[5], ProjectFile = csvColumns[6] }; if (issue.Warning) { WarningCount += 1; } else { ErrorCount += 1; } issues.Add(issue); } } finally { file.Close(); // Disposing it is not enough. We need to call Close() } } }
public void UpdateIssuesList() { issuesList.Clear(); using (var warningIcon = GetIcon("Warning", "EditorIcons")) using (var errorIcon = GetIcon("Error", "EditorIcons")) { for (int i = 0; i < issues.Count; i++) { BuildIssue issue = issues[i]; if (!(issue.Warning ? WarningsVisible : ErrorsVisible)) { continue; } string tooltip = string.Empty; tooltip += $"Message: {issue.Message}"; if (!issue.Code.Empty()) { tooltip += $"\nCode: {issue.Code}"; } tooltip += $"\nType: {(issue.Warning ? "warning" : "error")}"; string text = string.Empty; if (!issue.File.Empty()) { text += $"{issue.File}({issue.Line},{issue.Column}): "; tooltip += $"\nFile: {issue.File}"; tooltip += $"\nLine: {issue.Line}"; tooltip += $"\nColumn: {issue.Column}"; } if (!issue.ProjectFile.Empty()) { tooltip += $"\nProject: {issue.ProjectFile}"; } text += issue.Message; int lineBreakIdx = text.IndexOf("\n", StringComparison.Ordinal); string itemText = lineBreakIdx == -1 ? text : text.Substring(0, lineBreakIdx); issuesList.AddItem(itemText, issue.Warning ? warningIcon : errorIcon); int index = issuesList.GetItemCount() - 1; issuesList.SetItemTooltip(index, tooltip); issuesList.SetItemMetadata(index, i); } } }
public void OnBuildExecFailed(string cause) { BuildExited = true; BuildResult = BuildResults.Error; issuesList.Clear(); var issue = new BuildIssue { Message = cause, Warning = false }; ErrorCount += 1; issues.Add(issue); UpdateIssuesList(); GodotSharpEditor.Instance.BottomPanel.RaiseBuildTab(this); }
private void _IssueActivated(int idx) { if (idx < 0 || idx >= issuesList.GetItemCount()) { throw new IndexOutOfRangeException("Item list index out of range"); } // Get correct issue idx from issue list int issueIndex = (int)issuesList.GetItemMetadata(idx); if (idx < 0 || idx >= issues.Count) { throw new IndexOutOfRangeException("Issue index out of range"); } BuildIssue issue = issues[issueIndex]; if (issue.ProjectFile.Empty() && issue.File.Empty()) { return; } string projectDir = issue.ProjectFile.Length > 0 ? issue.ProjectFile.GetBaseDir() : BuildInfo.Solution.GetBaseDir(); string file = Path.Combine(projectDir.SimplifyGodotPath(), issue.File.SimplifyGodotPath()); if (!File.Exists(file)) { return; } file = ProjectSettings.LocalizePath(file); if (file.StartsWith("res://")) { var script = (Script)ResourceLoader.Load(file, typeHint: Internal.CSharpLanguageType); if (script != null && Internal.ScriptEditorEdit(script, issue.Line, issue.Column)) { Internal.EditorNodeShowScriptScreen(); } } }