diff --git a/IDEHelper/Compiler/BfAst.cpp b/IDEHelper/Compiler/BfAst.cpp index c84fbf37..36e4af9a 100644 --- a/IDEHelper/Compiler/BfAst.cpp +++ b/IDEHelper/Compiler/BfAst.cpp @@ -301,11 +301,6 @@ void BfStructuralVisitor::Visit(BfParameterDeclaration* paramDecl) Visit(paramDecl->ToBase()); } -void BfStructuralVisitor::Visit(BfParamsExpression* paramsExpr) -{ - Visit(paramsExpr->ToBase()); -} - void BfStructuralVisitor::Visit(BfTypeAttrExpression* typeAttrExpr) { Visit(typeAttrExpr->ToBase()); diff --git a/IDEHelper/Compiler/BfAst.h b/IDEHelper/Compiler/BfAst.h index 1276ba63..49863b3f 100644 --- a/IDEHelper/Compiler/BfAst.h +++ b/IDEHelper/Compiler/BfAst.h @@ -268,7 +268,6 @@ class BfOperatorDeclaration; class BfFieldDeclaration; class BfEnumCaseDeclaration; class BfParameterDeclaration; -class BfParamsExpression; class BfForStatement; class BfUsingStatement; class BfDoStatement; @@ -454,8 +453,7 @@ public: virtual void Visit(BfNullableTypeRef* typeRef); virtual void Visit(BfVariableDeclaration* varDecl); virtual void Visit(BfLocalMethodDeclaration* methodDecl); - virtual void Visit(BfParameterDeclaration* paramDecl); - virtual void Visit(BfParamsExpression* paramsExpr); + virtual void Visit(BfParameterDeclaration* paramDecl); virtual void Visit(BfTypeAttrExpression* typeAttrExpr); virtual void Visit(BfTypeOfExpression* typeOfExpr); virtual void Visit(BfSizeOfExpression* sizeOfExpr); @@ -2472,14 +2470,6 @@ public: BfTokenNode* mRefToken; }; BF_AST_DECL(BfRefTypeRef, BfElementedTypeRef); -class BfParamsExpression : public BfExpression -{ -public: - BF_AST_TYPE(BfParamsExpression, BfExpression); - - BfTokenNode* mParamsToken; -}; BF_AST_DECL(BfParamsExpression, BfExpression); - class BfTypeAttrExpression : public BfExpression { public: diff --git a/IDEHelper/Compiler/BfElementVisitor.cpp b/IDEHelper/Compiler/BfElementVisitor.cpp index b3d5ee51..a73ba9a8 100644 --- a/IDEHelper/Compiler/BfElementVisitor.cpp +++ b/IDEHelper/Compiler/BfElementVisitor.cpp @@ -446,13 +446,6 @@ void BfElementVisitor::Visit(BfParameterDeclaration* paramDecl) VisitChild(paramDecl->mModToken); // 'Params' } -void BfElementVisitor::Visit(BfParamsExpression* paramsExpr) -{ - Visit(paramsExpr->ToBase()); - - VisitChild(paramsExpr->mParamsToken); -} - void BfElementVisitor::Visit(BfTypeAttrExpression* typeAttrExpr) { Visit(typeAttrExpr->ToBase()); diff --git a/IDEHelper/Compiler/BfElementVisitor.h b/IDEHelper/Compiler/BfElementVisitor.h index 4a92faf3..da9a042c 100644 --- a/IDEHelper/Compiler/BfElementVisitor.h +++ b/IDEHelper/Compiler/BfElementVisitor.h @@ -64,8 +64,7 @@ public: virtual void Visit(BfNullableTypeRef* typeRef); virtual void Visit(BfVariableDeclaration* varDecl); virtual void Visit(BfLocalMethodDeclaration* methodDecl); - virtual void Visit(BfParameterDeclaration* paramDecl); - virtual void Visit(BfParamsExpression* paramsExpr); + virtual void Visit(BfParameterDeclaration* paramDecl); virtual void Visit(BfTypeAttrExpression* typeAttrExpr); virtual void Visit(BfDefaultExpression* defaultExpr); virtual void Visit(BfUninitializedExpression* uninitializedExpr); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index d10f1d22..9549825d 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4134,12 +4134,10 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr { BfResolvedArg compositeResolvedArg; auto compositeLocalVar = methodState->mLocals[localVar->mLocalVarIdx + compositeIdx + 1]; - auto argValue = exprEvaluator.LoadLocal(compositeLocalVar); + auto argValue = exprEvaluator.LoadLocal(compositeLocalVar, true); if (argValue) { - if (argValue.mType->IsRef()) - argValue.mKind = BfTypedValueKind_Value; - else if (!argValue.mType->IsStruct()) + if (!argValue.mType->IsStruct()) argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference); } resolvedArg.mTypedValue = argValue; @@ -8052,11 +8050,6 @@ void BfExprEvaluator::Visit(BfCollectionInitializerExpression* arrayInitExpr) mModule->Fail("Collection initializer not usable here", arrayInitExpr); } -void BfExprEvaluator::Visit(BfParamsExpression* paramsExpr) -{ - mModule->Fail("Params expression is only usable as a call parameter", paramsExpr); -} - void BfExprEvaluator::Visit(BfTypeOfExpression* typeOfExpr) { auto typeType = mModule->ResolveTypeDef(mModule->mCompiler->mTypeTypeDef); diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index 1c154d22..400e96fc 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -419,8 +419,7 @@ public: virtual void Visit(BfBaseExpression* baseExpr) override; virtual void Visit(BfMixinExpression* mixinExpr) override; virtual void Visit(BfSizedArrayCreateExpression* createExpr) override; - virtual void Visit(BfCollectionInitializerExpression* initExpr) override; - virtual void Visit(BfParamsExpression* paramsExpr) override; + virtual void Visit(BfCollectionInitializerExpression* initExpr) override; virtual void Visit(BfTypeOfExpression* typeOfExpr) override; virtual void Visit(BfSizeOfExpression* sizeOfExpr) override; virtual void Visit(BfAlignOfExpression* alignOfExpr) override; diff --git a/IDEHelper/Compiler/BfPrinter.cpp b/IDEHelper/Compiler/BfPrinter.cpp index a9eecabe..798b52c9 100644 --- a/IDEHelper/Compiler/BfPrinter.cpp +++ b/IDEHelper/Compiler/BfPrinter.cpp @@ -1462,13 +1462,6 @@ void BfPrinter::Visit(BfParameterDeclaration* paramDecl) Visit(paramDecl->ToBase()); } -void BfPrinter::Visit(BfParamsExpression* paramsExpr) -{ - Visit(paramsExpr->ToBase()); - - VisitChild(paramsExpr->mParamsToken); -} - void BfPrinter::Visit(BfTypeOfExpression* typeOfExpr) { Visit(typeOfExpr->ToBase()); diff --git a/IDEHelper/Compiler/BfPrinter.h b/IDEHelper/Compiler/BfPrinter.h index 3c24d36e..89955378 100644 --- a/IDEHelper/Compiler/BfPrinter.h +++ b/IDEHelper/Compiler/BfPrinter.h @@ -146,8 +146,7 @@ public: virtual void Visit(BfPointerTypeRef* typeRef) override; virtual void Visit(BfNullableTypeRef* typeRef) override; virtual void Visit(BfVariableDeclaration* varDecl) override; - virtual void Visit(BfParameterDeclaration* paramDecl) override; - virtual void Visit(BfParamsExpression* paramsExpr) override; + virtual void Visit(BfParameterDeclaration* paramDecl) override; virtual void Visit(BfTypeOfExpression* typeOfExpr) override; virtual void Visit(BfSizeOfExpression* sizeOfExpr) override; virtual void Visit(BfDefaultExpression* defaultExpr) override; diff --git a/IDEHelper/Tests/src/Delegates.bf b/IDEHelper/Tests/src/Delegates.bf index c2233c18..cbdec401 100644 --- a/IDEHelper/Tests/src/Delegates.bf +++ b/IDEHelper/Tests/src/Delegates.bf @@ -140,6 +140,29 @@ namespace Tests ca.TestLambda(); } + public static void Modify(ref int a, ref Splattable b) + { + a += 1000; + b.mA += 2000; + b.mB += 3000; + } + + [Test] + public static void TestRefs() + { + delegate void(ref int a, ref Splattable b) dlg = scope => Modify; + + int a = 123; + Splattable splat = .(); + splat.mA = 234; + splat.mB = 345; + + dlg(ref a, ref splat); + Test.Assert(a == 1123); + Test.Assert(splat.mA == 2234); + Test.Assert(splat.mB == 3345); + } + public static void TestCasting() { delegate int(int, int) dlg0 = null;