1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 03:52:19 +02:00

Support for autoprop initializers

This commit is contained in:
Brian Fiete 2021-11-27 10:31:32 -08:00
parent 40b0d78d16
commit 041a17cf89
3 changed files with 32 additions and 8 deletions

View file

@ -962,12 +962,21 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration)
fieldDef->mTypeRef = refTypeRef->mElementType; fieldDef->mTypeRef = refTypeRef->mElementType;
fieldDef->mName = mCurTypeDef->GetAutoPropertyName(propertyDeclaration); fieldDef->mName = mCurTypeDef->GetAutoPropertyName(propertyDeclaration);
fieldDef->mIdx = (int)mCurTypeDef->mFields.size(); fieldDef->mIdx = (int)mCurTypeDef->mFields.size();
fieldDef->mInitializer = propertyDeclaration->mInitializer;
mCurTypeDef->mFields.push_back(fieldDef); mCurTypeDef->mFields.push_back(fieldDef);
mCurTypeDef->mSignatureHash = HashString(fieldDef->mName, mCurTypeDef->mSignatureHash); mCurTypeDef->mSignatureHash = HashString(fieldDef->mName, mCurTypeDef->mSignatureHash);
} }
else else
{ {
if (propertyDeclaration->mInitializer != NULL)
{
if (mCurTypeDef->mTypeCode == BfTypeCode_Interface)
Fail("Interface properties cannot have initializers", propertyDeclaration->mInitializer);
else
Fail("Properties with method bodies cannot have initializers", propertyDeclaration->mInitializer);
}
if (propertyDeclaration->mFieldDtor != NULL) if (propertyDeclaration->mFieldDtor != NULL)
{ {
if (mCurTypeDef->mTypeCode == BfTypeCode_Interface) if (mCurTypeDef->mTypeCode == BfTypeCode_Interface)

View file

@ -2586,8 +2586,8 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration)
if (indexerDeclaration != NULL) if (indexerDeclaration != NULL)
{ {
QueueVisitChild(indexerDeclaration->mThisToken); QueueVisitChild(indexerDeclaration->mThisToken);
QueueVisitChild(indexerDeclaration->mOpenBracket); QueueVisitChild(indexerDeclaration->mOpenBracket);
for (int i = 0; i < (int)indexerDeclaration->mParams.size(); i++) for (int i = 0; i < (int)indexerDeclaration->mParams.size(); i++)
{ {
if (i > 0) if (i > 0)
@ -2599,12 +2599,7 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration)
} }
QueueVisitChild(indexerDeclaration->mCloseBracket); QueueVisitChild(indexerDeclaration->mCloseBracket);
ExpectSpace(); ExpectSpace();
} }
QueueVisitChild(propertyDeclaration->mEqualsNode);
ExpectSpace();
QueueVisitChild(propertyDeclaration->mInitializer);
FlushVisitChild();
if (auto block = BfNodeDynCast<BfBlock>(propertyDeclaration->mDefinitionBlock)) if (auto block = BfNodeDynCast<BfBlock>(propertyDeclaration->mDefinitionBlock))
{ {
@ -2628,6 +2623,12 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration)
} }
} }
ExpectSpace();
QueueVisitChild(propertyDeclaration->mEqualsNode);
ExpectSpace();
QueueVisitChild(propertyDeclaration->mInitializer);
FlushVisitChild();
//QueueVisitChild(propertyDeclaration->mTrailingSemicolon); //QueueVisitChild(propertyDeclaration->mTrailingSemicolon);
// ??? QueueVisitErrorNodes(propertyDeclaration); // ??? QueueVisitErrorNodes(propertyDeclaration);

View file

@ -6971,6 +6971,20 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
MEMBER_SET(propertyDeclaration, mDefinitionBlock, block); MEMBER_SET(propertyDeclaration, mDefinitionBlock, block);
ReadPropertyBlock(propertyDeclaration, block); ReadPropertyBlock(propertyDeclaration, block);
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
{
if (tokenNode->mToken == BfToken_AssignEquals)
{
MEMBER_SET(propertyDeclaration, mEqualsNode, tokenNode);
mVisitorPos.MoveNext();
auto initExpr = CreateExpressionAfter(propertyDeclaration);
if (initExpr != NULL)
{
MEMBER_SET(propertyDeclaration, mInitializer, initExpr);
}
}
}
if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext())) if (auto tokenNode = BfNodeDynCast<BfTokenNode>(mVisitorPos.GetNext()))
{ {
if (tokenNode->mToken == BfToken_Tilde) if (tokenNode->mToken == BfToken_Tilde)