fold method
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;
}