mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 20:12:21 +02:00
Changed orphaned extensions to still create a composite
This commit is contained in:
parent
64b9114911
commit
6cb1235fd6
1 changed files with 42 additions and 8 deletions
|
@ -3028,6 +3028,8 @@ void BfCompiler::UpdateRevisedTypes()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool isExplicitPartial = outerTypeDef->mIsExplicitPartial;
|
||||||
|
bool failedToFindRootType = false;
|
||||||
if ((outerTypeDef->mTypeCode == BfTypeCode_Extension) && (!outerTypeDef->mPartialUsed))
|
if ((outerTypeDef->mTypeCode == BfTypeCode_Extension) && (!outerTypeDef->mPartialUsed))
|
||||||
{
|
{
|
||||||
// Find root type, and we assume the composite type follows this
|
// Find root type, and we assume the composite type follows this
|
||||||
|
@ -3066,8 +3068,15 @@ void BfCompiler::UpdateRevisedTypes()
|
||||||
BF_ASSERT(rootTypeDef->mFullNameEx == compositeTypeDef->mFullNameEx);
|
BF_ASSERT(rootTypeDef->mFullNameEx == compositeTypeDef->mFullNameEx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rootTypeDef == NULL)
|
||||||
|
{
|
||||||
|
failedToFindRootType = true;
|
||||||
|
isExplicitPartial = true;
|
||||||
}
|
}
|
||||||
else if ((outerTypeDef->mIsExplicitPartial) && (!outerTypeDef->mPartialUsed))
|
}
|
||||||
|
|
||||||
|
if ((isExplicitPartial) && (!outerTypeDef->mPartialUsed))
|
||||||
{
|
{
|
||||||
// For explicit partials there is no 'root type' so we want to select any partial in the 'innermost' project
|
// For explicit partials there is no 'root type' so we want to select any partial in the 'innermost' project
|
||||||
rootTypeDef = outerTypeDef;
|
rootTypeDef = outerTypeDef;
|
||||||
|
@ -3170,6 +3179,9 @@ void BfCompiler::UpdateRevisedTypes()
|
||||||
compositeTypeDef->mNameEx->Ref();
|
compositeTypeDef->mNameEx->Ref();
|
||||||
compositeTypeDef->mProtection = rootTypeDef->mProtection;
|
compositeTypeDef->mProtection = rootTypeDef->mProtection;
|
||||||
compositeTypeDef->mNamespace = rootTypeDef->mNamespace;
|
compositeTypeDef->mNamespace = rootTypeDef->mNamespace;
|
||||||
|
if (rootTypeDef->mTypeCode == BfTypeCode_Extension)
|
||||||
|
compositeTypeDef->mTypeCode = BfTypeCode_Struct;
|
||||||
|
else
|
||||||
compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode;
|
compositeTypeDef->mTypeCode = rootTypeDef->mTypeCode;
|
||||||
compositeTypeDef->mFullName = rootTypeDef->mFullName;
|
compositeTypeDef->mFullName = rootTypeDef->mFullName;
|
||||||
compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx;
|
compositeTypeDef->mFullNameEx = rootTypeDef->mFullNameEx;
|
||||||
|
@ -3344,13 +3356,22 @@ void BfCompiler::UpdateRevisedTypes()
|
||||||
if (compositeIsNew)
|
if (compositeIsNew)
|
||||||
{
|
{
|
||||||
compositeTypeDef->mDefState = BfTypeDef::DefState_New;
|
compositeTypeDef->mDefState = BfTypeDef::DefState_New;
|
||||||
|
if (compositeTypeDef->mNextRevision->mTypeCode != BfTypeCode_Extension)
|
||||||
compositeTypeDef->mTypeCode = compositeTypeDef->mNextRevision->mTypeCode;
|
compositeTypeDef->mTypeCode = compositeTypeDef->mNextRevision->mTypeCode;
|
||||||
|
else
|
||||||
|
compositeTypeDef->mNextRevision->mTypeCode = compositeTypeDef->mTypeCode;
|
||||||
mSystem->InjectNewRevision(compositeTypeDef);
|
mSystem->InjectNewRevision(compositeTypeDef);
|
||||||
// Reset 'New' state
|
// Reset 'New' state
|
||||||
compositeTypeDef->mDefState = BfTypeDef::DefState_New;
|
compositeTypeDef->mDefState = BfTypeDef::DefState_New;
|
||||||
}
|
}
|
||||||
else if (hadSignatureChange)
|
else
|
||||||
|
{
|
||||||
|
if (compositeTypeDef->mNextRevision->mTypeCode == BfTypeCode_Extension)
|
||||||
|
compositeTypeDef->mNextRevision->mTypeCode = compositeTypeDef->mTypeCode;
|
||||||
|
|
||||||
|
if (hadSignatureChange)
|
||||||
compositeTypeDef->mDefState = BfTypeDef::DefState_Signature_Changed;
|
compositeTypeDef->mDefState = BfTypeDef::DefState_Signature_Changed;
|
||||||
|
}
|
||||||
|
|
||||||
if (compositeTypeDef->mDefState == BfTypeDef::DefState_Defined)
|
if (compositeTypeDef->mDefState == BfTypeDef::DefState_Defined)
|
||||||
{
|
{
|
||||||
|
@ -3368,11 +3389,23 @@ void BfCompiler::UpdateRevisedTypes()
|
||||||
if (latestCompositeTypeDef->mTypeCode == BfTypeCode_Extension)
|
if (latestCompositeTypeDef->mTypeCode == BfTypeCode_Extension)
|
||||||
{
|
{
|
||||||
BF_ASSERT(rootTypeDef == NULL);
|
BF_ASSERT(rootTypeDef == NULL);
|
||||||
latestCompositeTypeDef->mTypeCode = BfTypeCode_Object;
|
latestCompositeTypeDef->mTypeCode = BfTypeCode_Struct;
|
||||||
}
|
}
|
||||||
|
|
||||||
BfLogSysM("Partial combined type typedef %p updated from parser %p\n", compositeTypeDef, latestCompositeTypeDef->mTypeDeclaration->GetSourceData());
|
BfLogSysM("Partial combined type typedef %p updated from parser %p\n", compositeTypeDef, latestCompositeTypeDef->mTypeDeclaration->GetSourceData());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (failedToFindRootType)
|
||||||
|
{
|
||||||
|
for (auto partialTypeDecl : compositeTypeDef->GetLatest()->mPartials)
|
||||||
|
{
|
||||||
|
// Couldn't find a root type def, treat ourselves as an explicit partial
|
||||||
|
auto error = mPassInstance->Fail(StrFormat("Unable to find root type definition for extension '%s'", partialTypeDecl->GetLatest()->mFullName.ToString().c_str()),
|
||||||
|
partialTypeDecl->GetLatest()->mTypeDeclaration->mNameNode);
|
||||||
|
if (error != NULL)
|
||||||
|
error->mIsPersistent = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
outerTypeDefEntry = outerTypeDefEntry->mNext;
|
outerTypeDefEntry = outerTypeDefEntry->mNext;
|
||||||
|
@ -3426,6 +3459,7 @@ void BfCompiler::UpdateRevisedTypes()
|
||||||
if (outerTypeDef->mIsPartial)
|
if (outerTypeDef->mIsPartial)
|
||||||
{
|
{
|
||||||
// Allow this typeDef be a full solo type by itself
|
// Allow this typeDef be a full solo type by itself
|
||||||
|
//outerTypeDef->mTypeCode = BfTypeCode_Struct;
|
||||||
outerTypeDef->mIsPartial = false;
|
outerTypeDef->mIsPartial = false;
|
||||||
if (outerTypeDef->mNextRevision != NULL)
|
if (outerTypeDef->mNextRevision != NULL)
|
||||||
outerTypeDef->mNextRevision->mIsPartial = false;
|
outerTypeDef->mNextRevision->mIsPartial = false;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue