public ParsedFormula(FormTree tree, String formula) { this.formula = formula; valid = true; if (Strings.isNullOrEmpty(formula)) { errors.add(new FormulaError("The formula is empty.")); valid = false; } try { rootNode = FormulaParser.parse(formula); } catch (FormulaException e) { errors.add(new FormulaError(e.getSourceRange(), e.getMessage())); valid = false; } if(valid) { FormulaValidator validator = new FormulaValidator(tree); validator.validate(rootNode); valid = validator.isValid(); errors.addAll(validator.getErrors()); this.resultType = validator.getResultType(); this.references = validator.getReferences(); this.simpleReference = validator.isSimpleReference(); } }
private FieldType validateFunctionCall(FunctionCallNode call) { // If function calls are involved, this is no longer // a simple field reference this.simpleReference = false; List<FormulaNode> arguments = call.getArguments(); List<FieldType> argumentTypes = new ArrayList<>(); boolean validationFailed = false; for (FormulaNode formulaNode : arguments) { try { argumentTypes.add(validateExpr(formulaNode)); } catch (ValidationFailed e) { // Continue validating the other arguments. validationFailed = true; } } if(validationFailed) { throw new ValidationFailed(); } try { return call.getFunction().resolveResultType(argumentTypes); } catch (ArgumentException e) { errors.add(new FormulaError(arguments.get(e.getArgumentIndex()).getSourceRange(), e.getMessage())); throw new ValidationFailed(); } catch(FormulaException e) { errors.add(new FormulaError(call, e.getMessage())); throw new ValidationFailed(); } }
errors.add(new FormulaError(formulaNode, e.getMessage())); throw new ValidationFailed(); errors.add(new FormulaError(formulaNode, "Invalid field reference")); throw new ValidationFailed();