Closed alvarocamillont closed 4 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.
@vlopes11 Eu contribuí bastante no arquivo de gramática (advpl.tmLanguage.tmLanguage). Se precisar implementar alguma coisa me avisa que eu posso ajudar.
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...
@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.
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)
@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.
@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
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
Eu já tenho o esqueleto meio pronto do LS, posso no fim de semana terminar de montar o esqueleto e publicar aqui.
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
@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
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
@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++.
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á :)
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.
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.
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?
@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.
@killerall me interessa sim colaborar nessa parte. Assim que criar o repositório me avisa, por favor.
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!
@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.
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.
@joaov1tor A versão MAC e linux já esta funcional.
Como utilizo ?
@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?
A identaçao ainda não esta feita, achei que queria usar a extensao mesmo.
@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
Opa vou dar uma olhada sim. @AlencarGabriel Se conseguir da uma olhada tambem na parte de identação.
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?
@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.
Depois dá uma olhada consegui fazer um merge simples aqui do que tinha implementado.
Depois dá uma olhada consegui fazer um merge simples aqui do que tinha implementado.
Fiz um review no seu Pull, não está compilando.
@AlencarGabriel criei uma novo pull request #420
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.