Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
35 changes: 24 additions & 11 deletions fontes/analise-codigo/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,11 @@ import { AnalisadorSemanticoTestes } from './analisador-semantico-testes';
import { verificarConfiguracaoLincones } from './verificar-lincones';
import { validarLmht } from './validar-lmht';
import { validarFoles } from './validar-foles';
import type { ContextoProjetoLiquido } from '../liquido/deteccao-projeto-liquido';
import {
contextoLiquidoCorrespondeAExtensao,
detectarProjetoLiquido,
} from '../liquido/deteccao-projeto-liquido';

const mapaSeveridadeDiagnosticos = {
0: vscode.DiagnosticSeverity.Error,
Expand All @@ -46,7 +51,8 @@ const mapaSeveridadeDiagnosticos = {
*/
export async function executarAnalises(
documento: vscode.TextDocument,
diagnosticos: vscode.DiagnosticCollection
diagnosticos: vscode.DiagnosticCollection,
detectorProjetoLiquido: typeof detectarProjetoLiquido = detectarProjetoLiquido
): Promise<void> {
const extensaoArquivo = documento.languageId === 'delegua-testes'
? 'delegua'
Expand Down Expand Up @@ -79,6 +85,8 @@ export async function executarAnalises(
let resultadoAnalisadorSemantico: RetornoAnalisadorSemanticoInterface | undefined = undefined;
let declaracoesPreCarregadas: Declaracao[] = [];
let dependenciasArquivos: string[] = [];
let contextoProjetoLiquido: ContextoProjetoLiquido | undefined;
let emContextoLiquido = false;

switch (extensaoArquivo) {
case "birl": {
Expand Down Expand Up @@ -108,13 +116,14 @@ export async function executarAnalises(

importador.diretorioBase = documento.fileName.substring(0, documento.fileName.lastIndexOf(separador));
const avaliadorComImportacao = new AvaliadorSintaticoComImportacao(importador);
const arquivoDeRotaLiquido = /[\\\/]rotas[\\\/]/i.test(documento.fileName);
contextoProjetoLiquido = await detectorProjetoLiquido(documento.uri);
emContextoLiquido = contextoLiquidoCorrespondeAExtensao(contextoProjetoLiquido, extensaoArquivo);

avaliadorComImportacao.definirContextoLiquido(arquivoDeRotaLiquido);
avaliadorComImportacao.definirContextoLiquido(emContextoLiquido);
avaliadorComImportacao.diagnosticos = diagnosticos;
await avaliadorComImportacao.preCarregarDefinicoes(await descobrirDefinicoes(arquivoDeRotaLiquido));
await avaliadorComImportacao.preCarregarDefinicoes(await descobrirDefinicoes(emContextoLiquido));

if (arquivoDeRotaLiquido) {
if (emContextoLiquido) {
const aliasesContextoLiquido: Record<string, string> = {
Liquido: 'liquido',
Requisicao: 'requisicao',
Expand All @@ -141,11 +150,12 @@ export async function executarAnalises(
case "pitu":
case "pitugues":
lexador = new LexadorPitugues();
const emRotaLiquidoPitu = /[\\\/]rotas[\\\/]/i.test(documento.fileName);
avaliadorSintatico = emRotaLiquidoPitu
contextoProjetoLiquido = await detectorProjetoLiquido(documento.uri);
emContextoLiquido = contextoLiquidoCorrespondeAExtensao(contextoProjetoLiquido, extensaoArquivo);
avaliadorSintatico = emContextoLiquido
? new AvaliadorSintaticoPituguesLiquido()
: new AvaliadorSintaticoPitugues();
analisadorSemantico = emRotaLiquidoPitu
analisadorSemantico = emContextoLiquido
? new AnalisadorSemanticoPituguesLiquido()
: new AnalisadorSemanticoPitugues();
break;
Expand Down Expand Up @@ -243,10 +253,13 @@ export async function executarAnalises(
declaracoesPreCarregadas = Object.values(avaliadorSintatico.tiposDefinidosEmCodigo);
(analisadorSemantico as any)?.registrarClassesExternas?.(declaracoesPreCarregadas.filter(d => d instanceof Classe));

const chaveWorkspace = vscode.workspace.workspaceFolders?.[0]?.uri.toString() || 'sem-workspace';
const arquivoDeRotaLiquidoFinal = /[\\\/]rotas[\\\/]/i.test(documento.fileName);
const chaveWorkspace =
(vscode.workspace as any).getWorkspaceFolder?.(documento.uri)?.uri?.toString?.() || 'sem-workspace';
const chaveContexto = contextoProjetoLiquido
? `${contextoProjetoLiquido.raiz.toString()}::liquido::${contextoProjetoLiquido.arquetipo ?? 'sem-arquetipo'}::${contextoProjetoLiquido.linguagem ?? 'linguagem-invalida'}`
: `${chaveWorkspace}::normal`;
definirDefinicoes(
`${chaveWorkspace}::${arquivoDeRotaLiquidoFinal ? 'liquido' : 'normal'}`,
chaveContexto,
{ ...avaliadorSintatico.tiposDefinidosEmCodigo }
);

Expand Down
57 changes: 43 additions & 14 deletions fontes/extensao-web.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import { ProvedorTarefasLiquidoWeb } from './tarefas/provedor-tarefas-web';
import { comandosLiquido, TIPO_TAREFA_LIQUIDO } from './tarefas/comandos-liquido';

import { executarAnalises } from './analise-codigo';
import { ehArquivoConfiguracaoProjetoLiquido } from './liquido/deteccao-projeto-liquido';
import { reanalisarDocumentosAbertosProjetoLiquido } from './liquido/reanalisar-documentos-projeto-liquido';
import { validarDelprops } from './linguagens/delprops/validador-delprops';
import { DeleguaProvedorAssinaturaMetodos } from './assinaturas-metodos';
import { garantirProvedoresLinguagem } from './ativacao-linguagens';
Expand Down Expand Up @@ -242,28 +244,24 @@ export function activate(context: vscode.ExtensionContext) {
);

context.subscriptions.push(
vscode.workspace.onDidSaveTextDocument(documento => {
vscode.workspace.onDidSaveTextDocument(async documento => {
if (ehArquivoDependenciaProjeto(documento)) {
expirarTudo('dependencias-atualizadas');
expirarTodasDefinicoes('dependencias-atualizadas');
}

if (documento.uri.path.endsWith('configuracao.delprops')) {
for (const doc of vscode.workspace.textDocuments) {
if (/[\\\/]rotas[\\\/]/i.test(doc.fileName) &&
doc.languageId === 'delegua') {
expirarResultado(doc.uri.toString(), 'delprops-atualizado');
executarAnalises(doc, diagnosticosDelegua).catch(erro => {
console.error('Erro ao reanalisar rota após atualização de delprops:', erro);
});
}
}
if (ehArquivoConfiguracaoProjetoLiquido(documento.uri)) {
expirarTodasDefinicoes('delprops-atualizado');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: [documento.uri],
motivo: 'delprops-atualizado',
});
}
})
);

context.subscriptions.push(
vscode.workspace.onDidCreateFiles(evento => {
vscode.workspace.onDidCreateFiles(async evento => {
const uris = evento.files.map(arquivo => arquivo.toString());
expirarResultados(uris, 'arquivo-criado');

Expand All @@ -272,11 +270,20 @@ export function activate(context: vscode.ExtensionContext) {
.map(arquivo => arquivo.path);

expirarResultadosPorDependenciaArquivo(caminhosAfetados, 'arquivo-linguagem-criado');

const configuracoesLiquido = evento.files.filter(ehArquivoConfiguracaoProjetoLiquido);
if (configuracoesLiquido.length > 0) {
expirarTodasDefinicoes('configuracao-liquido-criada');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: configuracoesLiquido,
motivo: 'configuracao-liquido-criada',
});
}
})
);

context.subscriptions.push(
vscode.workspace.onDidDeleteFiles(evento => {
vscode.workspace.onDidDeleteFiles(async evento => {
const uris = evento.files.map(arquivo => arquivo.toString());
expirarResultados(uris, 'arquivo-removido');

Expand All @@ -285,11 +292,21 @@ export function activate(context: vscode.ExtensionContext) {
.map(arquivo => arquivo.path);

expirarResultadosPorDependenciaArquivo(caminhosAfetados, 'arquivo-linguagem-removido');

const configuracoesLiquido = evento.files.filter(ehArquivoConfiguracaoProjetoLiquido);
if (configuracoesLiquido.length > 0) {
expirarTodasDefinicoes('configuracao-liquido-removida');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: configuracoesLiquido,
incluirDocumentosSemProjeto: true,
motivo: 'configuracao-liquido-removida',
});
}
})
);

context.subscriptions.push(
vscode.workspace.onDidRenameFiles(evento => {
vscode.workspace.onDidRenameFiles(async evento => {
expirarResultados(
evento.files.flatMap(arquivo => [arquivo.oldUri.toString(), arquivo.newUri.toString()]),
'arquivo-renomeado'
Expand All @@ -301,6 +318,18 @@ export function activate(context: vscode.ExtensionContext) {
.flatMap(arquivo => [arquivo.oldUri.path, arquivo.newUri.path]),
'arquivo-linguagem-renomeado'
);

const configuracoesLiquido = evento.files
.flatMap(arquivo => [arquivo.oldUri, arquivo.newUri])
.filter(ehArquivoConfiguracaoProjetoLiquido);
if (configuracoesLiquido.length > 0) {
expirarTodasDefinicoes('configuracao-liquido-renomeada');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: configuracoesLiquido,
incluirDocumentosSemProjeto: true,
motivo: 'configuracao-liquido-renomeada',
});
}
})
);

Expand Down
55 changes: 42 additions & 13 deletions fontes/extensao.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ import { DeleguaProvedorFormatacao } from './formatadores/delegua-provedor-forma

import { traduzir } from './traducao';
import { executarAnalises } from './analise-codigo';
import { ehArquivoConfiguracaoProjetoLiquido } from './liquido/deteccao-projeto-liquido';
import { reanalisarDocumentosAbertosProjetoLiquido } from './liquido/reanalisar-documentos-projeto-liquido';
import { DeleguaProvedorAssinaturaMetodos, DeleguaTestesProvedorAssinaturaMetodos } from './assinaturas-metodos';
import { garantirProvedoresLinguagem } from './ativacao-linguagens';

Expand Down Expand Up @@ -223,28 +225,24 @@ export function activate(context: vscode.ExtensionContext) {
);

context.subscriptions.push(
vscode.workspace.onDidSaveTextDocument(documento => {
vscode.workspace.onDidSaveTextDocument(async documento => {
if (ehArquivoDependenciaProjeto(documento)) {
expirarTudo('dependencias-atualizadas');
expirarTodasDefinicoes('dependencias-atualizadas');
}

if (documento.uri.path.endsWith('configuracao.delprops')) {
for (const doc of vscode.workspace.textDocuments) {
if (/[\\\/]rotas[\\\/]/i.test(doc.fileName) &&
doc.languageId === 'delegua') {
expirarResultado(doc.uri.toString(), 'delprops-atualizado');
executarAnalises(doc, diagnosticosDelegua).catch(erro => {
console.error('Erro ao reanalisar rota após atualização de delprops:', erro);
});
}
}
if (ehArquivoConfiguracaoProjetoLiquido(documento.uri)) {
expirarTodasDefinicoes('delprops-atualizado');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: [documento.uri],
motivo: 'delprops-atualizado',
});
}
})
);

context.subscriptions.push(
vscode.workspace.onDidCreateFiles(evento => {
vscode.workspace.onDidCreateFiles(async evento => {
const uris = evento.files.map(arquivo => arquivo.toString());
expirarResultados(uris, 'arquivo-criado');

Expand All @@ -253,11 +251,20 @@ export function activate(context: vscode.ExtensionContext) {
.map(arquivo => arquivo.fsPath);

expirarResultadosPorDependenciaArquivo(caminhosAfetados, 'arquivo-delegua-criado');

const configuracoesLiquido = evento.files.filter(ehArquivoConfiguracaoProjetoLiquido);
if (configuracoesLiquido.length > 0) {
expirarTodasDefinicoes('configuracao-liquido-criada');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: configuracoesLiquido,
motivo: 'configuracao-liquido-criada',
});
}
})
);

context.subscriptions.push(
vscode.workspace.onDidDeleteFiles(evento => {
vscode.workspace.onDidDeleteFiles(async evento => {
const uris = evento.files.map(arquivo => arquivo.toString());
expirarResultados(uris, 'arquivo-removido');

Expand All @@ -266,6 +273,16 @@ export function activate(context: vscode.ExtensionContext) {
.map(arquivo => arquivo.fsPath);

expirarResultadosPorDependenciaArquivo(caminhosAfetados, 'arquivo-delegua-removido');

const configuracoesLiquido = evento.files.filter(ehArquivoConfiguracaoProjetoLiquido);
if (configuracoesLiquido.length > 0) {
expirarTodasDefinicoes('configuracao-liquido-removida');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: configuracoesLiquido,
incluirDocumentosSemProjeto: true,
motivo: 'configuracao-liquido-removida',
});
}
})
);

Expand Down Expand Up @@ -717,6 +734,18 @@ export function activate(context: vscode.ExtensionContext) {
'arquivo-delegua-renomeado'
);

const configuracoesLiquido = evento.files
.flatMap(arquivo => [arquivo.oldUri, arquivo.newUri])
.filter(ehArquivoConfiguracaoProjetoLiquido);
if (configuracoesLiquido.length > 0) {
expirarTodasDefinicoes('configuracao-liquido-renomeada');
await reanalisarDocumentosAbertosProjetoLiquido(diagnosticosDelegua, {
arquivosConfiguracao: configuracoesLiquido,
incluirDocumentosSemProjeto: true,
motivo: 'configuracao-liquido-renomeada',
});
}

const houveRenomeacaoDelgua = evento.files.some(arquivo =>
ehArquivoDelegua(arquivo.oldUri) || ehArquivoDelegua(arquivo.newUri)
);
Expand Down
Loading
Loading