fold method

HTConstantValue? fold(
  1. ASTNode node,
  2. HTOptimizationResult optimization
)

Implementation

HTConstantValue? fold(ASTNode node, HTOptimizationResult optimization) {
  if (node is ASTLiteralNull) {
    return const HTConstantValue(null);
  }
  if (node is ASTLiteralBoolean ||
      node is ASTLiteralInteger ||
      node is ASTLiteralFloat) {
    return HTConstantValue(node.value as Object);
  }
  if (node is ASTLiteralString) {
    return HTConstantValue(_escape(node.value));
  }
  if (node is ASTStringInterpolation) {
    return _foldInterpolation(node, optimization);
  }
  if (node is GroupExpr) {
    return fold(node.inner, optimization);
  }
  if (node is IdentifierExpr) {
    return _foldIdentifier(node, optimization);
  }
  if (node is UnaryPrefixExpr) {
    return _foldUnary(node, optimization);
  }
  if (node is BinaryExpr) {
    return _foldBinary(node, optimization);
  }
  if (node is TernaryExpr) {
    final condition = fold(node.condition, optimization);
    if (condition?.value is! bool) return null;
    return condition!.value as bool
        ? fold(node.thenBranch, optimization)
        : fold(node.elseBranch, optimization);
  }
  return null;
}