mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 04:22:20 +02:00
Properly fail enum case declarations outside enums
This commit is contained in:
parent
d1d3af1cc0
commit
234aaa772c
1 changed files with 23 additions and 15 deletions
|
@ -3590,26 +3590,34 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy
|
||||||
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
|
SetAndRestoreValue<BfFieldDef*> prevTypeRef(mContext->mCurTypeState->mCurFieldDef, field);
|
||||||
|
|
||||||
BfType* resolvedFieldType = NULL;
|
BfType* resolvedFieldType = NULL;
|
||||||
|
|
||||||
if (field->IsEnumCaseEntry())
|
if (field->IsEnumCaseEntry())
|
||||||
{
|
{
|
||||||
fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1;
|
if (typeInstance->IsEnum())
|
||||||
resolvedFieldType = typeInstance;
|
{
|
||||||
|
fieldInstance->mDataIdx = -(enumCaseEntryIdx++) - 1;
|
||||||
|
resolvedFieldType = typeInstance;
|
||||||
|
|
||||||
BfType* payloadType = NULL;
|
BfType* payloadType = NULL;
|
||||||
if (field->mTypeRef != NULL)
|
if (field->mTypeRef != NULL)
|
||||||
payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam);
|
payloadType = ResolveTypeRef(field->mTypeRef, BfPopulateType_Data, BfResolveTypeRefFlag_NoResolveGenericParam);
|
||||||
if (payloadType == NULL)
|
if (payloadType == NULL)
|
||||||
{
|
{
|
||||||
if (!typeInstance->IsTypedPrimitive())
|
if (!typeInstance->IsTypedPrimitive())
|
||||||
payloadType = CreateTupleType(BfTypeVector(), Array<String>());
|
payloadType = CreateTupleType(BfTypeVector(), Array<String>());
|
||||||
|
}
|
||||||
|
if (payloadType != NULL)
|
||||||
|
{
|
||||||
|
AddDependency(payloadType, typeInstance, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
|
||||||
|
BF_ASSERT(payloadType->IsTuple());
|
||||||
|
resolvedFieldType = payloadType;
|
||||||
|
fieldInstance->mIsEnumPayloadCase = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (payloadType != NULL)
|
else
|
||||||
{
|
{
|
||||||
AddDependency(payloadType, typeInstance, BfDependencyMap::DependencyFlag_ValueTypeMemberData);
|
Fail("Enum cases can only be declared within enum types", field->GetRefNode(), true);
|
||||||
BF_ASSERT(payloadType->IsTuple());
|
resolvedFieldType = typeInstance;
|
||||||
resolvedFieldType = payloadType;
|
|
||||||
fieldInstance->mIsEnumPayloadCase = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact<BfVarTypeReference>()) || (field->mTypeRef->IsExact<BfLetTypeReference>()) || (field->mTypeRef->IsExact<BfExprModTypeRef>())))
|
else if ((field->mTypeRef != NULL) && ((field->mTypeRef->IsExact<BfVarTypeReference>()) || (field->mTypeRef->IsExact<BfLetTypeReference>()) || (field->mTypeRef->IsExact<BfExprModTypeRef>())))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue