builder/stmts: use CallExpr wrapper in build_print_statement for isType/asType pattern (no behavior change)
This commit is contained in:
@ -1,6 +1,6 @@
|
|||||||
use super::phi::extract_assigned_var;
|
use super::phi::extract_assigned_var;
|
||||||
use super::{ConstValue, Effect, EffectMask, MirInstruction, ValueId};
|
use super::{ConstValue, Effect, EffectMask, MirInstruction, ValueId};
|
||||||
use crate::ast::ASTNode;
|
use crate::ast::{ASTNode, CallExpr};
|
||||||
use crate::mir::loop_builder::LoopBuilder;
|
use crate::mir::loop_builder::LoopBuilder;
|
||||||
use crate::mir::TypeOpKind;
|
use crate::mir::TypeOpKind;
|
||||||
|
|
||||||
@ -8,6 +8,32 @@ impl super::MirBuilder {
|
|||||||
// Print statement: env.console.log(value) with early TypeOp handling
|
// Print statement: env.console.log(value) with early TypeOp handling
|
||||||
pub(super) fn build_print_statement(&mut self, expression: ASTNode) -> Result<ValueId, String> {
|
pub(super) fn build_print_statement(&mut self, expression: ASTNode) -> Result<ValueId, String> {
|
||||||
super::utils::builder_debug_log("enter build_print_statement");
|
super::utils::builder_debug_log("enter build_print_statement");
|
||||||
|
// Prefer wrapper for simple function-call pattern (non-breaking refactor)
|
||||||
|
if let Ok(call) = CallExpr::try_from(expression.clone()) {
|
||||||
|
if (call.name == "isType" || call.name == "asType") && call.arguments.len() == 2 {
|
||||||
|
super::utils::builder_debug_log("pattern: print(FunctionCall isType|asType) [via wrapper]");
|
||||||
|
if let Some(type_name) = super::MirBuilder::extract_string_literal(&call.arguments[1]) {
|
||||||
|
super::utils::builder_debug_log(&format!("extract_string_literal OK: {}", type_name));
|
||||||
|
let val = self.build_expression(call.arguments[0].clone())?;
|
||||||
|
let ty = super::MirBuilder::parse_type_name_to_mir(&type_name);
|
||||||
|
let dst = self.value_gen.next();
|
||||||
|
let op = if call.name == "isType" { TypeOpKind::Check } else { TypeOpKind::Cast };
|
||||||
|
super::utils::builder_debug_log(&format!("emit TypeOp {:?} value={} dst= {}", op, val, dst));
|
||||||
|
self.emit_instruction(MirInstruction::TypeOp { dst, op, value: val, ty })?;
|
||||||
|
self.emit_instruction(MirInstruction::ExternCall {
|
||||||
|
dst: None,
|
||||||
|
iface_name: "env.console".to_string(),
|
||||||
|
method_name: "log".to_string(),
|
||||||
|
args: vec![dst],
|
||||||
|
effects: EffectMask::PURE.add(Effect::Io),
|
||||||
|
})?;
|
||||||
|
return Ok(dst);
|
||||||
|
} else {
|
||||||
|
super::utils::builder_debug_log("extract_string_literal FAIL [via wrapper]");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
match &expression {
|
match &expression {
|
||||||
// print(isType(val, "Type")) / print(asType(...))
|
// print(isType(val, "Type")) / print(asType(...))
|
||||||
ASTNode::FunctionCall {
|
ASTNode::FunctionCall {
|
||||||
|
|||||||
Reference in New Issue
Block a user