1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 11:38:21 +02:00

Fixed append ctors in classes with emissions

This commit is contained in:
Brian Fiete 2022-08-27 09:23:53 -07:00
parent f8f95e9de3
commit 86a80f4d18

View file

@ -2056,38 +2056,42 @@ void BfDefBuilder::FinishTypeDef(bool wantsToString)
{
mCurTypeDef->mHasAppendCtor = true;
auto methodDef = new BfMethodDef();
mCurTypeDef->mMethods.Insert(methodIdx + 1, methodDef);
BF_ASSERT(mCurDeclaringTypeDef != NULL);
methodDef->mDeclaringType = mCurDeclaringTypeDef;
methodDef->mName = BF_METHODNAME_CALCAPPEND;
methodDef->mProtection = BfProtection_Public;
methodDef->mMethodType = BfMethodType_CtorCalcAppend;
methodDef->mIsMutating = method->mIsMutating;
methodDef->mIsNoSplat = true;
methodDef->mMethodDeclaration = method->mMethodDeclaration;
methodDef->mReturnTypeRef = mSystem->mDirectIntTypeRef;
methodDef->mIsStatic = true;
methodDef->mBody = method->mBody;
methodDef->mAddedAfterEmit = mIsComptime;
for (auto param : method->mParams)
bool isHandled = !method->mParams.IsEmpty() && method->mParams[0]->mParamKind == BfParamKind_AppendIdx;
if (!isHandled)
{
BfParameterDef* newParam = new BfParameterDef();
newParam->mName = param->mName;
newParam->mNamePrefixCount = param->mNamePrefixCount;
newParam->mTypeRef = param->mTypeRef;
newParam->mMethodGenericParamIdx = param->mMethodGenericParamIdx;
methodDef->mParams.push_back(newParam);
}
auto methodDef = new BfMethodDef();
mCurTypeDef->mMethods.Insert(methodIdx + 1, methodDef);
BF_ASSERT(mCurDeclaringTypeDef != NULL);
methodDef->mDeclaringType = mCurDeclaringTypeDef;
methodDef->mName = BF_METHODNAME_CALCAPPEND;
methodDef->mProtection = BfProtection_Public;
methodDef->mMethodType = BfMethodType_CtorCalcAppend;
methodDef->mIsMutating = method->mIsMutating;
methodDef->mIsNoSplat = true;
// Insert a 'appendIdx'
BfParameterDef* newParam = new BfParameterDef();
newParam->mName = "appendIdx";
newParam->mTypeRef = mSystem->mDirectRefIntTypeRef;
newParam->mParamKind = BfParamKind_AppendIdx;
method->mParams.Insert(0, newParam);
methodDef->mMethodDeclaration = method->mMethodDeclaration;
methodDef->mReturnTypeRef = mSystem->mDirectIntTypeRef;
methodDef->mIsStatic = true;
methodDef->mBody = method->mBody;
methodDef->mAddedAfterEmit = mIsComptime;
for (auto param : method->mParams)
{
BfParameterDef* newParam = new BfParameterDef();
newParam->mName = param->mName;
newParam->mNamePrefixCount = param->mNamePrefixCount;
newParam->mTypeRef = param->mTypeRef;
newParam->mMethodGenericParamIdx = param->mMethodGenericParamIdx;
methodDef->mParams.push_back(newParam);
}
// Insert a 'appendIdx'
BfParameterDef* newParam = new BfParameterDef();
newParam->mName = "appendIdx";
newParam->mTypeRef = mSystem->mDirectRefIntTypeRef;
newParam->mParamKind = BfParamKind_AppendIdx;
method->mParams.Insert(0, newParam);
}
}
}
}