totvs / advpl-vscode

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

Símbolos AdvPL no VSCode (Outline) #309

Open AlencarGabriel opened 5 years ago

AlencarGabriel commented 5 years ago

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?


image

killerall commented 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.

AlencarGabriel commented 5 years ago

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.

killerall commented 5 years ago

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.

AlencarGabriel commented 5 years ago

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.

killerall commented 5 years ago

Na extensão normal do advpl, se vc for para a branch ts-language-server se eu não estou enganado, deve estar funcionando.

killerall commented 5 years ago

Em Typescript o protocolo já esta implementado.

AlencarGabriel commented 5 years ago

Entendi, estava usando a master. Vou mudar de Branch e fazer alguns testes.

AlencarGabriel commented 5 years ago

@killerall , o projeto do LS deve estar dentro da pasta advpl-vscode\language-server?

killerall commented 5 years ago

sim

AlencarGabriel commented 5 years ago

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?

killerall commented 5 years ago

Da uma olha em: https://github.com/Microsoft/TypeScript/wiki/Debugging-Language-Service-in-VS-Code

AlencarGabriel commented 5 years ago

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?

killerall commented 5 years ago

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.

AlencarGabriel commented 5 years ago

Ó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.

killerall commented 5 years ago

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á.

AlencarGabriel commented 5 years ago

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.

LeonardoRios commented 5 years ago

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?

AlencarGabriel commented 5 years ago

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.

AlencarGabriel commented 5 years ago

@LeonardoRios , segue o link do Branch da minha extensão com essa funcionalidade implementada.

https://github.com/AlencarGabriel/advpl-switch-project/tree/Test-Symbol