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

Support for expression-bodied properties with mut

This commit is contained in:
Brian Fiete 2022-01-03 14:41:12 -05:00
parent 60b6437f69
commit c0fe1d1c1b
7 changed files with 47 additions and 11 deletions

View file

@ -3111,6 +3111,7 @@ class BfPropertyBodyExpression : public BfAstNode
{ {
public: public:
BF_AST_TYPE(BfPropertyBodyExpression, BfAstNode); BF_AST_TYPE(BfPropertyBodyExpression, BfAstNode);
BfTokenNode* mMutSpecifier;
BfTokenNode* mFatTokenArrow; BfTokenNode* mFatTokenArrow;
}; BF_AST_DECL(BfPropertyBodyExpression, BfAstNode); }; BF_AST_DECL(BfPropertyBodyExpression, BfAstNode);

View file

@ -1067,6 +1067,9 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration)
{ {
methodName = "get"; methodName = "get";
ParseAttributes(propertyDeclaration->mAttributes, methodDef); ParseAttributes(propertyDeclaration->mAttributes, methodDef);
if (propExprBody->mMutSpecifier != NULL)
methodDef->mIsMutating = true;
HashNode(*mSignatureHashCtx, propExprBody->mMutSpecifier);
} }
else if ((methodDeclaration != NULL) && (methodDeclaration->mNameNode != NULL)) else if ((methodDeclaration != NULL) && (methodDeclaration->mNameNode != NULL))
methodName = methodDeclaration->mNameNode->ToString(); methodName = methodDeclaration->mNameNode->ToString();

View file

@ -1061,6 +1061,7 @@ void BfElementVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression)
{ {
Visit(propertyBodyExpression->ToBase()); Visit(propertyBodyExpression->ToBase());
VisitChild(propertyBodyExpression->mMutSpecifier);
VisitChild(propertyBodyExpression->mFatTokenArrow); VisitChild(propertyBodyExpression->mFatTokenArrow);
} }

View file

@ -22952,7 +22952,18 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool
if (methodDeclaration != NULL) if (methodDeclaration != NULL)
mutSpecifier = methodDeclaration->mMutSpecifier; mutSpecifier = methodDeclaration->mMutSpecifier;
else if (methodDef->GetPropertyMethodDeclaration() != NULL) else if (methodDef->GetPropertyMethodDeclaration() != NULL)
mutSpecifier = methodDef->GetPropertyMethodDeclaration()->mMutSpecifier; {
mutSpecifier = methodDef->GetPropertyMethodDeclaration()->mMutSpecifier;
if (mutSpecifier == NULL)
{
auto propertyDeclaration = methodDef->GetPropertyDeclaration();
if (propertyDeclaration != NULL)
{
if (auto propExprBody = BfNodeDynCast<BfPropertyBodyExpression>(propertyDeclaration->mDefinitionBlock))
mutSpecifier = propExprBody->mMutSpecifier;
}
}
}
if ((mutSpecifier != NULL) && (!mCurTypeInstance->IsBoxed()) && (!methodInstance->mIsForeignMethodDef)) if ((mutSpecifier != NULL) && (!mCurTypeInstance->IsBoxed()) && (!methodInstance->mIsForeignMethodDef))
{ {

View file

@ -2584,6 +2584,13 @@ void BfPrinter::Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration)
QueueVisitChild(propertyMethodDeclaration->mEndSemicolon); QueueVisitChild(propertyMethodDeclaration->mEndSemicolon);
} }
void BfPrinter::Visit(BfPropertyBodyExpression* propertyBodyExpression)
{
VisitChild(propertyBodyExpression->mMutSpecifier);
ExpectSpace();
VisitChild(propertyBodyExpression->mFatTokenArrow);
}
void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration) void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration)
{ {
auto indexerDeclaration = BfNodeDynCast<BfIndexerDeclaration>(propertyDeclaration); auto indexerDeclaration = BfNodeDynCast<BfIndexerDeclaration>(propertyDeclaration);

View file

@ -215,6 +215,7 @@ public:
virtual void Visit(BfMethodDeclaration* methodDeclaration) override; virtual void Visit(BfMethodDeclaration* methodDeclaration) override;
virtual void Visit(BfOperatorDeclaration* opreratorDeclaration) override; virtual void Visit(BfOperatorDeclaration* opreratorDeclaration) override;
virtual void Visit(BfPropertyMethodDeclaration* propertyDeclaration) override; virtual void Visit(BfPropertyMethodDeclaration* propertyDeclaration) override;
virtual void Visit(BfPropertyBodyExpression* propertyBodyExpression) override;
virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override; virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override;
virtual void Visit(BfIndexerDeclaration* indexerDeclaration) override; virtual void Visit(BfIndexerDeclaration* indexerDeclaration) override;
virtual void Visit(BfFieldDeclaration* fieldDeclaration) override; virtual void Visit(BfFieldDeclaration* fieldDeclaration) override;

View file

@ -6966,7 +6966,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
auto block = BfNodeDynCast<BfBlock>(nextNode); auto block = BfNodeDynCast<BfBlock>(nextNode);
auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode); auto tokenNode = BfNodeDynCast<BfTokenNode>(nextNode);
bool isExprBodyProp = (tokenNode != NULL) && (tokenNode->mToken == BfToken_FatArrow); bool isExprBodyProp = (tokenNode != NULL) && ((tokenNode->mToken == BfToken_FatArrow) || (tokenNode->mToken == BfToken_Mut));
// Property. // Property.
// If we don't have a token afterwards then still treat it as a property for autocomplete purposes // If we don't have a token afterwards then still treat it as a property for autocomplete purposes
if ((typeRef != NULL) && if ((typeRef != NULL) &&
@ -7050,20 +7050,32 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept
auto propertyBodyExpr = mAlloc->Alloc<BfPropertyBodyExpression>(); auto propertyBodyExpr = mAlloc->Alloc<BfPropertyBodyExpression>();
ReplaceNode(tokenNode, propertyBodyExpr); ReplaceNode(tokenNode, propertyBodyExpr);
MEMBER_SET(propertyBodyExpr, mFatTokenArrow, tokenNode);
auto method = mAlloc->Alloc<BfPropertyMethodDeclaration>(); BfTokenNode* mutSpecifier = NULL;
method->mPropertyDeclaration = propertyDeclaration;
method->mNameNode = propertyDeclaration->mNameNode;
auto expr = CreateExpressionAfter(tokenNode); if (tokenNode->mToken == BfToken_Mut)
if (expr != NULL)
{ {
MEMBER_SET(method, mBody, expr); MEMBER_SET(propertyBodyExpr, mMutSpecifier, tokenNode);
propertyDeclaration->SetSrcEnd(expr->GetSrcEnd()); tokenNode = ExpectTokenAfter(tokenNode, BfToken_FatArrow);
} }
methods.Add(method); if (tokenNode != NULL)
{
MEMBER_SET(propertyBodyExpr, mFatTokenArrow, tokenNode);
auto method = mAlloc->Alloc<BfPropertyMethodDeclaration>();
method->mPropertyDeclaration = propertyDeclaration;
method->mNameNode = propertyDeclaration->mNameNode;
auto expr = CreateExpressionAfter(tokenNode);
if (expr != NULL)
{
MEMBER_SET(method, mBody, expr);
propertyDeclaration->SetSrcEnd(expr->GetSrcEnd());
}
methods.Add(method);
}
MEMBER_SET(propertyDeclaration, mDefinitionBlock, propertyBodyExpr); MEMBER_SET(propertyDeclaration, mDefinitionBlock, propertyBodyExpr);
} }