diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index d55b82dd..10f01caa 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -1574,7 +1574,12 @@ bool BfMethodMatcher::CheckMethod(BfTypeInstance* targetTypeInstance, BfTypeInst { BfTypedValue argTypedValue; if (argIdx == -1) - argTypedValue = mTarget; + { + if (mOrigTarget) + argTypedValue = mOrigTarget; + else + argTypedValue = mTarget; + } else argTypedValue = ResolveArgTypedValue(mArguments[argIdx], checkType, genericArgumentsSubstitute, origCheckType); if (!argTypedValue.IsUntypedValue()) @@ -7292,6 +7297,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp BfTypeInstance* curTypeInst = targetTypeInst; BfMethodMatcher methodMatcher(targetSrc, mModule, methodName, argValues.mResolvedArgs, methodGenericArguments); + methodMatcher.mOrigTarget = origTarget; methodMatcher.mTarget = target; methodMatcher.mCheckedKind = checkedKind; methodMatcher.mAllowImplicitThis = allowImplicitThis; @@ -19674,6 +19680,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod bool isComparison = (binaryOp >= BfBinaryOp_Equality) && (binaryOp <= BfBinaryOp_LessThanOrEqual); BfBinaryOp oppositeBinaryOp = BfGetOppositeBinaryOp(findBinaryOp); + BfBinaryOp flippedBinaryOp = BfGetFlippedBinaryOp(findBinaryOp); + BfBinaryOp flippedOppositeBinaryOp = BfGetFlippedBinaryOp(oppositeBinaryOp); for (int pass = 0; pass < 2; pass++) { @@ -19898,7 +19906,15 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod if ((mModule->CanCast(args[0].mTypedValue, opConstraint.mLeftType)) && (mModule->CanCast(args[1].mTypedValue, opConstraint.mRightType))) { - works = true; + works = true; + } + } + if ((flippedBinaryOp != BfBinaryOp_None) && (opConstraint.mBinaryOp == flippedBinaryOp)) + { + if ((mModule->CanCast(args[1].mTypedValue, opConstraint.mLeftType)) && + (mModule->CanCast(args[0].mTypedValue, opConstraint.mRightType))) + { + works = true; } } @@ -19911,6 +19927,14 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod works = true; } } + if ((flippedOppositeBinaryOp != BfBinaryOp_None) && (opConstraint.mBinaryOp == flippedOppositeBinaryOp)) + { + if ((mModule->CanCast(args[1].mTypedValue, opConstraint.mRightType)) && + (mModule->CanCast(args[0].mTypedValue, opConstraint.mLeftType))) + { + works = true; + } + } if ((isComparison) && (opConstraint.mBinaryOp == BfBinaryOp_Compare)) { diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index 5b0402aa..991fb00b 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -154,6 +154,7 @@ public: public: BfAstNode* mTargetSrc; BfTypedValue mTarget; + BfTypedValue mOrigTarget; BfModule* mModule; BfTypeDef* mActiveTypeDef; String mMethodName; diff --git a/IDEHelper/Tests/src/ExtensionMethods.bf b/IDEHelper/Tests/src/ExtensionMethods.bf index 3c12484e..f2e43b5f 100644 --- a/IDEHelper/Tests/src/ExtensionMethods.bf +++ b/IDEHelper/Tests/src/ExtensionMethods.bf @@ -42,11 +42,26 @@ namespace Tests iList.Add(100); Test.Assert(iList.Total() == 123); + + float a = 1.2f; + float b = 2.3f; + Test.Assert(a.CompareIt(b) < 0); } } static { + public static int CompareIt(this T self, T other) + where bool: operator T < T + { + if(self < other) + return -1; + else if(self > other) + return 1; + + return 0; + } + public static T Total(this List list) where T : operator T + T { T total = default;