@designliquido/delegua 0.43.5 → 0.44.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/bin/package.json +1 -1
  2. package/interfaces/interpretador-com-depuracao-interface.d.ts +6 -1
  3. package/interfaces/interpretador-com-depuracao-interface.d.ts.map +1 -1
  4. package/interfaces/interpretador-interface.d.ts +1 -1
  5. package/interfaces/interpretador-interface.d.ts.map +1 -1
  6. package/interpretador/depuracao/comum.d.ts +88 -0
  7. package/interpretador/depuracao/comum.d.ts.map +1 -0
  8. package/interpretador/depuracao/comum.js +509 -0
  9. package/interpretador/depuracao/comum.js.map +1 -0
  10. package/interpretador/depuracao/index.d.ts +3 -0
  11. package/interpretador/depuracao/index.d.ts.map +1 -0
  12. package/interpretador/depuracao/index.js +19 -0
  13. package/interpretador/depuracao/index.js.map +1 -0
  14. package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts +124 -0
  15. package/interpretador/depuracao/interpretador-base-com-depuracao.d.ts.map +1 -0
  16. package/interpretador/depuracao/interpretador-base-com-depuracao.js +206 -0
  17. package/interpretador/depuracao/interpretador-base-com-depuracao.js.map +1 -0
  18. package/interpretador/{interpretador-com-depuracao.d.ts → depuracao/interpretador-com-depuracao.d.ts} +9 -54
  19. package/interpretador/depuracao/interpretador-com-depuracao.d.ts.map +1 -0
  20. package/interpretador/depuracao/interpretador-com-depuracao.js +226 -0
  21. package/interpretador/depuracao/interpretador-com-depuracao.js.map +1 -0
  22. package/interpretador/index.d.ts +0 -1
  23. package/interpretador/index.d.ts.map +1 -1
  24. package/interpretador/index.js +0 -1
  25. package/interpretador/index.js.map +1 -1
  26. package/package.json +1 -1
  27. package/umd/delegua.js +301 -18095
  28. package/interpretador/interpretador-com-depuracao.d.ts.map +0 -1
  29. package/interpretador/interpretador-com-depuracao.js +0 -579
  30. package/interpretador/interpretador-com-depuracao.js.map +0 -1
package/bin/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@designliquido/delegua",
3
- "version": "0.43.4",
3
+ "version": "0.43.5",
4
4
  "description": "Linguagem de programação simples e moderna usando português estruturado.",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -1,5 +1,6 @@
1
1
  import { Declaracao } from '../declaracoes';
2
2
  import { PontoParada } from '../depuracao';
3
+ import { TipoEscopoExecucao } from './escopo-execucao';
3
4
  import { InterpretadorInterface } from './interpretador-interface';
4
5
  export type ComandoDepurador = 'proximo' | 'adentrarEscopo' | 'proximoESair' | 'continuar';
5
6
  export interface InterpretadorComDepuracaoInterface extends InterpretadorInterface {
@@ -8,11 +9,15 @@ export interface InterpretadorComDepuracaoInterface extends InterpretadorInterfa
8
9
  pontosParada: PontoParada[];
9
10
  avisoPontoParadaAtivado: Function;
10
11
  finalizacaoDaExecucao: Function;
12
+ escopoAtual: number;
13
+ executandoChamada: boolean;
14
+ passos: number;
15
+ idChamadaAtual?: string;
16
+ proximoEscopo?: TipoEscopoExecucao;
11
17
  adentrarEscopo(): Promise<any>;
12
18
  instrucaoPasso(): Promise<any>;
13
19
  instrucaoContinuarInterpretacao(): Promise<any>;
14
20
  instrucaoProximoESair(): Promise<any>;
15
21
  prepararParaDepuracao(declaracoes: Declaracao[]): void;
16
- obterVariavel(nome: string): Promise<any>;
17
22
  }
18
23
  //# sourceMappingURL=interpretador-com-depuracao-interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interpretador-com-depuracao-interface.d.ts","sourceRoot":"","sources":["../../fontes/interfaces/interpretador-com-depuracao-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,GAAG,cAAc,GAAG,WAAW,CAAC;AAE3F,MAAM,WAAW,kCAAmC,SAAQ,sBAAsB;IAC9E,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,uBAAuB,EAAE,QAAQ,CAAC;IAClC,qBAAqB,EAAE,QAAQ,CAAC;IAEhC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,+BAA+B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,qBAAqB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IACvD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC7C"}
1
+ {"version":3,"file":"interpretador-com-depuracao-interface.d.ts","sourceRoot":"","sources":["../../fontes/interfaces/interpretador-com-depuracao-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,gBAAgB,GAAG,cAAc,GAAG,WAAW,CAAC;AAE3F,MAAM,WAAW,kCAAmC,SAAQ,sBAAsB;IAC9E,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,uBAAuB,EAAE,QAAQ,CAAC;IAClC,qBAAqB,EAAE,QAAQ,CAAC;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,kBAAkB,CAAC;IAEnC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAC/B,+BAA+B,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,qBAAqB,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;CAC1D"}
@@ -15,7 +15,7 @@ export interface InterpretadorInterface extends VisitanteComumInterface {
15
15
  avaliar(expressao: Construto | Declaracao): any;
16
16
  executarBloco(declaracoes: Declaracao[], ambiente?: EspacoVariaveis): Promise<any>;
17
17
  paraTexto(objeto: any): any;
18
- executar(declaracao: Declaracao, mostrarResultado: boolean): any;
18
+ executar(declaracao: Declaracao, mostrarResultado?: boolean): any;
19
19
  interpretar(declaracoes: Declaracao[], manterAmbiente?: boolean): Promise<RetornoInterpretador>;
20
20
  }
21
21
  //# sourceMappingURL=interpretador-interface.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"interpretador-interface.d.ts","sourceRoot":"","sources":["../../fontes/interfaces/interpretador-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACnE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC;IACnB,eAAe,EAAE,QAAQ,CAAC;IAC1B,oBAAoB,EAAE,6BAA6B,CAAC;IACpD,qBAAqB,EAAE,GAAG,CAAC;IAE3B,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,GAAG,CAAC;IAChD,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnF,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,GAAG,GAAG,CAAC;IACjE,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnG"}
1
+ {"version":3,"file":"interpretador-interface.d.ts","sourceRoot":"","sources":["../../fontes/interfaces/interpretador-interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,MAAM,WAAW,sBAAuB,SAAQ,uBAAuB;IACnE,KAAK,EAAE,iBAAiB,EAAE,CAAC;IAC3B,aAAa,EAAE,GAAG,CAAC;IACnB,eAAe,EAAE,QAAQ,CAAC;IAC1B,oBAAoB,EAAE,6BAA6B,CAAC;IACpD,qBAAqB,EAAE,GAAG,CAAC;IAE3B,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;IAClC,OAAO,CAAC,SAAS,EAAE,SAAS,GAAG,UAAU,GAAG,GAAG,CAAC;IAChD,aAAa,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,QAAQ,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACnF,SAAS,CAAC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC;IAClE,WAAW,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,cAAc,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACnG"}
@@ -0,0 +1,88 @@
1
+ import { Chamada, Construto } from "../../construtos";
2
+ import { Declaracao, Enquanto, Escreva, Para, Retorna } from "../../declaracoes";
3
+ import { InterpretadorComDepuracaoInterface } from "../../interfaces";
4
+ import { RetornoQuebra } from "../../quebras";
5
+ import { EspacoVariaveis } from '../../espaco-variaveis';
6
+ import { TipoEscopoExecucao } from '../../interfaces/escopo-execucao';
7
+ /**
8
+ * Quando um construto ou declaração possui id, significa que o interpretador
9
+ * deve resolver a avaliação e guardar seu valor até o final do escopo.
10
+ * Isso serve para quando a linguagem está em modo de depuração, e o contexto
11
+ * da execução deixa de existir com um ponto de parada, por exemplo.
12
+ * @param expressao A expressão a ser avaliada.
13
+ * @returns O resultado da avaliação.
14
+ */
15
+ export declare function avaliar(interpretador: InterpretadorComDepuracaoInterface, expressao: Construto | Declaracao): Promise<any>;
16
+ export declare function visitarExpressaoDeChamada(interpretador: InterpretadorComDepuracaoInterface, visitarExpressaoDeChamadaAncestral: (expressao: Chamada) => Promise<any>, expressao: Chamada): Promise<any>;
17
+ export declare function visitarDeclaracaoEnquanto(interpretador: InterpretadorComDepuracaoInterface, declaracao: Enquanto): Promise<any>;
18
+ /**
19
+ * Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
20
+ * alguma função para escrever numa página Web.
21
+ * Se ponto de parada foi ativado durante a avaliação de argumentos, não escreve.
22
+ * @param declaracao A declaração.
23
+ * @returns Sempre nulo, por convenção de visita.
24
+ */
25
+ export declare function visitarDeclaracaoEscreva(interpretador: InterpretadorComDepuracaoInterface, declaracao: Escreva): Promise<any>;
26
+ export declare function visitarDeclaracaoPara(interpretador: InterpretadorComDepuracaoInterface, declaracao: Para): Promise<any>;
27
+ /**
28
+ * Ao executar um retorno, manter o valor retornado no Interpretador para
29
+ * uso por linhas que foram executadas com o comando `próximo` do depurador.
30
+ * @param declaracao Uma declaracao Retorna
31
+ * @returns O resultado da execução da visita.
32
+ */
33
+ export declare function visitarExpressaoRetornar(interpretador: InterpretadorComDepuracaoInterface, visitarExpressaoRetornarAncestral: (declaracao: Retorna) => Promise<any>, declaracao: Retorna): Promise<RetornoQuebra>;
34
+ /**
35
+ * Se bloco de execução já foi instanciado antes (por exemplo, quando há um ponto de parada e a
36
+ * execução do código é retomada pelo depurador), retoma a execução do bloco do ponto em que havia parado.
37
+ * Se bloco de execução ainda não foi instanciado, empilha declarações na pilha de escopos de execução,
38
+ * cria um novo ambiente e executa as declarações empilhadas.
39
+ * Se depurador comandou uma instrução 'adentrar-escopo', execução do bloco não ocorre, mas
40
+ * ponteiros de escopo e execução são atualizados.
41
+ * @param declaracoes Um vetor de declaracoes a ser executado.
42
+ * @param ambiente O ambiente de execução quando houver, como parâmetros, argumentos, etc.
43
+ */
44
+ export declare function executarBloco(interpretador: InterpretadorComDepuracaoInterface, declaracoes: Declaracao[], ambiente?: EspacoVariaveis): Promise<any>;
45
+ /**
46
+ * Continua a interpretação parcial do último ponto em que parou.
47
+ * Pode ser tanto o começo da execução inteira, ou pós comando do depurador
48
+ * quando há um ponto de parada.
49
+ * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
50
+ * imediatamente abaixo.
51
+ * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
52
+ * verificar o ponto de parada na primeira execução.
53
+ * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
54
+ * @returns Um objeto de retorno, com erros encontrados se houverem.
55
+ */
56
+ export declare function executarUltimoEscopoComandoContinuar(interpretador: InterpretadorComDepuracaoInterface, manterAmbiente?: boolean, naoVerificarPrimeiraExecucao?: boolean): Promise<any>;
57
+ /**
58
+ * Continua a interpretação, conforme comando do depurador.
59
+ * Quando um ponto de parada é ativado, a pilha de execução do TypeScript é perdida.
60
+ * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
61
+ * primeiro escopo, subindo até o último elemento executado do último escopo.
62
+ * Se entre escopos houver ponto de parada ativo, a execução é suspensa até o próximo comando
63
+ * do desenvolvedor.
64
+ * @see executarUltimoEscopo
65
+ */
66
+ export declare function instrucaoContinuarInterpretacao(interpretador: InterpretadorComDepuracaoInterface, escopo?: number): Promise<any>;
67
+ /**
68
+ * Interpreta apenas uma instrução a partir do ponto de parada ativo, conforme comando do depurador.
69
+ * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
70
+ * primeiro escopo, subindo até o último elemento executado do último escopo.
71
+ * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
72
+ */
73
+ export declare function instrucaoPasso(interpretador: InterpretadorComDepuracaoInterface, escopo?: number): Promise<any>;
74
+ export declare function abrirNovoBlocoEscopo(interpretador: InterpretadorComDepuracaoInterface, declaracoes: Declaracao[], ambiente?: EspacoVariaveis, tipoEscopo?: TipoEscopoExecucao): void;
75
+ /**
76
+ * No interpretador com depuração, este método é dividido em dois outros métodos privados:
77
+ * - `executarUmPassoNoEscopo`, que executa apenas uma instrução e nada mais;
78
+ * - `executarUltimoEscopoComandoContinuar`, que é a execução trivial de um escopo inteiro,
79
+ * ou com todas as instruções, ou até encontrar um ponto de parada.
80
+ * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
81
+ * imediatamente abaixo.
82
+ * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
83
+ * verificar o ponto de parada na primeira execução.
84
+ * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
85
+ * @returns O retorno da execução.
86
+ */
87
+ export declare function executarUltimoEscopo(interpretador: InterpretadorComDepuracaoInterface, manterAmbiente?: boolean, naoVerificarPrimeiraExecucao?: boolean): Promise<any>;
88
+ //# sourceMappingURL=comum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comum.d.ts","sourceRoot":"","sources":["../../../fontes/interpretador/depuracao/comum.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAQ,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAS,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,kCAAkC,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAyC,aAAa,EAAE,MAAM,eAAe,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAyGtF;;;;;;;GAOG;AACH,wBAAsB,OAAO,CACzB,aAAa,EAAE,kCAAkC,EACjD,SAAS,EAAE,SAAS,GAAG,UAAU,GAClC,OAAO,CAAC,GAAG,CAAC,CAUd;AAED,wBAAsB,yBAAyB,CAC3C,aAAa,EAAE,kCAAkC,EACjD,kCAAkC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,EACxE,SAAS,EAAE,OAAO,GACnB,OAAO,CAAC,GAAG,CAAC,CAYd;AAED,wBAAsB,yBAAyB,CAC3C,aAAa,EAAE,kCAAkC,EACjD,UAAU,EAAE,QAAQ,GACrB,OAAO,CAAC,GAAG,CAAC,CAoCd;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC1C,aAAa,EAAE,kCAAkC,EACjD,UAAU,EAAE,OAAO,GACpB,OAAO,CAAC,GAAG,CAAC,CAgBd;AAED,wBAAsB,qBAAqB,CACvC,aAAa,EAAE,kCAAkC,EACjD,UAAU,EAAE,IAAI,GACjB,OAAO,CAAC,GAAG,CAAC,CA8Dd;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC1C,aAAa,EAAE,kCAAkC,EACjD,iCAAiC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,CAAC,EACxE,UAAU,EAAE,OAAO,GACpB,OAAO,CAAC,aAAa,CAAC,CAoBxB;AAED;;;;;;;;;GASG;AACH,wBAAsB,aAAa,CAC/B,aAAa,EAAE,kCAAkC,EACjD,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,CAAC,EAAE,eAAe,GAC3B,OAAO,CAAC,GAAG,CAAC,CA0Dd;AA8ED;;;;;;;;;;GAUG;AACH,wBAAsB,oCAAoC,CACtD,aAAa,EAAE,kCAAkC,EACjD,cAAc,UAAQ,EACtB,4BAA4B,UAAQ,GACrC,OAAO,CAAC,GAAG,CAAC,CA+Dd;AAED;;;;;;;;GAQG;AACH,wBAAsB,+BAA+B,CACjD,aAAa,EAAE,kCAAkC,EACjD,MAAM,SAAI,GACX,OAAO,CAAC,GAAG,CAAC,CAWd;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAChC,aAAa,EAAE,kCAAkC,EACjD,MAAM,SAAI,gBAqBb;AAWD,wBAAgB,oBAAoB,CAChC,aAAa,EAAE,kCAAkC,EACjD,WAAW,EAAE,UAAU,EAAE,EACzB,QAAQ,CAAC,EAAE,eAAe,EAC1B,UAAU,GAAE,kBAA4B,QAY3C;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACtC,aAAa,EAAE,kCAAkC,EACjD,cAAc,UAAQ,EACtB,4BAA4B,UAAQ,GACrC,OAAO,CAAC,GAAG,CAAC,CAoBd"}
@@ -0,0 +1,509 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.avaliar = avaliar;
7
+ exports.visitarExpressaoDeChamada = visitarExpressaoDeChamada;
8
+ exports.visitarDeclaracaoEnquanto = visitarDeclaracaoEnquanto;
9
+ exports.visitarDeclaracaoEscreva = visitarDeclaracaoEscreva;
10
+ exports.visitarDeclaracaoPara = visitarDeclaracaoPara;
11
+ exports.visitarExpressaoRetornar = visitarExpressaoRetornar;
12
+ exports.executarBloco = executarBloco;
13
+ exports.executarUltimoEscopoComandoContinuar = executarUltimoEscopoComandoContinuar;
14
+ exports.instrucaoContinuarInterpretacao = instrucaoContinuarInterpretacao;
15
+ exports.instrucaoPasso = instrucaoPasso;
16
+ exports.abrirNovoBlocoEscopo = abrirNovoBlocoEscopo;
17
+ exports.executarUltimoEscopo = executarUltimoEscopo;
18
+ const lodash_1 = __importDefault(require("lodash"));
19
+ const construtos_1 = require("../../construtos");
20
+ const quebras_1 = require("../../quebras");
21
+ const espaco_variaveis_1 = require("../../espaco-variaveis");
22
+ const inferenciador_1 = require("../../inferenciador");
23
+ async function avaliarArgumentosEscreva(interpretador, argumentos) {
24
+ let formatoTexto = '';
25
+ for (const argumento of argumentos) {
26
+ const resultadoAvaliacao = await interpretador.avaliar(argumento);
27
+ let valor = (resultadoAvaliacao === null || resultadoAvaliacao === void 0 ? void 0 : resultadoAvaliacao.hasOwnProperty('valor'))
28
+ ? resultadoAvaliacao.valor
29
+ : resultadoAvaliacao;
30
+ formatoTexto += `${interpretador.paraTexto(valor)} `;
31
+ }
32
+ return formatoTexto.trimEnd();
33
+ }
34
+ /**
35
+ * Resolve problema de literais que tenham vírgulas, e confundem a resolução de chamadas.
36
+ * @param valor O valor do argumento, que pode ser um literal com virgulas.
37
+ * @returns Uma string com vírgulas escapadas.
38
+ */
39
+ function escaparVirgulas(valor) {
40
+ return String(valor).replace(/,/i, ',');
41
+ }
42
+ /**
43
+ * Gera um identificador para resolução de chamadas.
44
+ * Usado para não chamar funções repetidamente quando usando instruções
45
+ * de passo, como "próximo" ou "adentrar-escopo".
46
+ * @param expressao A expressão de chamada.
47
+ * @returns Uma `Promise` que resolve como `string`.
48
+ */
49
+ async function gerarIdResolucaoChamada(interpretador, expressao) {
50
+ const argumentosResolvidos = [];
51
+ if (expressao.argumentos && expressao.argumentos.length > 0) {
52
+ for (let argumento of expressao.argumentos) {
53
+ if (argumento instanceof construtos_1.Leia) {
54
+ argumentosResolvidos.push(`leia_${argumento.id}`);
55
+ }
56
+ else {
57
+ argumentosResolvidos.push(await interpretador.avaliar(argumento));
58
+ }
59
+ }
60
+ }
61
+ return argumentosResolvidos.reduce((acumulador, argumento) => (acumulador += `,${escaparVirgulas(argumento.hasOwnProperty('valor') ? argumento.valor : argumento)}`), expressao.id);
62
+ }
63
+ /**
64
+ * Obtém o valor de uma variável por nome.
65
+ * Em versões anteriores, o mecanismo de avaliação fazia toda a avaliação tradicional,
66
+ * passando por Lexador, Avaliador Sintático e Interpretador.
67
+ * Isso tem sua cota de problemas, sobretudo porque a avaliação insere e descarta escopos,
68
+ * entrando em condição de corrida com a interpretação com depuração.
69
+ * @param nome O nome da variável.
70
+ */
71
+ function obterVariavel(interpretador, nome) {
72
+ const valorOuVariavel = interpretador.pilhaEscoposExecucao.obterValorVariavel({
73
+ lexema: nome,
74
+ });
75
+ return valorOuVariavel.hasOwnProperty('valor')
76
+ ? valorOuVariavel
77
+ : {
78
+ valor: valorOuVariavel,
79
+ tipo: (0, inferenciador_1.inferirTipoVariavel)(valorOuVariavel),
80
+ };
81
+ }
82
+ /**
83
+ * Para fins de depuração, verifica se há ponto de parada no mesmo pragma da declaração.
84
+ * @param declaracao A declaração a ser executada.
85
+ * @returns `true` quando execução deve parar. `false` caso contrário.
86
+ */
87
+ function verificarPontoParada(interpretador, declaracao) {
88
+ const buscaPontoParada = interpretador.pontosParada.filter((p) => p.hashArquivo === declaracao.hashArquivo && p.linha === declaracao.linha);
89
+ if (buscaPontoParada.length > 0) {
90
+ console.log(`Ponto de parada encontrado. Linha: ${declaracao.linha}.`);
91
+ return true;
92
+ }
93
+ return false;
94
+ }
95
+ /**
96
+ * Quando um construto ou declaração possui id, significa que o interpretador
97
+ * deve resolver a avaliação e guardar seu valor até o final do escopo.
98
+ * Isso serve para quando a linguagem está em modo de depuração, e o contexto
99
+ * da execução deixa de existir com um ponto de parada, por exemplo.
100
+ * @param expressao A expressão a ser avaliada.
101
+ * @returns O resultado da avaliação.
102
+ */
103
+ async function avaliar(interpretador, expressao) {
104
+ if (expressao.hasOwnProperty('id')) {
105
+ const escopoAtual = interpretador.pilhaEscoposExecucao.topoDaPilha();
106
+ const idChamadaComArgumentos = await gerarIdResolucaoChamada(interpretador, expressao);
107
+ if (escopoAtual.ambiente.resolucoesChamadas.hasOwnProperty(idChamadaComArgumentos)) {
108
+ return escopoAtual.ambiente.resolucoesChamadas[idChamadaComArgumentos];
109
+ }
110
+ }
111
+ return await expressao.aceitar(interpretador);
112
+ }
113
+ async function visitarExpressaoDeChamada(interpretador, visitarExpressaoDeChamadaAncestral, expressao) {
114
+ const _idChamadaComArgumentos = await gerarIdResolucaoChamada(interpretador, expressao);
115
+ // Usado na abertura do bloco de escopo da chamada.
116
+ interpretador.idChamadaAtual = _idChamadaComArgumentos;
117
+ interpretador.executandoChamada = true;
118
+ interpretador.proximoEscopo = 'funcao';
119
+ const retorno = await visitarExpressaoDeChamadaAncestral(expressao);
120
+ interpretador.executandoChamada = false;
121
+ const escopoAtual = interpretador.pilhaEscoposExecucao.topoDaPilha();
122
+ escopoAtual.ambiente.resolucoesChamadas[_idChamadaComArgumentos] = retorno;
123
+ return retorno;
124
+ }
125
+ async function visitarDeclaracaoEnquanto(interpretador, declaracao) {
126
+ const escopoAtual = interpretador.pilhaEscoposExecucao.topoDaPilha();
127
+ switch (interpretador.comando) {
128
+ case 'proximo':
129
+ if (interpretador.eVerdadeiro(await interpretador.avaliar(declaracao.condicao))) {
130
+ escopoAtual.emLacoRepeticao = true;
131
+ return interpretador.executarBloco(declaracao.corpo.declaracoes);
132
+ }
133
+ escopoAtual.emLacoRepeticao = false;
134
+ return null;
135
+ default:
136
+ let retornoExecucao;
137
+ while (!(retornoExecucao instanceof quebras_1.Quebra) &&
138
+ !interpretador.pontoDeParadaAtivo &&
139
+ interpretador.eVerdadeiro(await interpretador.avaliar(declaracao.condicao))) {
140
+ escopoAtual.emLacoRepeticao = true;
141
+ try {
142
+ retornoExecucao = await interpretador.executar(declaracao.corpo);
143
+ if (retornoExecucao instanceof quebras_1.SustarQuebra) {
144
+ return null;
145
+ }
146
+ if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
147
+ retornoExecucao = null;
148
+ }
149
+ }
150
+ catch (erro) {
151
+ return Promise.reject(erro);
152
+ }
153
+ }
154
+ escopoAtual.emLacoRepeticao = false;
155
+ return retornoExecucao;
156
+ }
157
+ }
158
+ /**
159
+ * Execução de uma escrita na saída configurada, que pode ser `console` (padrão) ou
160
+ * alguma função para escrever numa página Web.
161
+ * Se ponto de parada foi ativado durante a avaliação de argumentos, não escreve.
162
+ * @param declaracao A declaração.
163
+ * @returns Sempre nulo, por convenção de visita.
164
+ */
165
+ async function visitarDeclaracaoEscreva(interpretador, declaracao) {
166
+ try {
167
+ const formatoTexto = await avaliarArgumentosEscreva(interpretador, declaracao.argumentos);
168
+ if (interpretador.pontoDeParadaAtivo) {
169
+ return null;
170
+ }
171
+ interpretador.funcaoDeRetorno(formatoTexto);
172
+ return null;
173
+ }
174
+ catch (erro) {
175
+ interpretador.erros.push({
176
+ erroInterno: erro,
177
+ linha: declaracao.linha,
178
+ hashArquivo: declaracao.hashArquivo,
179
+ });
180
+ }
181
+ }
182
+ async function visitarDeclaracaoPara(interpretador, declaracao) {
183
+ // Aqui precisamos clonar a declaração porque modificamos
184
+ // algumas propriedades que indicam o estado da execução dela.
185
+ // Por exemplo, se chamamos uma função que tem dentro dela um bloco Para,
186
+ // cada execução do bloco precisa de uma inicialização diferente.
187
+ const cloneDeclaracao = lodash_1.default.cloneDeep(declaracao);
188
+ const corpoExecucao = cloneDeclaracao.corpo;
189
+ const declaracaoInicializador = Array.isArray(cloneDeclaracao.inicializador)
190
+ ? declaracao.inicializador[0]
191
+ : declaracao.inicializador;
192
+ if (declaracaoInicializador !== null) {
193
+ await interpretador.avaliar(declaracaoInicializador);
194
+ // O incremento vai ao final do bloco de escopo.
195
+ if (cloneDeclaracao.incrementar !== null) {
196
+ corpoExecucao.declaracoes.push(cloneDeclaracao.incrementar);
197
+ }
198
+ }
199
+ cloneDeclaracao.inicializada = true;
200
+ const escopoAtual = interpretador.pilhaEscoposExecucao.topoDaPilha();
201
+ switch (interpretador.comando) {
202
+ case 'proximo':
203
+ if (cloneDeclaracao.condicao !== null &&
204
+ interpretador.eVerdadeiro(await interpretador.avaliar(cloneDeclaracao.condicao))) {
205
+ escopoAtual.emLacoRepeticao = true;
206
+ const resultadoBloco = interpretador.executarBloco(corpoExecucao.declaracoes);
207
+ return resultadoBloco;
208
+ }
209
+ escopoAtual.emLacoRepeticao = false;
210
+ return null;
211
+ default:
212
+ let retornoExecucao;
213
+ while (!(retornoExecucao instanceof quebras_1.Quebra) && !interpretador.pontoDeParadaAtivo) {
214
+ if (cloneDeclaracao.condicao !== null &&
215
+ !interpretador.eVerdadeiro(await interpretador.avaliar(cloneDeclaracao.condicao))) {
216
+ break;
217
+ }
218
+ try {
219
+ retornoExecucao = await interpretador.executar(corpoExecucao);
220
+ if (retornoExecucao instanceof quebras_1.SustarQuebra) {
221
+ return null;
222
+ }
223
+ if (retornoExecucao instanceof quebras_1.ContinuarQuebra) {
224
+ retornoExecucao = null;
225
+ }
226
+ }
227
+ catch (erro) {
228
+ return Promise.reject(erro);
229
+ }
230
+ }
231
+ // escopoAtual.emLacoRepeticao = false;
232
+ return retornoExecucao;
233
+ }
234
+ }
235
+ /**
236
+ * Ao executar um retorno, manter o valor retornado no Interpretador para
237
+ * uso por linhas que foram executadas com o comando `próximo` do depurador.
238
+ * @param declaracao Uma declaracao Retorna
239
+ * @returns O resultado da execução da visita.
240
+ */
241
+ async function visitarExpressaoRetornar(interpretador, visitarExpressaoRetornarAncestral, declaracao) {
242
+ const retorno = await visitarExpressaoRetornarAncestral(declaracao);
243
+ // O escopo atual é marcado como finalizado, para notificar a
244
+ // instrução de que deve ser descartado.
245
+ const escopoAtual = interpretador.pilhaEscoposExecucao.topoDaPilha();
246
+ escopoAtual.finalizado = true;
247
+ // Acha o primeiro escopo de função.
248
+ const escopoFuncao = interpretador.pilhaEscoposExecucao.obterEscopoPorTipo('funcao');
249
+ if (escopoFuncao === undefined) {
250
+ return Promise.reject('retorna() chamado fora de execução de função.');
251
+ }
252
+ if (escopoFuncao.idChamada !== undefined) {
253
+ escopoAtual.ambiente.resolucoesChamadas[escopoFuncao.idChamada] =
254
+ retorno && retorno.hasOwnProperty('valor') ? retorno.valor : retorno;
255
+ }
256
+ return retorno;
257
+ }
258
+ /**
259
+ * Se bloco de execução já foi instanciado antes (por exemplo, quando há um ponto de parada e a
260
+ * execução do código é retomada pelo depurador), retoma a execução do bloco do ponto em que havia parado.
261
+ * Se bloco de execução ainda não foi instanciado, empilha declarações na pilha de escopos de execução,
262
+ * cria um novo ambiente e executa as declarações empilhadas.
263
+ * Se depurador comandou uma instrução 'adentrar-escopo', execução do bloco não ocorre, mas
264
+ * ponteiros de escopo e execução são atualizados.
265
+ * @param declaracoes Um vetor de declaracoes a ser executado.
266
+ * @param ambiente O ambiente de execução quando houver, como parâmetros, argumentos, etc.
267
+ */
268
+ async function executarBloco(interpretador, declaracoes, ambiente) {
269
+ // Se o escopo atual não é o último.
270
+ if (interpretador.escopoAtual < interpretador.pilhaEscoposExecucao.elementos() - 1) {
271
+ interpretador.escopoAtual++;
272
+ const proximoEscopo = interpretador.pilhaEscoposExecucao.naPosicao(interpretador.escopoAtual);
273
+ let retornoExecucao;
274
+ // Sempre executa a próxima instrução, mesmo que haja ponto de parada.
275
+ retornoExecucao = await interpretador.executar(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
276
+ proximoEscopo.declaracaoAtual++;
277
+ for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
278
+ proximoEscopo.declaracaoAtual < proximoEscopo.declaracoes.length; proximoEscopo.declaracaoAtual++) {
279
+ interpretador.pontoDeParadaAtivo = verificarPontoParada(interpretador, proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
280
+ if (interpretador.pontoDeParadaAtivo) {
281
+ interpretador.avisoPontoParadaAtivado();
282
+ break;
283
+ }
284
+ retornoExecucao = await interpretador.executar(proximoEscopo.declaracoes[proximoEscopo.declaracaoAtual]);
285
+ // Um ponto de parada ativo pode ter vindo de um escopo mais interno.
286
+ // Por isso verificamos outra parada aqui para evitar que
287
+ // `interpretador.declaracaoAtual` seja incrementado.
288
+ if (interpretador.pontoDeParadaAtivo) {
289
+ interpretador.avisoPontoParadaAtivado();
290
+ break;
291
+ }
292
+ }
293
+ interpretador.pilhaEscoposExecucao.removerUltimo();
294
+ interpretador.escopoAtual--;
295
+ return retornoExecucao;
296
+ }
297
+ else {
298
+ abrirNovoBlocoEscopo(interpretador, declaracoes, ambiente, interpretador.proximoEscopo || 'outro');
299
+ const ultimoEscopo = interpretador.pilhaEscoposExecucao.topoDaPilha();
300
+ if (interpretador.idChamadaAtual) {
301
+ ultimoEscopo.idChamada = interpretador.idChamadaAtual;
302
+ interpretador.idChamadaAtual = undefined;
303
+ }
304
+ interpretador.proximoEscopo = undefined;
305
+ if (interpretador.comando !== 'adentrarEscopo') {
306
+ return await executarUltimoEscopo(interpretador);
307
+ }
308
+ }
309
+ }
310
+ function descartarEscopoPorRetornoFuncao(interpretador) {
311
+ let ultimoEscopo = interpretador.pilhaEscoposExecucao.topoDaPilha();
312
+ while (ultimoEscopo.tipo !== 'funcao') {
313
+ interpretador.pilhaEscoposExecucao.removerUltimo();
314
+ const escopoAnterior = interpretador.pilhaEscoposExecucao.topoDaPilha();
315
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
316
+ interpretador.escopoAtual--;
317
+ ultimoEscopo = interpretador.pilhaEscoposExecucao.topoDaPilha();
318
+ }
319
+ interpretador.pilhaEscoposExecucao.removerUltimo();
320
+ const escopoAnterior = interpretador.pilhaEscoposExecucao.topoDaPilha();
321
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
322
+ interpretador.escopoAtual--;
323
+ }
324
+ function descartarTodosEscoposFinalizados(interpretador) {
325
+ let i = interpretador.pilhaEscoposExecucao.pilha.length - 1;
326
+ while (i > 0) {
327
+ let ultimoEscopo = interpretador.pilhaEscoposExecucao.topoDaPilha();
328
+ if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
329
+ ultimoEscopo.finalizado) {
330
+ interpretador.pilhaEscoposExecucao.removerUltimo();
331
+ const escopoAnterior = interpretador.pilhaEscoposExecucao.topoDaPilha();
332
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
333
+ interpretador.escopoAtual--;
334
+ }
335
+ else {
336
+ break;
337
+ }
338
+ i--;
339
+ }
340
+ }
341
+ async function executarUmPassoNoEscopo(interpretador) {
342
+ const ultimoEscopo = interpretador.pilhaEscoposExecucao.topoDaPilha();
343
+ let retornoExecucao;
344
+ if (interpretador.passos > 0) {
345
+ interpretador.passos--;
346
+ retornoExecucao = await interpretador.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
347
+ if (!interpretador.pontoDeParadaAtivo && !ultimoEscopo.emLacoRepeticao) {
348
+ ultimoEscopo.declaracaoAtual++;
349
+ }
350
+ if (ultimoEscopo.declaracaoAtual >= ultimoEscopo.declaracoes.length ||
351
+ ultimoEscopo.finalizado) {
352
+ if (retornoExecucao instanceof quebras_1.RetornoQuebra) {
353
+ descartarEscopoPorRetornoFuncao(interpretador);
354
+ }
355
+ else {
356
+ descartarTodosEscoposFinalizados(interpretador);
357
+ }
358
+ }
359
+ if (interpretador.pilhaEscoposExecucao.elementos() === 1) {
360
+ interpretador.finalizacaoDaExecucao();
361
+ }
362
+ }
363
+ return retornoExecucao;
364
+ }
365
+ /**
366
+ * Continua a interpretação parcial do último ponto em que parou.
367
+ * Pode ser tanto o começo da execução inteira, ou pós comando do depurador
368
+ * quando há um ponto de parada.
369
+ * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
370
+ * imediatamente abaixo.
371
+ * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
372
+ * verificar o ponto de parada na primeira execução.
373
+ * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
374
+ * @returns Um objeto de retorno, com erros encontrados se houverem.
375
+ */
376
+ async function executarUltimoEscopoComandoContinuar(interpretador, manterAmbiente = false, naoVerificarPrimeiraExecucao = false) {
377
+ const ultimoEscopo = interpretador.pilhaEscoposExecucao.topoDaPilha();
378
+ let retornoExecucao;
379
+ try {
380
+ for (; !(retornoExecucao instanceof quebras_1.Quebra) &&
381
+ ultimoEscopo.declaracaoAtual < ultimoEscopo.declaracoes.length; ultimoEscopo.declaracaoAtual++) {
382
+ if (naoVerificarPrimeiraExecucao) {
383
+ naoVerificarPrimeiraExecucao = false;
384
+ }
385
+ else {
386
+ interpretador.pontoDeParadaAtivo = verificarPontoParada(interpretador, ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
387
+ if (interpretador.pontoDeParadaAtivo) {
388
+ interpretador.avisoPontoParadaAtivado();
389
+ break;
390
+ }
391
+ }
392
+ retornoExecucao = await interpretador.executar(ultimoEscopo.declaracoes[ultimoEscopo.declaracaoAtual]);
393
+ // Um ponto de parada ativo pode ter vindo de um escopo mais interno.
394
+ // Por isso verificamos outra parada aqui para evitar que
395
+ // `interpretador.declaracaoAtual` seja incrementado.
396
+ if (interpretador.pontoDeParadaAtivo) {
397
+ interpretador.avisoPontoParadaAtivado();
398
+ break;
399
+ }
400
+ }
401
+ return retornoExecucao;
402
+ }
403
+ catch (erro) {
404
+ interpretador.erros.push(erro);
405
+ }
406
+ finally {
407
+ if (!interpretador.pontoDeParadaAtivo && interpretador.comando !== 'adentrarEscopo') {
408
+ interpretador.pilhaEscoposExecucao.removerUltimo();
409
+ const escopoAnterior = interpretador.pilhaEscoposExecucao.topoDaPilha();
410
+ escopoAnterior.ambiente.resolucoesChamadas = Object.assign(escopoAnterior.ambiente.resolucoesChamadas, ultimoEscopo.ambiente.resolucoesChamadas);
411
+ if (manterAmbiente) {
412
+ escopoAnterior.ambiente.valores = Object.assign(escopoAnterior.ambiente.valores, ultimoEscopo.ambiente.valores);
413
+ }
414
+ interpretador.escopoAtual--;
415
+ }
416
+ if (interpretador.pilhaEscoposExecucao.elementos() === 1) {
417
+ interpretador.finalizacaoDaExecucao();
418
+ }
419
+ }
420
+ }
421
+ /**
422
+ * Continua a interpretação, conforme comando do depurador.
423
+ * Quando um ponto de parada é ativado, a pilha de execução do TypeScript é perdida.
424
+ * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
425
+ * primeiro escopo, subindo até o último elemento executado do último escopo.
426
+ * Se entre escopos houver ponto de parada ativo, a execução é suspensa até o próximo comando
427
+ * do desenvolvedor.
428
+ * @see executarUltimoEscopo
429
+ */
430
+ async function instrucaoContinuarInterpretacao(interpretador, escopo = 1) {
431
+ let retornoExecucao;
432
+ if (escopo < interpretador.escopoAtual) {
433
+ retornoExecucao = await instrucaoContinuarInterpretacao(interpretador, escopo + 1);
434
+ }
435
+ if (interpretador.pontoDeParadaAtivo) {
436
+ return;
437
+ }
438
+ await executarUltimoEscopoComandoContinuar(interpretador, false, true);
439
+ }
440
+ /**
441
+ * Interpreta apenas uma instrução a partir do ponto de parada ativo, conforme comando do depurador.
442
+ * Esse método cria uma nova pilha de execução do lado do JS, começando do último elemento executado do
443
+ * primeiro escopo, subindo até o último elemento executado do último escopo.
444
+ * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
445
+ */
446
+ async function instrucaoPasso(interpretador, escopo = 1) {
447
+ interpretador.passos = 1;
448
+ const escopoVisitado = interpretador.pilhaEscoposExecucao.naPosicao(escopo);
449
+ if (escopo < interpretador.escopoAtual) {
450
+ await instrucaoPasso(interpretador, escopo + 1);
451
+ }
452
+ else {
453
+ if (escopoVisitado.declaracaoAtual >= escopoVisitado.declaracoes.length ||
454
+ escopoVisitado.finalizado) {
455
+ interpretador.pilhaEscoposExecucao.removerUltimo();
456
+ }
457
+ if (interpretador.pilhaEscoposExecucao.elementos() === 1) {
458
+ return interpretador.finalizacaoDaExecucao();
459
+ }
460
+ await executarUmPassoNoEscopo(interpretador);
461
+ }
462
+ }
463
+ /**
464
+ * Interpreta restante do bloco de execução em que o ponto de parada está, conforme comando do depurador.
465
+ * Se houver outros pontos de parada no mesmo escopo à frente da instrução atual, todos são ignorados.
466
+ * @param escopo Indica o escopo a ser visitado. Usado para construir uma pilha de chamadas do lado JS.
467
+ */
468
+ async function instrucaoProximoESair(interpretador) {
469
+ executarUltimoEscopoComandoContinuar(interpretador, false, true);
470
+ }
471
+ function abrirNovoBlocoEscopo(interpretador, declaracoes, ambiente, tipoEscopo = 'outro') {
472
+ const escopoExecucao = {
473
+ declaracoes: declaracoes,
474
+ declaracaoAtual: 0,
475
+ ambiente: ambiente || new espaco_variaveis_1.EspacoVariaveis(),
476
+ finalizado: false,
477
+ tipo: tipoEscopo,
478
+ emLacoRepeticao: false,
479
+ };
480
+ interpretador.pilhaEscoposExecucao.empilhar(escopoExecucao);
481
+ interpretador.escopoAtual++;
482
+ }
483
+ /**
484
+ * No interpretador com depuração, este método é dividido em dois outros métodos privados:
485
+ * - `executarUmPassoNoEscopo`, que executa apenas uma instrução e nada mais;
486
+ * - `executarUltimoEscopoComandoContinuar`, que é a execução trivial de um escopo inteiro,
487
+ * ou com todas as instruções, ou até encontrar um ponto de parada.
488
+ * @param manterAmbiente Se verdadeiro, junta elementos do último escopo com o escopo
489
+ * imediatamente abaixo.
490
+ * @param naoVerificarPrimeiraExecucao Booleano que pede ao Interpretador para não
491
+ * verificar o ponto de parada na primeira execução.
492
+ * Normalmente usado pelo Servidor de Depuração para continuar uma linha.
493
+ * @returns O retorno da execução.
494
+ */
495
+ async function executarUltimoEscopo(interpretador, manterAmbiente = false, naoVerificarPrimeiraExecucao = false) {
496
+ switch (interpretador.comando) {
497
+ case 'adentrarEscopo':
498
+ case 'proximo':
499
+ if (!interpretador.executandoChamada) {
500
+ return executarUmPassoNoEscopo(interpretador);
501
+ }
502
+ else {
503
+ return executarUltimoEscopoComandoContinuar(interpretador, manterAmbiente, naoVerificarPrimeiraExecucao);
504
+ }
505
+ default:
506
+ return executarUltimoEscopoComandoContinuar(interpretador, manterAmbiente, naoVerificarPrimeiraExecucao);
507
+ }
508
+ }
509
+ //# sourceMappingURL=comum.js.map