Skip to content

Commit

Permalink
Corrigir check de função retornando valor
Browse files Browse the repository at this point in the history
No momento, foi a verificação que deu pra fazer
  • Loading branch information
dgadelha committed Oct 15, 2023
1 parent c6f5de2 commit 41ba34a
Show file tree
Hide file tree
Showing 5 changed files with 13 additions and 11 deletions.
2 changes: 1 addition & 1 deletion packages/ide/src/app/tab-start/tab-start.component.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@
<hr />

<h4>📰&nbsp;&nbsp;Novidades</h4>
<p><strong>15/10/2023:</strong> Correção de verificação simples de retorno de função</p>
<p><strong>11/10/2023:</strong> Correção de quebra de linha após execução da função <code>leia()</code></p>
<p><strong>28/09/2023:</strong> Correção de uso excessivo de recursos ao usar atribuições.</p>
<p><strong>02/09/2023:</strong> Verificação básica de erros no editor.</p>
</section>

<footer>
Expand Down
2 changes: 0 additions & 2 deletions packages/parser/src/PortugolErrorChecker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,8 +35,6 @@ export class PortugolErrorChecker {
const arquivo = this.portugolNode.visit(tree) as Arquivo;
const errors: PortugolCodeError[] = [];

console.log({ arquivo });

for (const checker of errorCheckers) {
for (const error of checker(arquivo)) {
errors.push(error);
Expand Down
7 changes: 5 additions & 2 deletions packages/parser/src/errors/01-estrutura-básica.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { PortugolCodeError } from "@portugol-webstudio/antlr";

import { getAllChildrenFromNode } from "../helpers/nodes.js";
import { Arquivo } from "../nodes/Arquivo.js";
import { RetorneCmd } from "../nodes/RetorneCmd.js";

Expand All @@ -21,8 +22,10 @@ export function* checarFunçãoInício(arquivo: Arquivo) {

export function* checarFunçõesComRetorno(arquivo: Arquivo) {
for (const func of arquivo.funções) {
if (func.retorno.primitivo !== "vazio" && !func.instruções.some(instrução => instrução instanceof RetorneCmd)) {
yield PortugolCodeError.fromContext(func.ctx, `A função '${func.nome}' deve retornar um valor`);
if (func.retorno.primitivo !== "vazio") {
if (!getAllChildrenFromNode(func).some(instrução => instrução instanceof RetorneCmd)) {
yield PortugolCodeError.fromContext(func.ctx, `A função '${func.nome}' deve retornar um valor`);
}
}
}
}
8 changes: 2 additions & 6 deletions packages/parser/src/errors/02-variáveis.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { PortugolCodeError } from "@portugol-webstudio/antlr";

import { getAllChildrenFromNode } from "../helpers/nodes.js";
import { Tipo } from "../helpers/Tipo.js";
import { Arquivo } from "../nodes/Arquivo.js";
import { AtribuiçãoCmd } from "../nodes/AtribuiçãoCmd.js";
Expand All @@ -11,7 +12,6 @@ import { DeclaraçãoCmd } from "../nodes/DeclaraçãoCmd.js";
import { Expressão } from "../nodes/Expressão.js";
import { InteiroExpr } from "../nodes/InteiroExpr.js";
import { LógicoExpr } from "../nodes/LógicoExpr.js";
import { Node } from "../nodes/Node.js";
import { RealExpr } from "../nodes/RealExpr.js";
import { ReferênciaVarExpr } from "../nodes/ReferênciaVarExpr.js";

Expand All @@ -20,10 +20,6 @@ interface Escopo {
funções: Map<string, Tipo>;
}

function getAllChildren(node: Node): Node[] {
return node.children.flatMap(child => [child, ...getAllChildren(child)]);
}

export function* checarUsoEscopo(arquivo: Arquivo) {
const escopo: Escopo = {
variáveis: new Map<string, Tipo>(),
Expand Down Expand Up @@ -65,7 +61,7 @@ export function* checarUsoEscopo(arquivo: Arquivo) {
}

const instruções: Array<Comando | Expressão> = func.instruções.concat(
func.instruções.flatMap(getAllChildren) as Array<Comando | Expressão>,
func.instruções.flatMap(getAllChildrenFromNode) as Array<Comando | Expressão>,
);

for (const expr of instruções) {
Expand Down
5 changes: 5 additions & 0 deletions packages/parser/src/helpers/nodes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { ParseTree } from "antlr4ts/tree/ParseTree.js";

import { ParseError } from "./ParseError.js";
import { Node } from "../nodes/Node.js";

export function getAllChildrenFromContext(ctx: ParseTree | undefined) {
if (!ctx) {
Expand All @@ -19,6 +20,10 @@ export function getAllChildrenFromContext(ctx: ParseTree | undefined) {
return children;
}

export function getAllChildrenFromNode(node: Node): Node[] {
return node.children.flatMap(child => [child, ...getAllChildrenFromNode(child)]);
}

export function invariant(condition: any, ctx: ParseTree, message?: string): asserts condition {
if (condition) {
return;
Expand Down

0 comments on commit 41ba34a

Please sign in to comment.