NETSquirrel - вопросы и ответы

Это означает, что дело в PCU. Что в PCU что-то не дописывается, а потом когда семантическое дерево восстанавливается, в нём что-то не хватает.

Попроверяйте еще пожалуйста чтобы мы знали это точно

1 лайк

В таком случае, @MrFresnel, пробуйте ПКМ и “сделать активным” на файле программы, а запускать когда открыт файл модуля. Это заставит модуль перекомпилироваться каждый раз, но и новый .pcu файл будет в той же компиляции читать для основной программы. Если конечно я правильно понимаю как это всё работает… Но в случае плавающей Task.Run - этот метод дебага помог сделать ошибку не_плавающей.

Нет, всё также плавающая ошибка, что плохо. Попробовал делать активным как файл самого модуля, так и файл тестовой программы - сбоит то через раз, то нет. Меня смущает, в основном то, что ошибка меняется - точнее, сначала компилятор давал сбой с ExceptionHandler, теперь с SliceSpan. Я бы мог предположить, что в случае SliceSpan это происходит из-за интерфейса IEquatable<> (ошибка, связанная с данным интерфейсом уже была зарегистрирована в PascalABC.NET), но тогда спрашивается чем же не понравился компилятору делегат? Ладно, если бы ошибки были всё время разные и в разных местах, но они фиксированы. И остаётся непонятным по какому принципу они происходят. Точнее: Почему ошибка именно в данной строке, а не в другой? Чем данная строка особенная? Лямбд у меня в коде модуля совсем нет, которые могли бы вызывать проблемы.

Прихлите еще пожалуйста полный комплект файлов где эта ошибка воспроизводится

NETMouse.rar (52.6 KB)

Вместе с тестовой программой.

GenerateMatrix возвращает матрицу T[], хотя в PascalABC.NET её тип отображается как тип массива array of T (ровно также считает и Intellisence). Аналогичная ошибка встречается и в некоторых других методах для матриц.

NETMouse.rar (53.1 KB)

  1. Intellisence обрезает значения строковых параметров по умолчанию:

В метаданных ровно та же самая проблема.

  1. Что следует сделать, чтобы xml-комментарии из dll отображались при использовании полей, методов, свойств и классов?

Сделать следует issue, на каждую из этих проблем. Тут то проблем найти минимальный код нет?

Проблем нет. Займусь этим в ближайшее время. Отпишусь о результатах работы здесь.

@Admin, ещё ошибка: Несколько подпрограмм могут быть вызваны. Последствия таковы, что приходится лишний раз указывать типы-параметры явно.

В коде ничего не менялось, я лишь несколько раз нажал кнопку Компилировать.

Вышеуказанная ошибка появляется, если попытаться откомпилировать программу после сообщения о том, что невозможно получить доступ к файлу. После получения ошибки компиляции Несколько подпрограмм могут быть вызваны можно попробовать откомпилировать модуль и его компиляция обязательно даст сбой - ошибку, подобную Неизвестное имя SliceSpan.

P.S. При перезагрузке IDE следует сначала откомпилировать сломанный модуль, иначе компиляция программы, его использующей, сразу даст сбой (после которой любые попытки откомпилировать модуль будут безуспешны).

Ну, ничего не понимаю. Выкладывайте исходники программ с модулями прямо - они у вас меняются.

Теперь. “невозможно получить доступ к файлу” - эта ошибка при каких ситуациях возникает? Часто? Повторяемость?

Ошибка “Несколько подпрограмм могут быть вызваны” возникает сразу после предыдущей? Всегда?

Если нажать пункт меню “Перекомпилировать всё”, то ошибка, подобная “ошибку, подобную Неизвестное имя SliceSpan” тоже возникает?

NETMouse for .NET with examples.rar (60.3 KB)

Каждый раз перед сбоем ошибкой компиляции Несколько подпрограмм могут быть вызваны (используется кнопка Компилировать). Возникает - за 10 раз в день, точнее воспроизводится стабильно часто. Можно быть уверенным, что при быстрых нажатиях на кнопку Компилировать она очень быстро будет получена. (Альтернатива: Запустить exe-пример и попытаться откомпилировать его из IDE затем, сбой в виде ошибки Несколько подпрограмм могут быть вызваны будет получен гораздо быстрее.)

Да.

Не возникает, но только в том случае, если ошибка Несколько подпрограмм могут быть вызваны ещё не получена.

Там написано имя файла? Расширение у него - exe?

Если это так, то посмотрите - включена ли опция “Удалять exe после выполнения”? включена ли опция “Удалять pdb после выполнения”? Если это так, попробуйте отключить обе и снова попробовать.

Вообще, есть ли какая-то логика в возникновении сообщения “невозможно получить доступ к файлу”? Например, Вы быстро запускаете несколько раз. То есть, файл (видимо exe) что-то держит.

() : Не могу получить доступ к файлу 'C:\PABCWork.NET\NETMouse for .NET with examples\Test\Test.exe'

Ничего не поменялось.

Да, вероятно это так - что-то его держит (только, что?).

Простое - в тот момент когда выдаётся сообщение “Не могу получить доступ к файлу 'C:\PABCWork.NET\NETMouse for .NET with examples\Test\Test.exe” - посмотрите, а есть ли вообще этот exe на диске. Если его нет, то понятное дело, что получить доступ нельзя.

Если есть файл - есть какие-то специальные программы, которые позволяют увидеть, кто держит. Хорошо бы их глянуть.

Что касается следующей ошибки - логичной выглядит версия, что после ошибки с доступом к файлу не очищаются какие-то таблицы компилятора. Код я еще не смотрел.

Только что выяснилось, что ошибка плавающая - точнее Несколько подпрограмм могу быть вызваны может произойти до ошибки получения доступа к файлу (достаточно удивило). Но это происходит не всегда.

Да.

Значит, его кто-то держит. Почитайте, как это установить.

Для начала просто удалите его. Если удалился, значит, доступ к нему уже есть - и так это не установишь

Здесь снова давайте все файлы и рассказывайте последовательность запуска.

Мне кажется, это всё - следствие неправильно сформированного PCU из-за какой-то конструкции в коде. То есть, когда мы блокируем сохранение pcu при помощи директивы {$savepcu false} - я думаю, эта ошибка не происходит

У Вас есть предположения из-за какой?

Нет конечно. Знали бы - скорее всего давно бы уже исправили.

Вот тот код, который вызывает первую ошибку:

try
{
    File.Create(CompilerOptions.OutputFileName).Close();
    string pdb_file_name=Path.ChangeExtension(CompilerOptions.OutputFileName, ".pdb");
    if (File.Exists(pdb_file_name))
        File.Delete(pdb_file_name);
}
catch (Exception)
{
     throw new UnauthorizedAccessToFile(CompilerOptions.OutputFileName);
}

Выложил версию, где ошибка доступа к файлу выводится в расширенном виде. Приведите пожалуйста полный текст ошибки