1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 20:12:21 +02:00

Fixed some issues with types with extensions and emitted methods

This commit is contained in:
Brian Fiete 2022-06-27 12:19:24 -07:00
parent d6af5b826f
commit f7efa3466a
4 changed files with 28 additions and 9 deletions

View file

@ -1174,8 +1174,11 @@ void BfContext::RebuildType(BfType* type, bool deleteOnDemandTypes, bool rebuild
if (typeInst->mTypeDef->mEmitParent != NULL) if (typeInst->mTypeDef->mEmitParent != NULL)
{ {
auto emitTypeDef = typeInst->mTypeDef; auto emitTypeDef = typeInst->mTypeDef;
typeInst->mTypeDef = emitTypeDef->mEmitParent; typeInst->mTypeDef = emitTypeDef->mEmitParent;
if (typeInst->mTypeDef->mIsPartial)
typeInst->mTypeDef = mSystem->GetCombinedPartial(typeInst->mTypeDef);
BfLogSysM("Type %p queueing delete of typeDef %p, resetting typeDef to %p\n", typeInst, emitTypeDef, typeInst->mTypeDef); BfLogSysM("Type %p queueing delete of typeDef %p, resetting typeDef to %p\n", typeInst, emitTypeDef, typeInst->mTypeDef);
if (emitTypeDef->mDefState != BfTypeDef::DefState_Deleted) if (emitTypeDef->mDefState != BfTypeDef::DefState_Deleted)
{ {

View file

@ -2352,11 +2352,6 @@ void BfModule::UpdateCEEmit(CeEmitContext* ceEmitContext, BfTypeInstance* typeIn
defBuilder.mCurTypeDef = typeInstance->mTypeDef; defBuilder.mCurTypeDef = typeInstance->mTypeDef;
defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef; defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef;
if (typeInstance->mTypeDef->mIsCombinedPartial)
{
// Always define generated methods on the primary type declaration
defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef->mPartials[0]->GetLatest();
}
defBuilder.mPassInstance = mCompiler->mPassInstance; defBuilder.mPassInstance = mCompiler->mPassInstance;
defBuilder.mIsComptime = true; defBuilder.mIsComptime = true;
defBuilder.DoVisitChild(typeDeclaration->mDefineNode); defBuilder.DoVisitChild(typeDeclaration->mDefineNode);
@ -9676,7 +9671,16 @@ BfTypeDef* BfModule::GetActiveTypeDef(BfTypeInstance* typeInstanceOverride, bool
if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL) && (useMixinDecl)) if ((mCurMethodState != NULL) && (mCurMethodState->mMixinState != NULL) && (useMixinDecl))
useTypeDef = mCurMethodState->mMixinState->mMixinMethodInstance->mMethodDef->mDeclaringType->GetDefinition(); useTypeDef = mCurMethodState->mMixinState->mMixinMethodInstance->mMethodDef->mDeclaringType->GetDefinition();
else if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mMethodDef->mDeclaringType != NULL)) else if ((mCurMethodInstance != NULL) && (mCurMethodInstance->mMethodDef->mDeclaringType != NULL))
useTypeDef = mCurMethodInstance->mMethodDef->mDeclaringType->GetDefinition(); {
auto declTypeDef = mCurMethodInstance->mMethodDef->mDeclaringType;
useTypeDef = declTypeDef->GetDefinition();
if ((declTypeDef->IsEmitted()) && (useTypeDef->mIsCombinedPartial))
{
// Always consider methods to belong to the primary type declaration
useTypeDef = useTypeDef->mPartials[0];
}
}
else if (mContext->mCurTypeState != NULL) else if (mContext->mCurTypeState != NULL)
{ {
if ((mContext->mCurTypeState->mCurFieldDef != NULL) && (mContext->mCurTypeState->mCurFieldDef->mDeclaringType != NULL)) if ((mContext->mCurTypeState->mCurFieldDef != NULL) && (mContext->mCurTypeState->mCurFieldDef->mDeclaringType != NULL))

View file

@ -79,7 +79,7 @@ namespace Tests
class ClassF class ClassF
{ {
public int mA = 123; public int mA = 123;
public append String mB = .(mA); public append String mB = .(1024);
public int mC = 234; public int mC = 234;
} }

View file

@ -2,6 +2,18 @@
using System; using System;
namespace System
{
extension RefCounted<T>
{
public static RefCounted<T> Attach(RefCounted<T> val)
{
val.AddRef();
return val;
}
}
}
namespace System namespace System
{ {
public extension Event<T> public extension Event<T>