public override IPStmt VisitRaiseStmt(PParser.RaiseStmtContext context) { if (!method.Signature.ReturnType.IsSameTypeAs(PrimitiveType.Null)) { throw handler.RaiseEventInNonVoidFunction(context); } IPExpr evtExpr = exprVisitor.Visit(context.expr()); if (IsDefinitelyNullEvent(evtExpr)) { throw handler.EmittedNullEvent(evtExpr); } if (!PrimitiveType.Event.IsAssignableFrom(evtExpr.Type)) { throw handler.TypeMismatch(context.expr(), evtExpr.Type, PrimitiveType.Event); } method.CanRaiseEvent = true; IPExpr[] args = TypeCheckingUtils.VisitRvalueList(context.rvalueList(), exprVisitor).ToArray(); if (evtExpr is EventRefExpr eventRef) { TypeCheckingUtils.ValidatePayloadTypes(handler, context, eventRef.Value.PayloadType, args); } return(new RaiseStmt(context, evtExpr, args)); }