From 5996f4bbc205471e49a6b1c7b74f4a98e827562c Mon Sep 17 00:00:00 2001 From: Nikolay Kuznetsov Date: Mon, 29 Sep 2025 18:59:10 +0300 Subject: [PATCH] Linux/mono ide fixes (#3330) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update CodeCompletionActions.cs Показ Code Completion Window по Ctrl-Space, если курсор находится сразу после точки (как сделано в Win версии). Текущее поведение - после точки ccw не показывать, только если курсор переместить на несколько символов вправо от точки. * [LIN][IDE] Update TextView.cs - fix GetVisualColumn with empty content На некоторых дистрибутивах Линукс (Убунту в частности) возникает ошибка времени выполнения IDE, Описываю действия - открываю сохраненную на диске программу, запускаю, закрываю, копирую текст программы и вставляю в новую вкладку, не сохраняя, запускаю и закрываю -- в логах пошли ошибки.. но такое не всегда происходит, иногда ошибок нет.. но похоже всё таки, что проявляется, когда есть вкладка с не сохраненным кодом. Причем интересно дефолтный каталог не сохраненной программы зависит от того, из какого каталога загружалась "сохраненная" программа, но не некий "по умолчанию". В результате иследований дошли до функции GetVisualColumn() которая подсчитывает количество столбцов текста в редактируемом документе на основе анализа графического отображения, но в случае если текст отсутствует (Document.Content == ""), на Linux/Mono происходит краш. Предлагаю избегать подсчёта столбцов при отсутствии текста, а сразу возвращать 9 (ноль) * [LIN][IDE] AssemblyResolveScope.cs -- fix OnAssemblyResolve event На некоторых дистрибутивах Linux (Ubuntu 22.04 в частности). При загрузке больших исходников, например GraphABC.pas или GraphABCHelper.pas в IDE на Linux/Mono могут перестать открываться новые вкладки редактора IDE и другие элементы интерфейса IDE. Было обнаружено, что в обработчик OnAssemblyResolve в этом случае приходит значиние поля входной переменной args.RequestingAssembly равное null. Это происходит по какой то причине и не всегда. Но если обрабатывать эту ситуацию, то IDE работает стабильно в этом случае. --- ICSharpCode.TextEditorLinux/Src/Gui/TextView.cs | 7 ++++--- TreeConverter/NetWrappers/AssemblyResolveScope.cs | 4 +++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/ICSharpCode.TextEditorLinux/Src/Gui/TextView.cs b/ICSharpCode.TextEditorLinux/Src/Gui/TextView.cs index c631eb41c..cdf21d4cd 100644 --- a/ICSharpCode.TextEditorLinux/Src/Gui/TextView.cs +++ b/ICSharpCode.TextEditorLinux/Src/Gui/TextView.cs @@ -778,9 +778,10 @@ namespace ICSharpCode.TextEditor public int GetVisualColumn(int logicalLine, int logicalColumn) { int column = 0; - using (Graphics g = textArea.CreateGraphics()) { - CountColumns(ref column, 0, logicalColumn, logicalLine, g); - } + if (TextArea.Document.TextContent.Length > 0) //fix crush under linux after clear document content - no content = zero columns + using (Graphics g = textArea.CreateGraphics()) { + CountColumns(ref column, 0, logicalColumn, logicalLine, g); + } return column; } diff --git a/TreeConverter/NetWrappers/AssemblyResolveScope.cs b/TreeConverter/NetWrappers/AssemblyResolveScope.cs index 972fcadb5..6148b51b9 100644 --- a/TreeConverter/NetWrappers/AssemblyResolveScope.cs +++ b/TreeConverter/NetWrappers/AssemblyResolveScope.cs @@ -146,6 +146,8 @@ namespace PascalABCCompiler.NetHelper private Assembly OnAssemblyResolve(object obj, ResolveEventArgs args) { + if (args.RequestingAssembly == null) //fix Linux/Mono IDE missworking after loading a huge pas source such as GraphABC.pas or GraphABCHelper.pas + return null; var requestedName = new AssemblyName(args.Name); if (_assembliesByName.TryGetValue(requestedName.Name, out var assembly)) return assembly; @@ -177,4 +179,4 @@ namespace PascalABCCompiler.NetHelper return null; } } -} \ No newline at end of file +}