private FieldType validateExpr(FormulaNode formulaNode) { if(formulaNode instanceof ConstantNode) { return ((ConstantNode) formulaNode).getType(); } else if(formulaNode instanceof GroupNode) { return validateExpr(((GroupNode) formulaNode).getExpr()); } else if(formulaNode instanceof SymbolNode) { return validateReference(formulaNode); } else if(formulaNode instanceof CompoundExpr) { return validateReference(formulaNode); } else if(formulaNode instanceof FunctionCallNode) { return validateFunctionCall((FunctionCallNode) formulaNode); } else { throw new UnsupportedOperationException("type: " + formulaNode.getClass().getSimpleName()); } }
private String resolveSymbol(ConstantNode constantNode) throws XSymbolException { String resolved; if (constantNode.getType() instanceof EnumType) { EnumValue enumValue = (EnumValue) constantNode.getValue(); resolved = symbolHandler.resolveSymbol(enumValue.getValueId().asString()); } else { resolved = symbolHandler.resolveSymbol(constantNode.getValue().toString()); } return resolved; } }
private static FieldValue parseEnum(FormulaNode argument) { if(argument instanceof SymbolNode) { return new EnumValue(ResourceId.valueOf(((SymbolNode) argument).getName())); } else if(argument instanceof ConstantNode) { if(((ConstantNode) argument).getType() instanceof EnumType) { return ((ConstantNode) argument).getValue(); } else { return new EnumValue(ResourceId.valueOf(((ConstantNode) argument).asExpression())); } } throw new IllegalArgumentException("Expected symbol: " + argument); } }
private List<ResourceId> getFieldIds(FormulaNode formulaNode) { List<ResourceId> fieldIds = new ArrayList<>(); if (formulaNode instanceof FunctionCallNode) { FunctionCallNode functionCall = (FunctionCallNode) formulaNode; for(FormulaNode arg : functionCall.getArguments()) { fieldIds.addAll(getFieldIds(arg)); } } else if (formulaNode instanceof SymbolNode) { SymbolNode symbolNode = (SymbolNode) formulaNode; fieldIds.add(ResourceId.valueOf(symbolNode.getName())); } else if (formulaNode instanceof ConstantNode) { ConstantNode constantNode = (ConstantNode) formulaNode; if (constantNode.getType() instanceof EnumType) { fieldIds.add(ResourceId.valueOf(constantNode.toString())); } } else if (formulaNode instanceof CompoundExpr) { CompoundExpr compoundExpr = (CompoundExpr) formulaNode; fieldIds.addAll(getFieldIds(compoundExpr.getValue())); fieldIds.addAll(getFieldIds(compoundExpr.getField())); } else if (formulaNode instanceof GroupNode) { GroupNode groupNode = (GroupNode) formulaNode; fieldIds.addAll(getFieldIds(groupNode.getExpr())); } return fieldIds; }