Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Issue #59] Atribuição Abreviada / Múltiplos Valores #124

Merged
merged 25 commits into from
Oct 10, 2024
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
487e4b6
Testando mudanças no Av Sintático para comportar múltiplos valores
VitBrandao Sep 23, 2024
b5f0f08
Adapta avaliador para seguir operando normalmente em casos de 1 valor
VitBrandao Sep 24, 2024
268d331
Adapta Av Sintatico para aceitar métodos em nova estrutura
VitBrandao Sep 24, 2024
9e2c39c
Corrige lógica para Av Sintatico aceitar casos de valores únicos com …
VitBrandao Sep 24, 2024
3926a48
Corrige validação do Av Sintatico após quebrar testes unitarios
VitBrandao Sep 24, 2024
e164927
Tratando casos de valores em branco no Av Sintatico
VitBrandao Sep 24, 2024
b7a2c3b
Adapta testes de valor numérico após novas implementações
VitBrandao Sep 24, 2024
9e14276
Organizando nova estrutura de resolverModificador()
VitBrandao Sep 25, 2024
3d09da1
Implementa trecho em resolverModificador() para atribuição abreviada
VitBrandao Sep 25, 2024
c0c3f52
Adaptando serializador para cobrir casos de atribuição abreviada
VitBrandao Sep 25, 2024
5285a9b
Inclui tipagem nas novas implementações
VitBrandao Sep 25, 2024
522a06a
Apaga trechos comentados no Avaliador Sintático
VitBrandao Sep 25, 2024
d46fbef
Aplicando ajustes solicitados
VitBrandao Sep 26, 2024
c9f3ce5
Otimiza operação de Atribuição Abreviada no Av Sintático
VitBrandao Sep 26, 2024
0e5e9e1
Organiza operação de Atribuição Abreviada em novo método
VitBrandao Sep 26, 2024
1c5cbae
Ajusta indentaçao e apaga comentários
VitBrandao Sep 26, 2024
c9945d8
Organiza e divide em listas os seletores de atribuicao abreviada
VitBrandao Oct 1, 2024
c0a2668
Testes de múltiplos valores-quantificadores na Atribuição Abrevida
VitBrandao Oct 2, 2024
4db6b8c
Atualiza listas de seletores AA
VitBrandao Oct 2, 2024
604c1c4
Testes de múltiplas Palavras Reservadas na Atribuição Abrevida
VitBrandao Oct 2, 2024
27d29ec
Otimiza método de atribuição abreviada no Av Sintático
VitBrandao Oct 2, 2024
91a82c3
Corrige valores extra do modificador animação
VitBrandao Oct 8, 2024
ad936d3
Montando objetos "modificador": "valor" para testes de Atribuição Abr…
VitBrandao Oct 8, 2024
0726ebe
Testes de valor-quantificador e palavras reservadas como múltiplo valor
VitBrandao Oct 8, 2024
9762106
Complementa testes de valor-quantificador e palavra reservada
VitBrandao Oct 8, 2024
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
16 changes: 3 additions & 13 deletions exemplos/exemplo2.foles
Original file line number Diff line number Diff line change
@@ -1,15 +1,5 @@
lmht {
tempo-transicao: curva-cúbica(0.42, 0.0, 1.0, 1.0);
cor-destaque: rgb(100, 200, 300);
opacidade: 80%;
recuo: 10px 10px 15px 20px;
altura: 50%;
}

.classe {
tempo-transicao: passos(3, final);
tamanho-colunas-em-grade: minmax(200px, auto);
altura-máxima: encaixar-conteúdo(5cm);
altura: limitar(1px, 2vw, 2.5rem);

.outra-classe {
tamanho-fonte: 24px;
}
}
1 change: 1 addition & 0 deletions exemplos/exemplo3.foles
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
lmht {
linhas-superiores: 2;
altura: 30px;
largura: herdar;
colunas: 2;
opacidade: 0.5;
indice-z: 5;
Expand Down
116 changes: 88 additions & 28 deletions fontes/avaliador-sintatico/avaliador-sintatico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -994,15 +994,33 @@
return textoUrl;
}

valorModificador(): any {
const valorModificador = this.avancarEDevolverAnterior();
valoresModificador(): Array<any> {
const modificadores = [];

switch (valorModificador.tipo) {
case tiposDeSimbolos.METODO:
return this.resolverMetodo(valorModificador.lexema);
default:
return valorModificador;
while (this.simbolos[this.atual].hasOwnProperty('tipo') && this.simbolos[this.atual].tipo !== tiposDeSimbolos.PONTO_E_VIRGULA) {
VitBrandao marked this conversation as resolved.
Show resolved Hide resolved
const valorModificador = this.avancarEDevolverAnterior();

switch (valorModificador.tipo) {
case tiposDeSimbolos.METODO:
const metodo = this.resolverMetodo(valorModificador.lexema);
modificadores.push(metodo);
default:
const modificador = valorModificador;
modificadores.push(modificador);
}
}

return modificadores;

// IMPLEMENTAÇÃO ANTERIOR
VitBrandao marked this conversation as resolved.
Show resolved Hide resolved
// const valorModificador = this.avancarEDevolverAnterior();

// switch (valorModificador.tipo) {
// case tiposDeSimbolos.METODO:
// return this.resolverMetodo(valorModificador.lexema);
// default:
// return valorModificador;
// }
}

private tratarValorNumerico(modificador: Simbolo): Boolean {
Expand Down Expand Up @@ -1152,40 +1170,82 @@
"Esperado ':' após nome do modificador."
);

const valorModificador = this.valorModificador();
let quantificador;
const valoresModificador: Array<any> = this.valoresModificador();
let quantificador: any;
let quantificadores: Array<any> = [];

for (const [index, valorModificador] of valoresModificador.entries()) {
if (valorModificador.hasOwnProperty('tipo') && valorModificador.tipo === tiposDeSimbolos.NUMERO) {

const tratarValorNumerico = this.tratarValorNumerico(valorModificador);

if (tratarValorNumerico) {
quantificador = valoresModificador[index + 1];
quantificadores.push(valoresModificador[index + 1]);
valoresModificador.splice(index + 1, 1);
}
}

if (valorModificador.hasOwnProperty('tipo') && valorModificador.tipo === tiposDeSimbolos.METODO) {
valoresModificador.splice(index, 1);
}
}

// TODO: Pensar num teste melhor pra isso.
VitBrandao marked this conversation as resolved.
Show resolved Hide resolved
/*if (!(valorModificador instanceof Metodo)) {
quantificador = this.avancarEDevolverAnterior();
}*/

if (valorModificador.hasOwnProperty('tipo') && valorModificador.tipo === tiposDeSimbolos.NUMERO) {
const tratarValorNumerico = this.tratarValorNumerico(modificador);

if (tratarValorNumerico) {
quantificador = this.avancarEDevolverAnterior();
}
if (valoresModificador.length === 0) {
const proximoSimbolo = this.avancarEDevolverAnterior();
valoresModificador.push(proximoSimbolo);
}

this.consumir(
tiposDeSimbolos.PONTO_E_VIRGULA,
`Esperado ';' após declaração de valor de modificador '${modificador.lexema}'.`
);

const classeModificadora = new SeletorModificador(
modificador.lexema,
valorModificador.hasOwnProperty('lexema') ? valorModificador.lexema : valorModificador,
quantificador && quantificador.hasOwnProperty('lexema') ?
quantificador.lexema :
quantificador,
{
linha: modificador.linha,
colunaInicial: modificador.colunaInicial,
colunaFinal: modificador.colunaFinal
if (valoresModificador.length === 1) {
const classeModificadora = new SeletorModificador(
modificador.lexema,
valoresModificador[0].hasOwnProperty('lexema') ? valoresModificador[0].lexema : valoresModificador[0],
quantificador && quantificador.hasOwnProperty('lexema') ?
quantificador.lexema :
quantificador,
{
linha: modificador.linha,
colunaInicial: modificador.colunaInicial,
colunaFinal: modificador.colunaFinal
}
);

return classeModificadora as Modificador;
} else {
VitBrandao marked this conversation as resolved.
Show resolved Hide resolved
let atribuicaoAbreviada: string = '';
for (let i = 0; i < valoresModificador.length; i += 1) {
if (i > 0) {
atribuicaoAbreviada += ' ';
atribuicaoAbreviada += `${valoresModificador[i].lexema}${quantificadores[i].lexema}`;
} else {
atribuicaoAbreviada += `${valoresModificador[i].lexema}${quantificadores[i].lexema}`;
}
}
);

return classeModificadora as Modificador;
const classeModificadora = new SeletorModificador(
modificador.lexema,
atribuicaoAbreviada,
quantificador && quantificador.hasOwnProperty('lexema') ?
quantificador.lexema :

Check warning on line 1238 in fontes/avaliador-sintatico/avaliador-sintatico.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch
quantificador,

Check warning on line 1239 in fontes/avaliador-sintatico/avaliador-sintatico.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch
{
linha: modificador.linha,
colunaInicial: modificador.colunaInicial,
colunaFinal: modificador.colunaFinal
}

Check warning on line 1244 in fontes/avaliador-sintatico/avaliador-sintatico.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
);

return classeModificadora as Modificador;
}

Check warning on line 1248 in fontes/avaliador-sintatico/avaliador-sintatico.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch
}

resolverModificadoresEDeclaracoesAninhadas(): { modificadores: Modificador[], declaracoesAninhadas: Declaracao[] } {
Expand Down
9 changes: 8 additions & 1 deletion fontes/serializadores/serializador.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,14 @@
};\n`;
}

// Caso 4: É um valor genérico, cuja tradução está na lista 'valoresGerais'.
// Caso 4: Atribuição Abreviada | Múltiplos valores
if (modificador.valor.includes(' ')) {
return `${" ".repeat(indentacao)}${modificador.propriedadeCss}: ${
modificador.valor
};\n`;

Check warning on line 58 in fontes/serializadores/serializador.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🧾 Statement is not covered

Warning! Not covered statement
}

Check warning on line 59 in fontes/serializadores/serializador.ts

View workflow job for this annotation

GitHub Actions / Coverage annotations (🧪 jest-coverage-report-action)

🌿 Branch is not covered

Warning! Not covered branch

// Caso 5: É um valor genérico, cuja tradução está na lista 'valoresGerais'.
const valorTraduzido = valoresGerais[modificador.valor];
return `${" ".repeat(indentacao)}${
modificador.propriedadeCss
Expand Down
20 changes: 20 additions & 0 deletions testes/listas/valor-numerico.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,26 @@ export const ValorNumerico: Array<string> = [
'coluna-em-grade',
];

export const ValorNumericoApenas: Array<string> = [
'linhas-superiores',
'repetir-animacao',
'repetir-animação',
'contar-coluna',
'flex-crescimento',
'flex-reduzir',
'ajustar-tamanho-fonte',
'espessura-fonte',
'fim-coluna-em-grade',
'inicio-coluna-em-grade',
'início-coluna-em-grade',
'fim-linha-em-grade',
'inicio-linha-em-grade',
'início-linha-em-grade',
'ordenar',
'linhas-inferiores',
];


// A lista abaixo inclui modificadores que aceitam tanto somente valores numéricos
// quanto valores numéricos c/ quantificador.
export const ValorNumericoComQuantificador = [
Expand Down
26 changes: 18 additions & 8 deletions testes/modificadores/valor-numerico.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { Lexador } from "../../fontes/lexador";
import { SeletorModificador } from "../../fontes/modificadores/superclasse";
import tiposDeSimbolos from "../../fontes/tipos-de-simbolos/foles";
import { Serializador } from "../../fontes/serializadores";
import { ValorNumerico, ValorNumericoComQuantificador } from "../listas/valor-numerico";
import { ValorNumerico, ValorNumericoApenas, ValorNumericoComQuantificador } from "../listas/valor-numerico";

describe('Testando Seletores que recebem VALOR NUMÉRICO sem quantificador', () => {
describe('Testes Unitários', () => {
Expand Down Expand Up @@ -58,12 +58,12 @@ describe('Testando Seletores que recebem VALOR NUMÉRICO sem quantificador', ()
});

it('Casos de Falha - Lexador, Avaliador e Tradutor', () => {
for (let index = 0; index < Object.keys(ValorNumerico).length; index += 1) {
for (let index = 0; index < Object.keys(ValorNumericoApenas).length; index += 1) {

// Lexador - valor numérico não informado
const resultadoLexador = lexador.mapear([
"lmht {",
`${ValorNumerico[index]}: ;`,
`${ValorNumericoApenas[index]}: ;`,
"}"
]);

Expand All @@ -76,14 +76,24 @@ describe('Testando Seletores que recebem VALOR NUMÉRICO sem quantificador', ()
// Tentando passar um quantificador para os modificadores (o que não deve ser permitido)
const novoLexador = lexador.mapear([
"lmht {",
`${ValorNumerico[index]}: 15px;`,
`${ValorNumericoApenas[index]}: 15px;`,
"}"
]);

// Avaliador Sintático - Erro esperado como retorno
expect(() => {
avaliador.analisar(novoLexador.simbolos);
}).toThrow(`Esperado ';' após declaração de valor de modificador '${ValorNumerico[index]}'.`);
const regex = /[~çáéíóúÁÉÍÓÚ]/;

if (!regex.test(ValorNumericoApenas[index]) && regex.test(ValorNumericoApenas[index + 1])){
expect(() => {
avaliador.analisar(novoLexador.simbolos);
}).toThrow(`A propriedade ${ValorNumericoApenas[index + 1]} aceita somente valores numéricos. O quantificador px é inválido para esta operação.`);
} else {
expect(() => {
avaliador.analisar(novoLexador.simbolos);
}).toThrow(`A propriedade ${ValorNumericoApenas[index]} aceita somente valores numéricos. O quantificador px é inválido para esta operação.`);
}

// A propriedade linhas-superiores aceita somente valores numéricos. O quantificador px é inválido para esta operação.


// Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático
Expand Down Expand Up @@ -217,7 +227,7 @@ describe('Testando Seletores que recebem VALOR NUMÉRICO com ou sem quantificado
// Avaliador Sintático - Erro esperado como retorno
expect(() => {
avaliador.analisar(novoLexador.simbolos);
}).toThrow(`Esperado ';' após declaração de valor de modificador '${seletorIncorreto}'.`);
}).toThrow(`O seletor '${seletorIncorreto}' não existe.`);

// // Tradutor - Não deve traduzir devido ao erro do Avaliador Sintático
expect(() => {
Expand Down
Loading