Open AlencarGabriel opened 5 years ago
Ola, Acredito que fosse melhor fazer isso diretamente no LS. Você não quer contribuir com o mesmo? https://github.com/totvs/advpl-language-server
Eu devo sair de ferias no fim de janeiro, e terei um pouco mais de tempo para deixar o LS pelo menos funcional. Mais toda ajuda é bem vinda.
Seria um prazer contribuir no projeto, inclusive estava olhando o seu repositório do LS implementado em C#, não tinha visto este repositório em TypeScript.
Vou fazer um Fork do projeto e vamos fazer isso sair do forno então.
Eu iniciei em C# porem, não ficava multi plataforma. TypeScript é mais facil para o pessoal contribuir.
O parser e tabela de simbulo desse cara já está quase pronto. Inclusive estou apenas "migrando" de uma implementação que fiz em Java do parser e tabela de simbulo.
Eu preciso entender primeiro o protocolo e como faria para testar e implementar os recursos.
Como você faz para Compilar/Depurar o LS?
Para implementar o exemplo acima eu utilizei na extensão as mesmas interfaces de símbolos da API, e fiz um subscription usando o método vscode.languages.registerDocumentSymbolProvider
, ainda tenho que estudar o funcionamento do LS.
Na extensão normal do advpl, se vc for para a branch ts-language-server se eu não estou enganado, deve estar funcionando.
Em Typescript o protocolo já esta implementado.
Entendi, estava usando a master. Vou mudar de Branch e fazer alguns testes.
@killerall , o projeto do LS deve estar dentro da pasta advpl-vscode\language-server?
sim
Beleza, então estava fazendo certo.
Porem quando estou depurando a extensão, o Console do LS retorna as seguintes mensagens:
Debugger listening on ws://127.0.0.1:6009/4e070786-32b3-4548-b80d-1cf50292b1e2
For help see https://nodejs.org/en/docs/inspector
(node:10972) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: Cannot read property 'maxNumberOfProblems' of null
(node:10972) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
(node:10972) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): TypeError: Cannot read property 'maxNumberOfProblems' of
E quando coloco os Breakpoints no server.ts eles aparecem como não acessíveis. Preciso depurar os dois projetos em duas instâncias do VSCode? Ou usando o mesmo processo da extensão é possível depurar a extension e o LS?
Dei uma lida no artigo. Só pra confirmar, basicamente para eu depurar o Server eu devo usar a versão do VSCode para desenvolvedor. Seria isso?
Não precisa usar o inside não. Você precisa sim de dois vscodes abertos. e Attachar o seu debug na extensão.. Basica mente, abre um code . na pasta principal, e outro na pasta language-server. No launch da LS coloca: { "type": "node", "request": "attach", "name": "Attach to Server", "port": 6009, "restart": true, "outFiles": ["${workspaceRoot}/out/*/.js"] },
Agora no primeiro vscode, vc executa como se fosse testar uma extensão normal. Abra um fonte .prw, Volte para o vscode do ls, e manda attachar.
Ai vc fica com 3 vscodes aberto. O da pasta advpl-vscode o do language-server e o "ADVPL" que é onde vc altera o fonte prw, e vai parar no debug do language-server
Para testar basta colocar um ponto de parada no ls, na funçao:
validateTextDocument(textDocument: TextDocument): Promise
e alterar algo no fonte advpl.
Ótimo. Acredito que eu estava fazendo o Attach corretamente. Vou dar uma conferida nas informações e na porta.
A propósito, para compilar o LS eu adicionei no package.json o seguinte script: "compile": "tsc -p ./",
, e no tslint.json tive que alterar o "defaultSeverity"
para "none"
, pois praticamente o fonte todo do server estava reportando hints e erros, muitas coisas eram apenas convenções da linguagem. Penso que isto ocorreu por conta de uma diferença de versão do TypeScript.
Desde já obrigado pela explicação anterior.
Na verdade precisa atualizar o package, do typescript, e do proprio protocolo do LS. Para a ultima versão, pois criei esse projeto faz um tempinho já.
A primeira coisa que faço ao clonar um repo é atualizar os pacotes. Mas mesmo assim vou verificar se estão na última versão.
como fazer o VSCode reconhecer os símbolos da linguagem AdvP
@AlencarGabriel, por acaso você poderia explicar ou disponibilizar esta forma que encontrou pra mostrar no Outline os símbolos da linguagem ADVPL como na imagem de exemplo?
Olá @LeonardoRios ,
criei um Gist com o exemplo que implementei em minha extensão em Type Script.
Só gostaria de ressaltar que isto foi apenas um teste que fiz, ainda falta-se muito a implementar como por exemplo detectar se a linha está em comentário, duplicidades de símbolos, detectar mais símbolos, etc...
Mas parei de fazer a implementação dessa forma pós discussão com o @killerall nesta Issue. Porem este inicio de ano tem sido muito corrido e não consegui dar continuidade no projeto. Mas espero que ajude.
@LeonardoRios , segue o link do Branch da minha extensão com essa funcionalidade implementada.
https://github.com/AlencarGabriel/advpl-switch-project/tree/Test-Symbol
Olá novamente @killerall ,
estava dando uma pesquisada sobre como fazer o VSCode reconhecer os símbolos da linguagem AdvPL e apresentá-los na Outline, para facilitar na navegação no código entre as funções, variáveis, métodos, ...
Pelo que entendi esse tipo de implementação deveria ser feito no Language Server (que a propósito gostaria de saber se ainda tocará este projeto?).
Mas encontrei uma forma de fazer uma simples implementação sem a necessidade do Language Server.
O que acha de dar continuidade nesta implementação enquanto o Language Server pra AdvPL não sai?