1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-08 19:48:20 +02:00

Fixed false signature change with multiple extensions

This commit is contained in:
Brian Fiete 2020-12-31 09:56:51 -08:00
parent f81a1cf896
commit fa65029dfa
7 changed files with 155 additions and 8 deletions

View file

@ -1262,6 +1262,57 @@ void BfDefBuilder::AddParam(BfMethodDef* methodDef, BfTypeReference* typeRef, co
methodDef->mParams.push_back(paramDef);
}
BfTypeDef* BfDefBuilder::ComparePrevTypeDef(BfTypeDef* prevTypeDef, BfTypeDef* checkTypeDef)
{
if (!mCurTypeDef->IsExtension())
return prevTypeDef;
BF_ASSERT(mCurTypeDef->mGenericParamDefs.size() == prevTypeDef->mGenericParamDefs.size());
BF_ASSERT(mCurTypeDef->mGenericParamDefs.size() == checkTypeDef->mGenericParamDefs.size());
bool prevMatches = true;
bool checkMatches = true;
for (int genericParamIdx = 0; genericParamIdx < (int)mCurTypeDef->mGenericParamDefs.size(); genericParamIdx++)
{
BfGenericParamDef* paramDef = mCurTypeDef->mGenericParamDefs[genericParamIdx];
BfGenericParamDef* prevParamDef = prevTypeDef->mGenericParamDefs[genericParamIdx];
BfGenericParamDef* checkParamDef = checkTypeDef->mGenericParamDefs[genericParamIdx];
if (*paramDef != *prevParamDef)
prevMatches = false;
if (*paramDef != *checkParamDef)
checkMatches = false;
}
if (mCurTypeDef->mExternalConstraints.mSize == prevTypeDef->mExternalConstraints.mSize)
{
for (int constraintIdx = 0; constraintIdx < mCurTypeDef->mExternalConstraints.mSize; constraintIdx++)
{
if (mCurTypeDef->mExternalConstraints[constraintIdx] != prevTypeDef->mExternalConstraints[constraintIdx])
prevMatches = false;
}
}
else
prevMatches = false;
if (mCurTypeDef->mExternalConstraints.mSize == checkTypeDef->mExternalConstraints.mSize)
{
for (int constraintIdx = 0; constraintIdx < mCurTypeDef->mExternalConstraints.mSize; constraintIdx++)
{
if (mCurTypeDef->mExternalConstraints[constraintIdx] != checkTypeDef->mExternalConstraints[constraintIdx])
checkMatches = false;
}
}
else
checkMatches = false;
if ((!prevMatches) && (checkMatches))
return checkTypeDef;
return prevTypeDef;
}
void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
{
BF_ASSERT(typeDeclaration->GetSourceData() == mCurSource->mSourceData);
@ -1374,7 +1425,7 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
SetAndRestoreValue<HashContext*> prevFullHashCtx(mFullHashCtx, &fullHashCtx);
SetAndRestoreValue<HashContext*> prevSignatureHashCtx(mSignatureHashCtx, &signatureHashCtx);
if (bfParser != NULL)
{
mFullHashCtx->MixinStr(bfParser->mFileName);
@ -1627,6 +1678,12 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
}
}
int outerGenericSize = 0;
if (mCurTypeDef->mOuterType != NULL)
outerGenericSize = (int)mCurTypeDef->mOuterType->mGenericParamDefs.size();
bool isGeneric = (outerGenericSize != 0) || (typeDeclaration->mGenericParams != NULL);
ParseGenericParams(typeDeclaration->mGenericParams, typeDeclaration->mGenericConstraintsDeclaration, mCurTypeDef->mGenericParamDefs, &mCurTypeDef->mExternalConstraints, outerGenericSize, isGeneric);
if (!isAutoCompleteTempType)
{
BfTypeDef* prevDef = NULL;
@ -1670,6 +1727,12 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
prevRevisionTypeDef = checkTypeDef;
prevDef = checkTypeDef;
}
else
{
auto bestTypeDef = ComparePrevTypeDef(prevRevisionTypeDef, checkTypeDef);
prevRevisionTypeDef = bestTypeDef;
prevDef = bestTypeDef;
}
}
}
else
@ -1731,12 +1794,6 @@ void BfDefBuilder::Visit(BfTypeDeclaration* typeDeclaration)
BfLogSysM("Creating TypeDef %p Hash:%d from TypeDecl: %p Source: %p ResolvePass: %d AutoComplete:%d\n", mCurTypeDef, mSystem->mTypeDefs.GetHash(mCurTypeDef), typeDeclaration,
typeDeclaration->GetSourceData(), mResolvePassData != NULL, isAutoCompleteTempType);
int outerGenericSize = 0;
if (mCurTypeDef->mOuterType != NULL)
outerGenericSize = (int)mCurTypeDef->mOuterType->mGenericParamDefs.size();
bool isGeneric = (outerGenericSize != 0) || (typeDeclaration->mGenericParams != NULL);
ParseGenericParams(typeDeclaration->mGenericParams, typeDeclaration->mGenericConstraintsDeclaration, mCurTypeDef->mGenericParamDefs, &mCurTypeDef->mExternalConstraints, outerGenericSize, isGeneric);
BF_ASSERT(mCurTypeDef->mNameEx == NULL);