Мой хард-форк JEDI Code Formatter CLI от Bee Jay, который сам по себе является форком Lazarus JCF, который я немного улучшил, добавив улучшенные отступы и столь необходимую поддержку современных объявлений переменных Delphi. В нем было действительно сложно ориентироваться в его древнем, сложном и почти полностью недокументированном коде. И все же мне удалось реализовать то, что я хотел. Его вряд ли можно расширить или улучшить дальше, учитывая, насколько сложным может быть входной исходный код и насколько сложно нацеливаться на отдельные крайние случаи в AST, не нарушая при этом что-то еще. В будущем лучше перейти на форматтер, не требующий глубокого разбора исходника.
(Также доступно обновленное расширение VSCode, работающее с этой версией, запрос на извлечение.)
Изменения включают в себя:
Поддержка объявлений встроенных переменных Delphi:
var I: Integer := 10 ;С выводом типа:
var I := 42 ; Внутри for заявления:
for var I := Low (myArray) to High (myArray) doИсходные файлы со встроенными переменными больше не приводят к сбою форматтера.
Новая опция IndentCaseLabels для управления отступами операторов case регистра независимо от всего блока case . Например, если для IndentCaseLabels установлено значение True (по умолчанию):
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ; Если для IndentCaseLabels установлено значение False :
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ; Новая опция IndentMethodParams , позволяющая записывать параметры метода следующим образом ( IndentMethodParams установлено в False ):
function myFunction (aParam: string
; aParam2: real): boolean; И избегайте отступов во второй строке. В противном случае (установите значение True ):
function myFunction (aParam: string
; aParam2: real): boolean; Новая опция IndentInterfaceGuid для предотвращения смещения GUID интерфейса. Установите True :
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ; Установите значение False :
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;Formatter теперь правильно обрабатывает окончания строк внутри комментариев, а также избегает форматирования управляющих операторов с комментариями между ними.
Исходный код форматтера был обработан самим форматтером для проверки правильности работы «в дикой природе».
Если я ничего не забыл, все мои изменения «помечены» // fix: комментариями.
Доступны двоичные файлы. 64-битная сборка Windows от FPC. 32-битная версия Windows создана с помощью Delphi. Другие операционные системы должны создаваться практически без изменений.
Как протестировать:
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pasTODO: теперь, когда графический интерфейс удален, отладка анализируемого AST невозможна, если только не делать это методом проб и ошибок. Представление AST необходимо переписать для вывода в текстовом виде, а еще лучше просто переделать в LCL (но без поддержки Delphi). Это должно быть довольно просто сделать, поскольку по сути это просто древовидное представление пустой формы.
Итак, вот на тот случай, если кто-то захочет потратить свое время и продолжить попытки сделать эту вещь умнее.
Исходное описание следует ниже.
Я (Би Джей) взял Jedi Code Formatter (JCF) из репозитория Lazarus IDE и сделал его версией CLI (интерфейс командной строки), удалив все части GUI (графического пользовательского интерфейса) из исходной версии GUI. Версия CLI может использоваться в качестве средства форматирования кода Pascal в Visual Studio Code или в качестве внутреннего механизма онлайн-улучшителя кода Pascal.
Оригинал: копия (иногда измененная) дерева svn r823 jcf2: https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2.
Автор оригинала: Энтони Стил.
Исходная лицензия: MPL 1.1.
jcf-pascal-format в свою папку.pascal_format.lpi в папке jcf-pascal-format/App .pascal-format из папки jcf-pascal-format вместе с файлом конфигурации pascal-format.cfg ../pascal-format -? команда. Должно быть указано руководство по использованию. jcf-pascal-format в свою папку.pascal_format.lpi в папке jcf-pascal-format/App .test.pas из папки jcf-pascal-format .JCF , используя меню «Задачи» → «Выполнить задачу…» → «pascal-format: Test CLI Program» , и вы должны увидеть результат в файле test.pas . pascal-format и pascal-format.cfg в папку рабочей области Pascal.tasks.json если он у вас уже есть.tasks.json . {
"label" : " JCF: Beautify Code " ,
"type" : " shell " ,
"command" : " ./pascal-format " ,
"args" : [
" ${file} " ,
" -clarify " ,
" -inplace " ,
" -config=pascal-format.xml "
],
"presentation" : {
"reveal" : " never "
},
"problemMatcher" : []
},-clarify arg на -obfuscate .tasks.json . Теперь в вашем списке задач должны появиться новые задачи в формате Pascal. Хотя JCF является хорошим форматировщиком кода Pascal, у него есть одна проблема, которая весьма раздражает. JCF требует, чтобы код был компилируемым, что означает, что он должен быть полной программой и синтаксически корректным. JCF не сработает из-за фрагментов кода или неправильного кода. Чтобы он работал с фрагментом кода, его необходимо поместить между парой begin..end и иметь правильный заголовок program , например:
program test;
begin
// put code snippet here
end .Вот JCF CLI в действии в VS Code (с OmniPascal):

Примечание. Если вас также интересуют другие мои задачи, показанные в демо-версии, ознакомьтесь с моей сутью здесь.
Надеюсь, это будет полезно другим ребятам из Паскаля. Веселиться! ?