diff --git a/IDEHelper/Compiler/BfDeferEvalChecker.cpp b/IDEHelper/Compiler/BfDeferEvalChecker.cpp index b7975fe5..8331482e 100644 --- a/IDEHelper/Compiler/BfDeferEvalChecker.cpp +++ b/IDEHelper/Compiler/BfDeferEvalChecker.cpp @@ -6,7 +6,7 @@ BfDeferEvalChecker::BfDeferEvalChecker() { mNeedsDeferEval = false; mDeferLiterals = true; - mDeferLambdaBind = true; + mDeferDelegateBind = true; } void BfDeferEvalChecker::Visit(BfAstNode* attribExpr) @@ -87,7 +87,13 @@ void BfDeferEvalChecker::Visit(BfInvocationExpression* invocationExpr) void BfDeferEvalChecker::Visit(BfLambdaBindExpression* lambdaBindExpr) { - if (mDeferLambdaBind) + if (mDeferDelegateBind) + mNeedsDeferEval = true; +} + +void BfDeferEvalChecker::Visit(BfDelegateBindExpression* delegateBindExpr) +{ + if (mDeferDelegateBind) mNeedsDeferEval = true; } diff --git a/IDEHelper/Compiler/BfDeferEvalChecker.h b/IDEHelper/Compiler/BfDeferEvalChecker.h index 2db12ea9..900294c3 100644 --- a/IDEHelper/Compiler/BfDeferEvalChecker.h +++ b/IDEHelper/Compiler/BfDeferEvalChecker.h @@ -9,7 +9,7 @@ class BfDeferEvalChecker : public BfStructuralVisitor { public: bool mNeedsDeferEval; - bool mDeferLambdaBind; + bool mDeferDelegateBind; bool mDeferLiterals; public: @@ -24,6 +24,7 @@ public: virtual void Visit(BfMemberReferenceExpression* memberRefExpr) override; virtual void Visit(BfInvocationExpression* invocationExpr) override; virtual void Visit(BfLambdaBindExpression* lambdaBindExpr) override; + virtual void Visit(BfDelegateBindExpression* delegateBindExpr) override; virtual void Visit(BfConditionalExpression* condExpr) override; virtual void Visit(BfUnaryOperatorExpression* unaryOpExpr) override; virtual void Visit(BfObjectCreateExpression* objCreateExpr) override; diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index d620625a..e67e852e 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5008,7 +5008,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr if (argExpr != NULL) { BfDeferEvalChecker deferEvalChecker; - deferEvalChecker.mDeferLambdaBind = false; + deferEvalChecker.mDeferDelegateBind = false; argExpr->Accept(&deferEvalChecker); deferParamEval = deferEvalChecker.mNeedsDeferEval; } @@ -21203,7 +21203,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod if ((binaryOp == BfBinaryOp_LeftShift) || (binaryOp == BfBinaryOp_RightShift)) expectedType = mModule->GetPrimitiveType(BfTypeCode_IntPtr); rightValue = mModule->CreateValueFromExpression(BfNodeDynCast(rightExpression), expectedType, (BfEvalExprFlags)(BfEvalExprFlags_AllowSplat | BfEvalExprFlags_NoCast)); - PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, (BfBinOpFlags)(flags & ~BfBinOpFlag_DeferRight), leftValue, rightValue); + if (rightValue) + PerformBinaryOperation(leftExpression, rightExpression, binaryOp, opToken, (BfBinOpFlags)(flags & ~BfBinOpFlag_DeferRight), leftValue, rightValue); return; } diff --git a/IDEHelper/Tests/src/Delegates.bf b/IDEHelper/Tests/src/Delegates.bf index bbd1bc4f..d191e847 100644 --- a/IDEHelper/Tests/src/Delegates.bf +++ b/IDEHelper/Tests/src/Delegates.bf @@ -158,8 +158,15 @@ namespace Tests ClassB.DelegateB dlg2 = scope (val) => val + 123; Test.Assert(dlg2(3) == 126); + void LocalEventHandler(Object sender, EventArgs e) + { + + } + Event e = .(); - e += scope (sender, e) => {}; + e += new (sender, e) => {}; + e += new => LocalEventHandler; + e.Dispose(); } public static void Modify(ref int a, ref Splattable b)