Ошибки компилятора PascalABC.Net

“Система быстрее чинится, если её доломать” - это правда. И если бы @a[] выдавало ошибку - это правило давало бы прекрасный результат. Но, конечно, ошибка не вариант, потому что совместимость… Или по крайней мере я на неё не надеюсь.

Утечку памяти сложно заметить и ещё сложнее понять, что дело в криворукости программиста, а не компилятора.

Я предложил предупреждение по аналогии с for-var. То есть я предложил назвать неправильный код неправильным и не_современным, при этом не пытаясь всемирно запретить стрелять себе в ногу.

Попробовал срезы на C#/Python/PascalABCnet. Есть различие. В PABCnet менее гибко выходит.

Можно сделать так чтобы в последнем случае возвращалась пустая строка? В C#/Python возвращается пустая строка

1 лайк

PascalABC.NET - не C# и не Python тем более.

Используйте безопасные срезы: s?[:i] - и будет то что Вы хотите

Я тоже так хотел ответить, но по моему в паскале таки не логично работает. К примеру так возвращает пустую строку:

begin
  'abc'[:1].Length.Println;
end.

А с другой стороны уже оказывается нельзя.

И не контролируемые безопасные срезы это вообще плохо. В реальной программе обычно надо всё же выдавать ошибку при i>s.Length.

А если уже добавлять ещё 1 строчку для проверки - пропадает весь смысл использовать срезы. Лучше вообще что то типа .SubString, код и то проще будет (чем с проверкой).

2 лайка

Еще мысль для обсуждения: расширить ## и ### в конце 0: ##0 или ###0 …для нумерации срок с 0, чтобы инструкцию компилятору не писать

Для предложений отдельная тема.

Жуть какая. Пользуйтесь обычными срезами - и у вас будет маленький аналог SubString

Если честно, то более гибко. Хотите контроль - используете обычные срезы, хотите бесконтрольно, “как в Питон” - используйте безопасные срезы.

Экспериментируя с удаленной сборкой Паскаля на Гитхабе (на их VM WinServer 2016), обнаружил несколько проблем, которые мешают полноценной автоматизированной сборке:

  1. Из-за ошибки в настройке проектов CodeTemplatesPlugin.csproj и CodeTemplatesPlugin_40.csproj откомпилированная CodeTemplatesPlugin.dll не попадает в папку \bin. Разработчики этого не замечают скорее всего потому, что у них локально в \bin сохранилась еще “старая” копия. По этой же причине, я думаю, в последнее время в XP-версии регулярно ломается функционал шаблонов кода, т.к. в XP-дистрибутив все время попадает эта “старая” сборка, сконфигурированная для платформы .NET 4.7.1, а не 4.0.

  2. С библиотекой PABCRtl.dll вообще очень странная ситуация: в офиц. дистрибутиве её размер ~1.1 МБ, но у меня при компиляции получаются какие-то битые сборки размером 391…399 КБ. Из-за этого все тесты с PABCRtl в TestRunner падают (см. логи ниже). Причем я пробовал компилировать её и консольными компиляторами, и через IDE, и в debug, и в release режимах, и своим самосборным дистрибутивом (пока консольным), и в офиц. дистрибутиве последней версии (3.7.1-2677 от 05.09.2020) – результат такой же (отрицательный), небольшая разница проявляется только в размере из-за отладочной информации. Никаких ошибок компиляции или предупреждений при этом не возникает. Собирал все локально или удаленно только на Win10 x64 (c .NET 4.8). @admin У вас она всегда собирается нормально и на каком Windows?

Вот одна из таких “кривых” сборок: PABCRtl.dll (391 КБ)

Лог её компиляции через pabcnetc.exe (в интер. режиме с Debug=0, Rebuild=1)
Compiling assembly PABCRtl.pas...[0]CompilationStarting PABCRtl.pas...
[0]BeginCompileFile PABCRtl.pas...
[0]BeginParsingFile PABCRtl.pas...
[16]EndParsingFile PABCRtl.pas...
[0]SyntaxTreeConversion Standard...
[0]BeginCompileFile __RtlUtils.pas...
[0]BeginParsingFile __RtlUtils.pas...
[0]EndParsingFile __RtlUtils.pas...
[0]SyntaxTreeConversion Standard...
[0]ReadPCUFile PABCSystem.pcu...
[159]ReadDLL System.dll...
[2]ReadDLL mscorlib.dll...
[5]ReadDLL System.Core.dll...
[0]ReadDLL System.Numerics.dll...
[2]ReadPCUFile PABCExtensions.pcu...
[1]CompileInterface __RtlUtils.pas...
[1]CompileImplementation __RtlUtils.pas...
[0]EndCompileFile __RtlUtils.pas...
[1]ReadPCUFile __RunMode.pcu...
[1]ReadPCUFile __RedirectIOMode.pcu...
[0]ReadDLL System.Windows.Forms.dll...
[2]ReadPCUFile GraphWPFBase.pcu...
[0]ReadDLL PresentationFramework.dll...
[0]ReadDLL WindowsBase.dll...
[0]ReadDLL PresentationCore.dll...
[0]ReadPCUFile GraphWPF.pcu...
[0]ReadPCUFile Graph3D.pcu...
[0]ReadDLL System.Xml.dll...
[0]ReadDLL HelixToolkit.Wpf.dll...
[0]ReadPCUFile WPFObjects.pcu...
[0]ReadPCUFile ClientServer.pcu...
[0]ReadPCUFile Arrays.pcu...
[0]ReadPCUFile Collections.pcu...
[0]ReadPCUFile FormsABC.pcu...
[0]ReadDLL System.Drawing.dll...
[0]ReadPCUFile RBDMUtils.pcu...
[0]ReadPCUFile PT4TaskMakerNET.pcu...
[16]ReadPCUFile Timers.pcu...
[0]ReadPCUFile VCL.pcu...
[0]ReadPCUFile Utils.pcu...
[0]ReadPCUFile Sockets.pcu...
[0]ReadPCUFile GraphABCHelper.pcu...
[0]ReadPCUFile GraphABC.pcu...
[0]ReadPCUFile IniFile.pcu...
[0]ReadPCUFile RobotField.pcu...
[0]ReadPCUFile RobotTaskMaker.pcu...
[0]ReadPCUFile RobotZadan.pcu...
[0]ReadPCUFile Robot.pcu...
[16]ReadPCUFile PointRect.pcu...
[0]ReadPCUFile PointerTools.pcu...
[0]ReadPCUFile FilesOperations.pcu...
[0]ReadPCUFile Events.pcu...
[0]ReadPCUFile DMCollect.pcu...
[0]ReadPCUFile DrawManField.pcu...
[0]ReadPCUFile DMTaskMaker.pcu...
[0]ReadPCUFile DMZadan.pcu...
[0]ReadPCUFile Drawman.pcu...
[0]ReadPCUFile CRT.pcu...
[16]ReadPCUFile ABCObjects.pcu...
[0]ReadPCUFile ABCSprites.pcu...
[0]ReadPCUFile ABCHouse.pcu...
[0]ReadPCUFile ABCButtons.pcu...
[0]CompileInterface PABCRtl.pas...
[0]CompileImplementation PABCRtl.pas...
[0]EndCompileFile PABCRtl.pas...
[109]SavePCUFile __RtlUtils.pcu...
[16]SemanticTreeConversion Optimizer...
[0]CodeGeneration PABCRtl.dll...
[359]CompilationFinished PABCRtl.pas...
Ready.
Total: 1 files (0kb,48lines). Time: 736,8791ms

Падение ‘TestRunner.exe 5’ – с “кривой” сборкой PABCRtl.dll в GAC:

a) при вызове CompileAllRunTests(true):
**ERROR: Compilation of D:\a\pascalabcnet\pascalabcnet\TestSuite\06_ShortFunc.pas failed
Внутренняя ошибка компилятора в модуле Compiler.Compile[06_ShortFunc.pas] :'System.ArgumentNullException: Value cannot be null.
Parameter name: source
  at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
  at PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.CheckSpecialFunctionCall(List`1 sil, expressions_list exprs, location loc)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.find_operator(String name, expression_node left, expression_node right, location loc, Boolean no_search_in_extension_methods)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.AssignCheckAndConvert(assign _assign, addressed_expression& to, expression_node& from)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(assign _assign)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
  at PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
  at PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
  at PascalABCCompiler.Compiler.Compile() System.ArgumentNullException: Value cannot be null.
Parameter name: source
  at System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
  at PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.CheckSpecialFunctionCall(List`1 sil, expressions_list exprs, location loc)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.find_operator(String name, expression_node left, expression_node right, location loc, Boolean no_search_in_extension_methods)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(bin_expr _bin_expr)
  at PascalABCCompiler.TreeConverter.returner.visit(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.AssignCheckAndConvert(assign _assign, addressed_expression& to, expression_node& from)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(assign _assign)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
  at PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
  at PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
  at PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
  at PascalABCCompiler.Compiler.Compile()'
b) при вызове CompileAllCompilationTests('pabcrtl_tests', true)
***ERROR: Compilation of D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\pabcrtl_tests\ABC1.pas failed
Внутренняя ошибка компилятора в модуле Compiler.Compile[ABC1.pas] :'System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source
   в System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   в PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_method_call(method_call _method_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(method_call _method_call)
   в PascalABCCompiler.TreeConverter.returner.visit(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_call _procedure_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
   в PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
   в PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
   в PascalABCCompiler.Compiler.Compile() System.ArgumentNullException: Значение не может быть неопределенным.
Имя параметра: source
   в System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable`1 source)
   в PascalABCCompiler.SystemLibrary.UnitDefinitionItem.Equal(List`1 sil)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_method_call(method_call _method_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(method_call _method_call)
   в PascalABCCompiler.TreeConverter.returner.visit(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(expression expr)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_call _procedure_call)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(statement_list _statement_list)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.convert_strong(statement st)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit_program_code(statement_list program_code)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(procedure_definition _procedure_definition)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(declarations _subprogram_definitions)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(block _block)
   в PascalABCCompiler.TreeConverter.syntax_tree_visitor.visit(program_module _program_module)
   в PascalABCCompiler.TreeConverter.SyntaxTreeToSemanticTreeConverter.CompileInterface(compilation_unit SyntaxUnit, unit_node_list UsedUnits, List`1 ErrorsList, List`1 WarningsList, SyntaxError parser_error, Hashtable bad_nodes, using_namespace_list namespaces, Dictionary`2 docs, Boolean debug, Boolean debugging)
   в PascalABCCompiler.Compiler.CompileUnit(unit_node_list Units, unit_or_namespace SyntaxUsesUnit)
   в PascalABCCompiler.Compiler.Compile()'

Кстати, еще заметил, что текст исключения всегда повторяется дважды!

  1. Более того, у меня PABCRtl-тесты пока не проходят (и локально, и удаленно) даже с официальной dll-кой из дистрибутива, но уже на совсем другом файле и с более “приличной” ошибкой (не внутренней ошибкой компилятора) при вызове только CompileAllRunTests(true). Все остальные тесты при этом идут без проблем!
Ошибки 'TestRunner.exe 5' -- с офиц. сборкой PABCRtl.dll в GAC
***ERROR: Compilation of D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\extensionmethods26.pas failed
Операция '+' не применима к типам array of char и string

***ERROR: Compilation of d:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\overloads7.pas failed
Операция '*' не применима к типам integer и procedure

***ERROR: Compilation of d:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\SliceArrGeneric.pas failed
Неизвестное имя 'SystemSlice'
  1. Еще одна проблема проявляется после загрузки репозитория с ГитХаба напрямую через zip-архив (либо при неточной настройке git-клиента под Windows). Все файлы в папке TestSuite\formatter_tests в этом случае будут иметь Unix-формат (LF-окончания строк), а в TestSuite\formatter_tests\output после TestRunner’а – уже CR/LF. Алгоритм их проверки c TestSuite\formatter_tests\should в CodeCompletion\Testing.cs это не учитывает и считает такие файлы не совпадающими, генерируя не предупреждение, а сразу ошибку тестов.
Ошибки тестов форматирования при LF-формате входных файлов
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\arrays2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\arrays4.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\assigntuple1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\attributes1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\autoproperty1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\autoproperty2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\bigint.pas, line 4
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case6.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case7.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\case8.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\cast1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\class3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\delegates1.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\delegates5.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Demo1.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\diapasons2.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\enum2.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\extendedindexedproperty3.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\File48.pas, line 4
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\flagsattr1.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\for1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\For2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\foreach4.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\foreachvar1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\foreachvar2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\ForFor1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\formatstring1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\formatstring2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\generics1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\generics2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\If5.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if6.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if7.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\if8.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\ifexpr1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\ifexpr2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\incdec2.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\lambdas_closures_13.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\LibForHaskell.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\lock1.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\MathForKumir.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\pattern1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1049.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1114.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1115.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1124.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1125.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1200.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1339.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program1352.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program920.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program972.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Program997.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property4.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property5.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\property6.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\PT4.pas, line 27
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\PT4DemoTest.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\RBDMUtilsDemo.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\records3u.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\repeat1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\set1.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\set2.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\set5u.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\slice.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\slice2.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\String9.pas, line 4
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try4.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try5.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try6.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try7.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try8.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Try9.pas
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typedconst2.pas, line 3
Invalid formatting of File D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typedconst2u.pas, line 3
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typeof.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\typeof2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\uses1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\uses2.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\uses3.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\vartupledef.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\Where.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\while1.pas
Invalid formatting of File (text not equal) D:\TEMP\GitHub-projects\pascalabcnet-WIP\TestSuite\formatter_tests\output\while4.pas

Зато благодаря этому удалось поймать один скрытый баг форматирования: если открыть в IDE, напр., файл TestSuite\formatter_tests\input\arrays4.pas в его LF-варианте и запустить форматирование более 1 раза, то добавится лишняя (2-ая) пустая строка после uses arrays4u;. При этом, даже если удалить эту лишнюю пустую строчку в редакторе, после переформатирования она появится снова! Странным образом этот баг не проявляется, если файл изначально был в CR/LF-формате (или сохранен в редакторе и переоткрыт, что автоматически конвертирует его окончания строк).

В тестах форматирования TestRunner этот баг (или связанный с ним) проявляется немного иначе: при обработке input-файлов в LF-варианте результаты сохраняются в \output уже в CR/LF-формате, но при этом в некоторых файлах (сейчас их 20 шт. – см. в логе выше файлы с ошибками в строках №3 или №4) одна из строк после форматирования остается с LF-окончанием, т.е. получается вообще мешанина из окончаний!

1 лайк

А по моему вы таки не попытались понять что я написал…

procedure Test(from, &to: integer);
begin
  var s := '012';
  s.Substring(from-1,&to-from).Length.Println;
  s[from:&to].Length.Println;
end;

begin
  Test(1,4);
  Test(2,4);
  Test(3,4);
  Test(4,4);
end.

.SubString как раз работает ожидаемо, поэтому я и привёл его как пример:
Если начинать после последнего символа но брать 0 символов - ошибки нет. Если начинать на символ дальше и брать всё равно 0 символов - ошибку уже выдаёт.

Это правильная обработка пограничного значения, принятая в современных языках, вам уже показали выше.

1 лайк

А как вы собираете сборку и прогоняете тесты? Вызывая _RebuildReleaseAndRunTests.bat?

В dll попадают не все функции. Такое ощущение, что вы компилируете RebuildStandartModules.pas без флага /rebuild. Но во всех bat-файлах он присутствует

Нет, вы собираете без флага Rebuild

Обновитесь и проверьте, работает ли сейчас

Чтобы из модулей в сборку попадал весь функционал, а не только используемый, нужно запускать консольный компилятор с аргументами: <полное имя .pas-файла> /rebuild

Есть разные языки. Вы показали в двух языках, в которых не так как у нас.

У нас логика простая. Есть срезы и есть безопасные срезы.

В срезах первый индекс ведет себя так как если мы обращались бы по индексу. В s=‘123’ s[4] - это выход за диапазон. s[4:], s[4:4] - это всё выход за диапазон по первому индексу. Неверно указывать первый индекс, выходящий за пределы диапазона. Если указал - исключение.

Если нужно другое поведение, используются безопасные срезы: s?[4:] s?[4:4]

Надо сказать, что у нас по поводу срезов целый семинар был. Именно там были обсуждены эти варианты, в том числе и ожидаемое поведение.

Так что указывать, что что-то по-вашему там не так - странно

Было бы проще выравнять ментальные модели для соседних языков. А так выходит как с Windows/Linux: кнопка закрытия окна, кнопки Ok/Cancel лево/право специально перепутано, чтобы затруднить переход пользователей между платформами.

Интересно было бы посмотреть запись семинара.

1 лайк

При любой попытке запустить удаленно на гитхабе pabcnetc <anything>.pas /rebuild возникает исключение:

Unhandled Exception: System.IO.IOException: The handle is invalid.
     at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
     at System.Console.GetBufferInfo(Boolean throwOnNoConsole, Boolean& succeeded)
     at PascalABCCompiler.ConsoleCompiler.Main(String[] initialArgs)

@admin pabcnetcclear.exe при этом работает удаленно без проблем – может быть проблема в перехвате на виртуалке гитхаба ввода/вывода консоли для создания реал-тайм лога?

Локально у меня таких ошибок не возникает, но никакой разницы с pabcnetcclear.exe (который не имеет опции /rebuild) я не вижу – PABCRtl.dll все равно получается битый:

pabcrtl.dll (396.5 КБ)

Лог
>"C:\Program Files (x86)\pascalabc.net\pabcnetc" PABCRtl.pas /rebuild
Loading core...
Подключен парсер PascalABC.NET Language Parser v1.2
Подключен парсер Documentation Comments Tag Parser v0.9
PascalABCCompiler.Core v3.7.1.2677
Copyright (c) 2005-2020 by Ivan Bondarev, Stanislav Mikhalkovich
OK 439,252ms
Connected parsers: PascalABC.NET (*.pas);
Connected conversions: Optimizer;
Compiling assembly PABCRtl.pas...
[1]CompilationStarting PABCRtl.pas...
[1]BeginCompileFile PABCRtl.pas...
[0]BeginParsingFile PABCRtl.pas...
[28]EndParsingFile PABCRtl.pas...
[0]SyntaxTreeConversion Standard...
[2]BeginCompileFile __RtlUtils.pas...
[0]BeginParsingFile __RtlUtils.pas...
[1]EndParsingFile __RtlUtils.pas...
[0]SyntaxTreeConversion Standard...
[935]ReadPCUFile PABCSystem.pcu...
[89]ReadDLL System.dll...
[0]ReadDLL mscorlib.dll...
[1]ReadDLL System.Core.dll...
[0]ReadDLL System.Numerics.dll...
[8]ReadPCUFile PABCExtensions.pcu...
[11]CompileInterface __RtlUtils.pas...
[18]CompileImplementation __RtlUtils.pas...
[1]EndCompileFile __RtlUtils.pas...
[6]ReadPCUFile __RunMode.pcu...
[217]ReadPCUFile __RedirectIOMode.pcu...
[2]ReadDLL System.Windows.Forms.dll...
[394]ReadPCUFile GraphWPFBase.pcu...
[2]ReadDLL PresentationFramework.dll...
[2]ReadDLL WindowsBase.dll...
[0]ReadDLL PresentationCore.dll...
[1]ReadPCUFile GraphWPF.pcu...
[96]ReadPCUFile Graph3D.pcu...
[2]ReadDLL System.Xml.dll...
[97]ReadDLL HelixToolkit.Wpf.dll...
[18]ReadPCUFile WPFObjects.pcu...
[3]ReadPCUFile ClientServer.pcu...
[8]ReadPCUFile Arrays.pcu...
[7]ReadPCUFile Collections.pcu...
[92]ReadPCUFile FormsABC.pcu...
[2]ReadDLL System.Drawing.dll...
[2]ReadPCUFile RBDMUtils.pcu...
[7]ReadPCUFile PT4TaskMakerNET.pcu...
[8]ReadPCUFile Timers.pcu...
[3]ReadPCUFile VCL.pcu...
[2]ReadPCUFile Utils.pcu...
[2]ReadPCUFile Sockets.pcu...
[47]ReadPCUFile GraphABCHelper.pcu...
[2]ReadPCUFile GraphABC.pcu...
[9]ReadPCUFile IniFile.pcu...
[0]ReadPCUFile RobotField.pcu...
[1]ReadPCUFile RobotTaskMaker.pcu...
[0]ReadPCUFile RobotZadan.pcu...
[6]ReadPCUFile Robot.pcu...
[3]ReadPCUFile PointRect.pcu...
[8]ReadPCUFile PointerTools.pcu...
[7]ReadPCUFile FilesOperations.pcu...
[2]ReadPCUFile Events.pcu...
[14]ReadPCUFile DMCollect.pcu...
[1]ReadPCUFile DrawManField.pcu...
[15]ReadPCUFile DMTaskMaker.pcu...
[1]ReadPCUFile DMZadan.pcu...
[2]ReadPCUFile Drawman.pcu...
[8]ReadPCUFile CRT.pcu...
[15]ReadPCUFile ABCObjects.pcu...
[0]ReadPCUFile ABCSprites.pcu...
[7]ReadPCUFile ABCHouse.pcu...
[9]ReadPCUFile ABCButtons.pcu...
[1]CompileInterface PABCRtl.pas...
[1]CompileImplementation PABCRtl.pas...
[0]EndCompileFile PABCRtl.pas...
[645]SavePCUFile __RtlUtils.pcu...
[4]SemanticTreeConversion Optimizer...
[2]CodeGeneration PABCRtl.dll...
[513]CompilationFinished PABCRtl.pas...
Ready.
OK 3394,0757ms (48lines)

У вас PABCRtl собирается нормально? А на гитхабе или каком другом CI/CD сервисе пробовали?

нет, в сокращённом виде

Но, если честно, я не особо понял как это всё работает, если запускать батник, то всё нормально.

image

Если запускать через командную строку с теми же аргументами, то выходит сокращённо. Возможно, я где-то ошибся.