Meu hard fork do JEDI Code Formatter CLI do Bee Jay, que em si é um fork do Lazarus JCF, que melhorei um pouco com melhor indentação e suporte muito necessário para declarações de variáveis Delphi modernas. Foi realmente difícil contornar seu código antigo, complexo e quase completamente indocumentado. Mesmo assim, consegui implementar o que queria. Ele dificilmente pode ser estendido ou melhorado, dado o quão complicado o código-fonte de entrada pode ser e quão difícil é direcionar casos extremos individuais no AST sem quebrar algo em algum outro lugar. No futuro, seria melhor mudar para um formatador que não exija análise profunda da fonte.
(A extensão VSCode atualizada que funciona com esta versão também está disponível, pull request.)
As alterações incluem:
Suporte para declarações de variáveis inline do Delphi:
var I: Integer := 10 ;
Com inferência de tipo:
var I := 42 ;
Dentro for
declaração:
for var I := Low (myArray) to High (myArray) do
Arquivos de origem com variáveis embutidas não causam mais falhas no formatador.
Nova opção IndentCaseLabels
para controlar o recuo de instruções de rótulo case
independentemente de todo o bloco case
. Por exemplo, com IndentCaseLabels
definido como True
(padrão):
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Com IndentCaseLabels
definido como False
:
case i of
1 .. 9 :
for i := 1 to i do write(i, ' , ' );
10 : begin
writeln;
writeln;
end ;
else
myProcedure;
end ;
Nova opção IndentMethodParams
, então é possível escrever parâmetros de método como este ( IndentMethodParams
definido como False
):
function myFunction (aParam: string
; aParam2: real): boolean;
E evite que a segunda linha seja recuada. Caso contrário (definido como True
):
function myFunction (aParam: string
; aParam2: real): boolean;
Nova opção IndentInterfaceGuid
para evitar que o GUID da interface seja recuado. Definir como True
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
Definir como False
:
IFace = interface
[ ' {5E3C2BCA-56C8-46DE-959F-338AF5F69C1A} ' ]
procedure proc ;
end ;
O formatador agora processa corretamente os finais de linha dentro dos comentários e também evita a formatação de instruções de controle com comentários entre eles.
O código-fonte do formatador foi processado através do próprio formatador para validar a função correta “in the wild”.
A menos que eu tenha esquecido alguma coisa, todas as minhas alterações são “marcadas” com // fix:
comments.
Binários estão disponíveis. A versão do Windows de 64 bits é da FPC. A versão do Windows de 32 bits é construída com Delphi. Outros sistemas operacionais devem ser construídos com pouca ou nenhuma alteração.
Como testar:
pascal-format -config=pascal-format.new.cfg -out test.fmt.pas test.pas
TODO: com a GUI agora removida, a depuração do AST analisado é impossível, a menos que seja feito por tentativa e erro. A visão AST precisa ser reescrita para saída em formato textual, ou, melhor ainda, simplesmente refeita em LCL (mas sem suporte Delphi). Deve ser bastante simples de fazer, pois é basicamente apenas uma visualização em árvore em um formulário vazio.
Então aqui está, caso alguém queira perder tempo e continuar tentando tornar isso mais inteligente.
Segue a descrição original.
Eu (Bee Jay) peguei o Jedi Code Formatter (JCF) do repositório Lazarus IDE e o criei como uma versão CLI (interface de linha de comando) removendo todas as partes da GUI (interface gráfica do usuário) da versão GUI original. A versão CLI pode ser usada como formatador de código Pascal no Visual Studio Code ou como mecanismo de back-end de um embelezador de código Pascal online.
Original: uma cópia (às vezes modificada) da árvore svn r823 jcf2: https://jedicodeformat.svn.sourceforge.net/svnroot/jedicodeformat/trunk/CodeFormat/Jcf2
Autor original: Anthony Steele.
Licença original: MPL 1.1.
jcf-pascal-format
em sua própria pasta.pascal_format.lpi
na pasta jcf-pascal-format/App
.pascal-format
da pasta jcf-pascal-format
junto com o arquivo de configuração pascal-format.cfg
../pascal-format -?
comando. Deve mostrar o manual de uso. jcf-pascal-format
em sua própria pasta.pascal_format.lpi
na pasta jcf-pascal-format/App
.test.pas
da pasta jcf-pascal-format
.JCF
usando Tasks → Run Task... → pascal-format: Test CLI Program menu e você deverá ver o resultado no arquivo test.pas
. pascal-format
e pascal-format.cfg
para a pasta do espaço de trabalho Pascal.tasks.json
se você já tiver um.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 para -obfuscate
.tasks.json
. Agora você deve ter novas tarefas no formato Pascal em sua lista de tarefas. Embora JCF seja um bom formatador de código Pascal, ele tem um único problema bastante irritante. JCF exige que o código seja compilável, o que significa que deve ser um programa completo e sintaticamente correto. O JCF falhará em trechos de código ou código errado. Para que funcione no trecho de código, ele deve ser colocado entre um par begin..end
e ter um cabeçalho program
correto, como este:
program test;
begin
// put code snippet here
end .
Aqui está o JCF CLI em ação no VS Code (com OmniPascal):
Nota: Se você também estiver interessado em minhas outras tarefas mostradas na demonstração, veja minha essência aqui.
Espero que seja útil para outros colegas Pascal por aí. Divirta-se! ?