neo_solidity/ir/statements/
events.rs

1fn lower_emit(expr: &Expression, ctx: &mut LoweringContext, instructions: &mut Vec<Instruction>) {
2    if let Expression::FunctionCall(_, func, args) = expr {
3        if let Expression::Variable(identifier) = func.as_ref() {
4            let original_len = instructions.len();
5            instructions.push(Instruction::PushLiteral(LiteralValue::String(
6                identifier.name.as_bytes().to_vec(),
7            )));
8            let mut success = true;
9            for arg in args {
10                if !lower_expression(arg, ctx, instructions) {
11                    success = false;
12                }
13            }
14
15            if success {
16                if let Some(index) = ctx.event_index_map.get(&identifier.name) {
17                    instructions.push(Instruction::EmitEvent {
18                        event_index: *index,
19                        arg_count: args.len(),
20                    });
21                } else {
22                    instructions.push(Instruction::EmitEventByName {
23                        name: identifier.name.clone(),
24                        arg_count: args.len(),
25                    });
26                }
27                return;
28            }
29
30            instructions.truncate(original_len);
31        }
32    }
33}