Browse Source

Implement better error messages in the input function and recursive calls

Lucas de Souza 5 years ago
parent
commit
3e37f91cc5

+ 4 - 3
i18n/pt/error.json

@@ -88,8 +88,8 @@
   "test_case_failed_exception": "<div class='assessment-div-detail' onClick='ivprogCore.openAssessmentDetail(event)' data-page=\"$2\"> <span>Caso de teste $0 falhou</span>: $1",
   "test_case_exception": "Ocorreu uma exceção no caso de teste $0: $1",
   "invalid_type_conversion": "O valor $0 não pode ser convertido para o tipo $1",
-  "invalid_read_type":"A entrada \"$0\" não é do tipo $1, que é o tipo da variável <span class='ivprog-error-varname'>$2</span>.",
-  "invalid_read_type_array":"A entrada \"$0\" não é do tipo $1, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$2</span> que é um $3.",
+  "invalid_read_type":"Erro na linha $0: A entrada \"$1\" não é do tipo $2, que é o tipo da variável <span class='ivprog-error-varname'>$3</span>.",
+  "invalid_read_type_array":"Erro na linha $0: A entrada \"$1\" não é do tipo $2, que é o tipo aceito pela variável <span class='ivprog-error-varname'>$3</span> que é um $4.",
   "inform_valid_identifier": "Informe um nome válido! O nome não pode ser uma palavra reservadoa e deve começar com letras e conter apenas letras, números e _",
   "inform_valid_global_duplicated": "Já existe uma variável global com o nome <span class='ivprog-error-varname'>$0</span>, você precisa de nomes distintos.",
   "inform_valid_variable_duplicated" : "Já existe uma variável com o nome <span class='ivprog-error-varname'>$0</span> na função <span class='ivprog-error-varname'>$1</span>, você precisa de nomes distintos.",
@@ -127,5 +127,6 @@
   "undefined_tanget_value": "Erro na linha $0: A tangente de $1° não é indefinida.",
   "negative_log_value": "Erro na linha $0: Não se pode calcular o log de um valor negativo.",
   "invalid_string_index": "Erro na linha $0 durante a execução da função $1: $2 é um índice inválido para a cadeia de texto $3. Os valores válidos vão de 0 à $4",
-  "negative_sqrt_value": "Erro na linha $0: Não é permitido calcular a raiz quadrada de um número negativo."
+  "negative_sqrt_value": "Erro na linha $0: Não é permitido calcular a raiz quadrada de um número negativo.",
+  "exceeded_recursive_calls": "Erro na execução da linha $0: Número de chamadas recursivas execedeu o limite máximo definido!"
 }

+ 8 - 4
js/processor/error/processorErrorFactory.js

@@ -390,12 +390,12 @@ export const ProcessorErrorFactory  = Object.freeze({
     const context = [value, LocalizedStrings.translateType(type, dim)];
     return createRuntimeError("invalid_type_conversion", context);
   },
-  invalid_read_type: (exp, type, dim, name) => {
-    const context = [exp, LocalizedStrings.translateType(type, dim), name];
+  invalid_read_type: (exp, type, dim, name, source_info) => {
+    const context = [source_info.line, exp, LocalizedStrings.translateType(type, dim), name];
     return createRuntimeError("invalid_read_type", context)
   },
-  invalid_read_type_array: (exp, typePos, dimPos, name, typeArray, dimArray) => {
-    const context = [exp, LocalizedStrings.translateType(typePos, dimPos), name,LocalizedStrings.translateType(typeArray, dimArray)];
+  invalid_read_type_array: (exp, typePos, dimPos, name, typeArray, dimArray, sourceInfo) => {
+    const context = [sourceInfo.line, exp, LocalizedStrings.translateType(typePos, dimPos), name,LocalizedStrings.translateType(typeArray, dimArray)];
     return createRuntimeError("invalid_read_type_array", context)
   },
   invalid_const_ref_full: (fun_name, exp, sourceInfo)=> {
@@ -504,5 +504,9 @@ export const ProcessorErrorFactory  = Object.freeze({
   },
   negative_sqrt_value: (source_info) => {
     return createRuntimeError("negative_sqrt_value",[source_info.line]);
+  },
+  exceeded_recursive_calls: (source_info) => {
+    const context = [source_info.line];
+    return createRuntimeError("exceeded_recursive_calls", context);
   }
 });

+ 2 - 2
js/processor/ivprogProcessor.js

@@ -268,7 +268,7 @@ export class IVProgProcessor {
       func = this.findFunction(cmd.id);
     }
     if(this.function_call_stack.length >= Config.max_call_stack) {
-      return Promise.reject(new Error("Número de chamadas recursivas execedeu o limite máximo definido!"));
+      return Promise.reject(ProcessorErrorFactory.exceeded_recursive_calls(cmd.sourceInfo));
     }
     this.function_call_stack.push(cmd.sourceInfo);
     return this.runFunction(func, cmd.actualParameters, store)
@@ -721,7 +721,7 @@ export class IVProgProcessor {
       return Promise.reject(ProcessorErrorFactory.void_in_expression_full(exp.id, exp.sourceInfo));
     }
     if(this.function_call_stack.length >= Config.max_call_stack) {
-      return Promise.reject(new Error("Número de chamadas recursivas execedeu o limite máximo definido!"));
+      return Promise.reject(ProcessorErrorFactory.exceeded_recursive_calls(exp.sourceInfo));
     }
     this.function_call_stack.push(exp.sourceInfo);
     const $newStore = this.runFunction(func, exp.actualParameters, store);

+ 2 - 3
js/processor/lib/io.js

@@ -47,14 +47,13 @@ export function createInputFun () {
       } catch (_) {
         const stringInfo = typeToConvert.stringInfo()[0]
         const realObject = store.getStoreObject("p1");
-        console.log(realObject);
         if (realObject.getReferenceDimension() > 0) {
           const arrayInfo = realObject.type.stringInfo()[0];
           const dim = realObject.getReferenceDimension();
-          const error = ProcessorErrorFactory.invalid_read_type_array(text, stringInfo.type, stringInfo.dim, realObject.getRefObj(), arrayInfo.type, dim);
+          const error = ProcessorErrorFactory.invalid_read_type_array(text, stringInfo.type, stringInfo.dim, realObject.getRefObj(), arrayInfo.type, dim, this.function_call_stack.pop());
           return Promise.reject(error);
         }
-        const error = ProcessorErrorFactory.invalid_read_type(text, stringInfo.type, stringInfo.dim, realObject.getRefObj());
+        const error = ProcessorErrorFactory.invalid_read_type(text, stringInfo.type, stringInfo.dim, realObject.getRefObj(), this.function_call_stack.pop());
         return Promise.reject(error);
       }
       this.loopTimers.splice(0, this.loopTimers.length)