🚀 Validação de Atribuição para Vetores e Matrizes na Declaração#369
🚀 Validação de Atribuição para Vetores e Matrizes na Declaração#369maikvinicius wants to merge 1 commit intodgadelha:mainfrom
Conversation
dgadelha
left a comment
There was a problem hiding this comment.
Obrigado pela contribuição e desculpa pela demora na revisão :)
Deixei uns comentários que são importantes de serem resolvidos para que o PR possa ser mergeado.
| sb.append(`throw new Error("${message}")`); | ||
| } | ||
| } else { | ||
| const message = `Você precisa informar o tamanho do vetor (${arr.ID().getText()}) e que ele seja maior que 0`; |
There was a problem hiding this comment.
O Portugol permite declarar vetores sem um tamanho explícito no código, por exemplo:
programa {
inclua biblioteca Util --> u
funcao inicio() {
caracter vogais[] = { 'a', 'e', 'i', 'o', 'u' }
para (inteiro i = 0; i < u.numero_elementos(vogais); i++) {
escreva("Vogal: ", vogais[i], "\n")
}
}
}Como isso é parte do padrão já definido pela UNIVALI, o Webstudio não pode restringir
| captureException("visitListaDeclaracoes", { | ||
| extra: { text: message }, | ||
| }); | ||
| PortugolJs.thrown.visitListaDeclaracoes = true; |
There was a problem hiding this comment.
Essa parte aqui não é necessária (até me prejudica um pouco pois vai spammar o meu Sentry kkk), pois é para pegar possíveis erros meus no código do transpilador, não erros no código do usuário.
| const matrizStr = str.match(/{{(.+)}}/)?.[1]; | ||
| const linhas = matrizStr?.split("},{"); |
There was a problem hiding this comment.
Não dá para assumir que o usuário não vai deixar os itens da matriz sem espaçamento após a chave, ou antes da vírgula, ou qualquer coisa previsível, esse é o lado ruim de trabalhar direto no transpilador.
Enxergo uma possível forma de solucionar esse problema ainda aqui no transpilador: dá para criar uma função no Runtime que recebe a instância do Array/Matriz e o tamanho esperado por cada linha, e dá o erro se o o tamanho for maior, por exemplo:
sb.append(
this.PAD(),
"runtime.checkMatrizSize(",
`${scopeStr}.variables["${mtrx.ID().getText()}"]`,
", ",
this.visit(mtrx.linhaMatriz()),
", ",
this.visit(mtrx.colunaMatriz(),
");\n",
)Ou, tentar dar uma olhada para o analisador de erros, onde você já tem acesso a uma estrutura fortemente tipada já parseada.
There was a problem hiding this comment.
Copilot reviewed 1 out of 1 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
packages/runtime/src/PortugolJs.ts:1029
- Consider trimming each element in items_array (e.g., using items_array.map(item => item.trim())) to handle any unexpected whitespace in the assigned values.
const items_array = match ? match[1].split(",") : [];
| const linhas = matrizStr?.split("},{"); | ||
| const tamanho_matriz = linhas?.map(linha => linha.split(",").length); |
There was a problem hiding this comment.
Consider trimming whitespace for each entry after splitting the matrix string (e.g., using linhas.map(l => l.trim())) to ensure robust parsing regardless of extra spaces.
| const linhas = matrizStr?.split("},{"); | |
| const tamanho_matriz = linhas?.map(linha => linha.split(",").length); | |
| const linhas = matrizStr?.split("},{").map(l => l.trim()); |
📌 Descrição
Este PR adiciona validações para garantir que a atribuição de vetores e matrizes respeite os tamanhos declarados, evitando erros de execução e melhorando a confiabilidade do código.
🔍 Alterações Principais
🟢 Matrizes
🟢 Vetores
✅ Benefícios
✔️ Evita atribuições incorretas que poderiam causar comportamentos inesperados.
✔️ Garante maior robustez e previsibilidade no uso de vetores e matrizes.
✔️ Melhora a clareza das mensagens de erro para o usuário.
🧪 Testes & Considerações
captureExceptionpara facilitar a depuração.📌 Pronto para revisão! 🚀