totvs / advpl-vscode

Suporte para Advpl no VsCode
MIT License
161 stars 63 forks source link

Ter a opção de Auto Indent / Code Format / para o fonte advpl #29

Closed alvarocamillont closed 4 years ago

alvarocamillont commented 8 years ago

Nos arquivos html, utilizando o comando Shift+Alt+F o vs code ajusta a identação. O ideal seria permitir que seja selecionada a area para o autoident, comportamento que existia no antigo IDE e hj no TDS ele identa o fonte inteiro.

vlopes11 commented 6 years ago

Criei um branch no meu fork para essa funcionalidade: https://github.com/vlopes11/advpl-vscode/commit/80635fe9ebfac786e0b31b04628c760c725d56c1

Pretendo utilizar o vscode-textmate ( https://github.com/Microsoft/vscode-textmate ) para estender a especificação da linguagem para o syntax highlight e com ela determinar as formatações e indentações.

Pull requests são bem-vindos :)

@killerall caso prefira, posso dar PR nesse repo para trabalhar nessa funcionalidade daqui. De qualquer forma, quando finalizada, irei criar o PR.

izacsc commented 6 years ago

@vlopes11 Eu contribuí bastante no arquivo de gramática (advpl.tmLanguage.tmLanguage). Se precisar implementar alguma coisa me avisa que eu posso ajudar.

vlopes11 commented 6 years ago

Perfeito, a idéia geral que tenho é através das key definitions parsear linha a linha com uma regex pra cada chave identificada.

Preciso analisar o textmate para verificar se ele permite isso, mas acho que permite!

Ex:

if (grammar.getTokens(document.lineAt[x]).identifier === "declaracao-funcao")
{
    applyRegex(${"declaracao-funcao"}, document.lineAt[x])
}

Alguma coisa nesse sentido...

vlopes11 commented 6 years ago

@izacsc implementei o esqueleto com vscode-textmate e funcionou.

Tenho uma observação referente a sintaxe loop. Nessa linha do commit: https://github.com/vlopes11/advpl-vscode/commit/3dbe60e50533dccf42f53bcdf6c09be235606435#diff-97fbb9c5aad6dd459354e49685399a63R83

Temos o while no mesmo grupo do enddo. Dessa forma não é possível controlar a indentação de forma natural. Teríaos aí dois caminhos, sendo um deles tratar os grupos while/for/etc e enddo/next/etc no advplFormatter, ou alterar a sintaxe no tmLanguage.

vlopes11 commented 6 years ago

Para adicionar o vscode-textmate, dependemos do node-oniguruma (biblioteca regexp). O onigura, por sua vez, tem que ser rebuildado a todo node install. Para o rebuild, utiliza-se o electron-rebuild, que depende do node-gyp ( nativo do nodejs - https://github.com/nodejs/node-gyp/ ).

O gyp tem uma polêmica em relação ao windows que dá pra acompanhar aqui: https://github.com/nodejs/node-gyp/issues/629#issuecomment-151018292

Resumindo, ele depende do python e compilador c++. Haverá, portanto, o requerimento de instalar o pacote windows-build-tools global para fazer o build da extensão AdvPL em ambientes windows. O processo é fácil, mas é um novo requirement:

Install all the required tools and configurations using Microsoft's windows-build-tools using npm install --global --production windows-build-tools from an elevated PowerShell or CMD.exe (run as Administrator).

Se não executar esse processo, no build, dará o erro Can't find Python executable "python", you can set the PYTHON env variable

Eu normalmente não me preocupo muito com requirements do windows e suas bizarrices quando falamos de nodejs (no linux, onde iniciei o desenvolvimento, é só dar npm install que tudo se resolve magicamente :D), mas nesse caso o advpl-code tem a maior base de usuários no windows. O impacto disso é somente no build, ou seja, para desenvolvedores da extensão.

@killerall , de acordo em adicionarmos esse requerimento? (windows-build-tools global para compilar em windows)

afucher commented 6 years ago

@vlopes11 eu acredito que o VSCODE executa o npm install quando você instala a extensão, ou seja, deixar para que o usuário final tenha essa dependência acho ruim, principalmente se é apenas uma feature da extensão que depende dela. Neste caso, penso que uma segunda extensão poderia ser uma boa opção.

Estamos pensando em fazer um parser que gere as informações de sintaxe e tals, e com isso será possível fazer isso. Mas isso será num segundo momento.

vlopes11 commented 6 years ago

@afucher ele executa, mas com a tag --production. Nesse caso se passar o vscode-textmate e eslint para devDependencies talvez funcione pois a production só instala as dependencies.

Mais tarde vou fazer o teste e posto aqui o resultado. Mas acho que o vscode-textmate tenha que ser para production, o que sim, seria um problema. Aí seria uma boa seguir esse caminho de criar uma extensão a parte, ou usar o jsBeautify (sei lá) para resolver isso ao invés do textmate com o revés de ter que reescrever a gramática em outro padrão.

edit: Não somos somente nós com a dúvida: https://github.com/Microsoft/vscode-textmate/issues/58

killerall commented 6 years ago

Eu não sei se é melhor investir no Language Server final de uma vez. Por que digo isso? Não estudei o textmate a fundo, mais talvez tenham problema para validar algumas construções que são permitidas em ADVPL apesar de eu não concordar com elas. O LS já terá que ter o parser completo de ADVPL para prover o autocomplete, references, etcs... Ele disponibilizar o Auto Ident seria apenas mais um serviço.

O LS será escrito em C++ (apesar de eu ter iniciado ja uma versão C#, mais para ser multi plataforma vamos de C++). Porem no momento estou focado em reescrever o Bridge em C++ para dar suporte ao linux.

Mais vamos ver essa questão de ter ou não que fazer o build na instalacao da extensão. []s

killerall commented 6 years ago

Eu já tenho o esqueleto meio pronto do LS, posso no fim de semana terminar de montar o esqueleto e publicar aqui.

vlopes11 commented 6 years ago

Ah, bacana! Vou deixar esse branch do formatter pausado então.

Bom, não custa perguntar, mas alguma chance do Bridge ficar opensource também? :D

izacsc commented 6 years ago

@vlopes11 bom, teria que alterar todas regex que capturam os comandos de controle de fluxo. Mas acredito que vamos seguir por outro caminho rs Quando ficar definido aí tomamos alguma decisão. Abraço

vlopes11 commented 6 years ago

Fiz os testes, e o vscode-textmate vai sempre depender do rebuild pois o oniguruma depende de build, e não dá para utilizá-lo como devDepencency pois ele carrega dinamicamente os arquivos de gramática, tem que ser dependency. Então já dá pra descartar essa possibilidade, vou aguardar a criação do language server para contribuir lá com esse formatter.

De qualquer forma, criei um PR com alguams melhorias que havia feito para o advplFormatter, como centralizar a tratativa dos path e renomear alguns arquivos que não compilam no linux (que é case sensitive). O PR é o seguinte: https://github.com/killerall/advpl-vscode/pull/162

killerall commented 6 years ago

@izacsc @vlopes11 @afucher Subi o projeto basico do LS. https://github.com/advpl/advpl-language-server-cxx

Ele basicamente não faz nada, ele consegue receber a requisição de inicializacao e responder.

Eu fiz ele com base no LS do Clang, https://github.com/llvm-mirror/clang-tools-extra/tree/master/clangd Esta utilizando o CMAke, portanto deveria rodar em win/linux/mac, porem ainda não testei.

Acredito que o que precisa ser implementado primeiros é os Callbacks do LS. https://github.com/Microsoft/language-server-protocol

Eu estou portando o parser que ja tenho de ADVPL em java, para esse repostorio em C++.

vlopes11 commented 6 years ago

Bacana! Notei que tem um arquivo de gramática ANTLR. Para resolver a formatação eu tinha começado um projeto de parser/lexer AdvPL-Lexis. Meu objetivo final era conseguir fazer um linter.

Esse arquivo AdvplExpr.g4 como base E esse arquivo AdvplCommonLexerRules.g4 como definições

Mas verifiquei que já existe um arquivo ANTLR no projeto que você criou. Ele é o g4 oficial do compilador? O g4 normalmente é muito delicado, eu ia usar TDD para desenvolver o arquivo de gramática (ia tomar um tempão mas ficaria robusto), mas como já está pronto vou aproveitar e montar somente a estrutura de testes.

Legal, vou montar a estrutura do meu desktop pessoal (linux) e vou seguir colaborando por lá :)

killerall commented 6 years ago

A Gramatica que eu fiz não é utilizado no compilador, pois o mesmo não usa o antlr. Mais a gramatica que vou usar de base é mesma que usamos no Desenhador MVC e no Sonarqube, Porem eu estou refatorando algumas coisas antes.

izacsc commented 6 years ago

Acredito que essa não seja a versão completa da gramática @vlopes11. No repositório de implementação da LS em C# tem esse arquivo de gramática que me parece mais completo. Mas como o @killerall comentou, ele está refatorando a gramática, então talvez seja prudente aguardar.

izacsc commented 6 years ago

Relacionado ao assunto, eu comecei um projetinho para incluir snippets de todas as funções da tec que temos no TDN. Fiz um fonte pra extrair as funções aqui e estava num processo manual de colocar os parâmetros e a descrição do tdn nos snippets junto com um colega (@jmarcios). Acham legal continuar esse trabalho ou melhor guardar as energias para o LS?

killerall commented 6 years ago

@izacsc Dentro do projeto hoje tem um sqlite com muitas funções basicas: https://github.com/killerall/advpl-vscode/tree/master/bin/db Eu tenho um fonte advpl, que tem essa documentação, e gera esse db. O ideal seria adicioonar neste fonte as documentações, para gerar o db. Posso criar um repositorio para isso, se você tiver interesse e contribuir. Sobre a versão em C#, sim la tem uma versao antiga da gramatica, porem esta bem defasada.

izacsc commented 6 years ago

@killerall me interessa sim colaborar nessa parte. Assim que criar o repositório me avisa, por favor.

fernando-facile commented 6 years ago

Boa tarde comunidade! Parabéns pelos trabalhos até o momento.

Alguma previsão para sair uma ferramenta de formatar/identar os fontes ADVPL ?

É uma das poucas coisas que falta para mim.

Obrigado!

killerall commented 6 years ago

@fernando-facile O LS que fará essa parte, esta no repositorio: https://github.com/advpl/advpl-language-server-cxx

Eu não estou conseguindo mexer nesse projeto, pois estou finalizando o port para linux e mac do vscode, assim que liberar esse port, os esforços voltam para o LS.

joaov1tor commented 6 years ago

Opa @killerall bom dia, parabéns pelo projeto e o que mais falo agora é VS Code é vida! rsrsrs. Quando estiver Ok para Mac quero usar também. Abraço.

killerall commented 6 years ago

@joaov1tor A versão MAC e linux já esta funcional.

joaov1tor commented 6 years ago

Como utilizo ?

killerall commented 6 years ago

https://github.com/killerall/advpl-vscode/wiki/Instala%C3%A7%C3%A3o-em-Linux-Mac-OS

joaov1tor commented 6 years ago

@killerall desculpe a minha ignorância, mas não encontrei o atalho para identação, o padrão do vs Code não faz nada, é pela falta do complemento que você passou acima?

killerall commented 6 years ago

A identaçao ainda não esta feita, achei que queria usar a extensao mesmo.

robsonrosilva commented 4 years ago

@killerall Como conversamos na quinta-feira se quiser posso fazer um pull request com a identação que coloquei na minha extensão, na minha opinião está bem simples de extrair de lá pra implementar na sua. Se quiser pode dar uma olhada lá: https://github.com/robsonrosilva/advpl-sintaxe

killerall commented 4 years ago

Opa vou dar uma olhada sim. @AlencarGabriel Se conseguir da uma olhada tambem na parte de identação.

AlencarGabriel commented 4 years ago

Opa vou dar uma olhada sim. @AlencarGabriel Se conseguir da uma olhada tambem na parte de identação.

@killerall , sem problemas. Inclusive ontem quando vi esse comentário do @robsonrosilva já dei uma olhada na implementação na extensão dele, e encontrei alguns pontos que seriam interessante avaliar.

@robsonrosilva , quando poderá disponibilizar o Pull?

robsonrosilva commented 4 years ago

@AlencarGabriel e @killerall acredito que até o fim dessa semana consigo fazer esse pull.

Gabriel se quiser pode me passar esses pontos que viu se eu conseguir mudar já faço nesse pull.

robsonrosilva commented 4 years ago

Depois dá uma olhada consegui fazer um merge simples aqui do que tinha implementado.

AlencarGabriel commented 4 years ago

Depois dá uma olhada consegui fazer um merge simples aqui do que tinha implementado.

Fiz um review no seu Pull, não está compilando.

robsonrosilva commented 4 years ago

@AlencarGabriel criei uma novo pull request #420