Мой хард-форк 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.pas
TODO: теперь, когда графический интерфейс удален, отладка анализируемого 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):
Примечание. Если вас также интересуют другие мои задачи, показанные в демо-версии, ознакомьтесь с моей сутью здесь.
Надеюсь, это будет полезно другим ребятам из Паскаля. Веселиться! ?