Skip to content

🚀 Validação de Atribuição para Vetores e Matrizes na Declaração#369

Open
maikvinicius wants to merge 1 commit intodgadelha:mainfrom
maikvinicius:main
Open

🚀 Validação de Atribuição para Vetores e Matrizes na Declaração#369
maikvinicius wants to merge 1 commit intodgadelha:mainfrom
maikvinicius:main

Conversation

@maikvinicius
Copy link

📌 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

  • Valida se os tamanhos das linhas e colunas foram informados corretamente.
  • Verifica se a quantidade de elementos atribuídos excede as dimensões da matriz.
  • Lança um erro caso a atribuição ultrapasse os limites definidos.

🟢 Vetores

  • Confere se o tamanho do vetor foi especificado corretamente.
  • Garante que o número de valores atribuídos não seja maior do que o tamanho do vetor.
  • Lança um erro caso a atribuição ultrapasse os limites declarados.

✅ 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

  • Foram adicionadas verificações para cobrir os casos em que os tamanhos não são informados.
  • Os erros são capturados e reportados via captureException para facilitar a depuração.

📌 Pronto para revisão! 🚀

Copy link
Owner

@dgadelha dgadelha left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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`;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

image

Comment on lines +1034 to +1037
captureException("visitListaDeclaracoes", {
extra: { text: message },
});
PortugolJs.thrown.visitListaDeclaracoes = true;
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +928 to +929
const matrizStr = str.match(/{{(.+)}}/)?.[1];
const linhas = matrizStr?.split("},{");
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@dgadelha dgadelha requested a review from Copilot April 13, 2025 22:49
Copy link

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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(",") : [];

Comment on lines +929 to +930
const linhas = matrizStr?.split("},{");
const tamanho_matriz = linhas?.map(linha => linha.split(",").length);
Copy link

Copilot AI Apr 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Suggested change
const linhas = matrizStr?.split("},{");
const tamanho_matriz = linhas?.map(linha => linha.split(",").length);
const linhas = matrizStr?.split("},{").map(l => l.trim());

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants