From c0fe1d1c1ba798979c99394a2b2f80070f5f7eb4 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 3 Jan 2022 14:41:12 -0500 Subject: [PATCH] Support for expression-bodied properties with mut --- IDEHelper/Compiler/BfAst.h | 1 + IDEHelper/Compiler/BfDefBuilder.cpp | 3 +++ IDEHelper/Compiler/BfElementVisitor.cpp | 1 + IDEHelper/Compiler/BfModule.cpp | 13 +++++++++- IDEHelper/Compiler/BfPrinter.cpp | 7 ++++++ IDEHelper/Compiler/BfPrinter.h | 1 + IDEHelper/Compiler/BfReducer.cpp | 32 +++++++++++++++++-------- 7 files changed, 47 insertions(+), 11 deletions(-) diff --git a/IDEHelper/Compiler/BfAst.h b/IDEHelper/Compiler/BfAst.h index 62a34a59..2146039c 100644 --- a/IDEHelper/Compiler/BfAst.h +++ b/IDEHelper/Compiler/BfAst.h @@ -3111,6 +3111,7 @@ class BfPropertyBodyExpression : public BfAstNode { public: BF_AST_TYPE(BfPropertyBodyExpression, BfAstNode); + BfTokenNode* mMutSpecifier; BfTokenNode* mFatTokenArrow; }; BF_AST_DECL(BfPropertyBodyExpression, BfAstNode); diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index 65995cc1..ee298353 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -1067,6 +1067,9 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration) { methodName = "get"; ParseAttributes(propertyDeclaration->mAttributes, methodDef); + if (propExprBody->mMutSpecifier != NULL) + methodDef->mIsMutating = true; + HashNode(*mSignatureHashCtx, propExprBody->mMutSpecifier); } else if ((methodDeclaration != NULL) && (methodDeclaration->mNameNode != NULL)) methodName = methodDeclaration->mNameNode->ToString(); diff --git a/IDEHelper/Compiler/BfElementVisitor.cpp b/IDEHelper/Compiler/BfElementVisitor.cpp index 0805ee67..cde5bd60 100644 --- a/IDEHelper/Compiler/BfElementVisitor.cpp +++ b/IDEHelper/Compiler/BfElementVisitor.cpp @@ -1061,6 +1061,7 @@ void BfElementVisitor::Visit(BfPropertyBodyExpression* propertyBodyExpression) { Visit(propertyBodyExpression->ToBase()); + VisitChild(propertyBodyExpression->mMutSpecifier); VisitChild(propertyBodyExpression->mFatTokenArrow); } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 7c493603..6473ce40 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -22952,7 +22952,18 @@ void BfModule::DoMethodDeclaration(BfMethodDeclaration* methodDeclaration, bool if (methodDeclaration != NULL) mutSpecifier = methodDeclaration->mMutSpecifier; 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(propertyDeclaration->mDefinitionBlock)) + mutSpecifier = propExprBody->mMutSpecifier; + } + } + } if ((mutSpecifier != NULL) && (!mCurTypeInstance->IsBoxed()) && (!methodInstance->mIsForeignMethodDef)) { diff --git a/IDEHelper/Compiler/BfPrinter.cpp b/IDEHelper/Compiler/BfPrinter.cpp index 39dcbbce..85a1b68e 100644 --- a/IDEHelper/Compiler/BfPrinter.cpp +++ b/IDEHelper/Compiler/BfPrinter.cpp @@ -2584,6 +2584,13 @@ void BfPrinter::Visit(BfPropertyMethodDeclaration* propertyMethodDeclaration) QueueVisitChild(propertyMethodDeclaration->mEndSemicolon); } +void BfPrinter::Visit(BfPropertyBodyExpression* propertyBodyExpression) +{ + VisitChild(propertyBodyExpression->mMutSpecifier); + ExpectSpace(); + VisitChild(propertyBodyExpression->mFatTokenArrow); +} + void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration) { auto indexerDeclaration = BfNodeDynCast(propertyDeclaration); diff --git a/IDEHelper/Compiler/BfPrinter.h b/IDEHelper/Compiler/BfPrinter.h index cf4dc2b6..5c48ce67 100644 --- a/IDEHelper/Compiler/BfPrinter.h +++ b/IDEHelper/Compiler/BfPrinter.h @@ -215,6 +215,7 @@ public: virtual void Visit(BfMethodDeclaration* methodDeclaration) override; virtual void Visit(BfOperatorDeclaration* opreratorDeclaration) override; virtual void Visit(BfPropertyMethodDeclaration* propertyDeclaration) override; + virtual void Visit(BfPropertyBodyExpression* propertyBodyExpression) override; virtual void Visit(BfPropertyDeclaration* propertyDeclaration) override; virtual void Visit(BfIndexerDeclaration* indexerDeclaration) override; virtual void Visit(BfFieldDeclaration* fieldDeclaration) override; diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 0164aad0..903d7b08 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -6966,7 +6966,7 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept auto block = BfNodeDynCast(nextNode); auto tokenNode = BfNodeDynCast(nextNode); - bool isExprBodyProp = (tokenNode != NULL) && (tokenNode->mToken == BfToken_FatArrow); + bool isExprBodyProp = (tokenNode != NULL) && ((tokenNode->mToken == BfToken_FatArrow) || (tokenNode->mToken == BfToken_Mut)); // Property. // If we don't have a token afterwards then still treat it as a property for autocomplete purposes if ((typeRef != NULL) && @@ -7050,20 +7050,32 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept auto propertyBodyExpr = mAlloc->Alloc(); ReplaceNode(tokenNode, propertyBodyExpr); - MEMBER_SET(propertyBodyExpr, mFatTokenArrow, tokenNode); - auto method = mAlloc->Alloc(); - method->mPropertyDeclaration = propertyDeclaration; - method->mNameNode = propertyDeclaration->mNameNode; + BfTokenNode* mutSpecifier = NULL; - auto expr = CreateExpressionAfter(tokenNode); - if (expr != NULL) + if (tokenNode->mToken == BfToken_Mut) { - MEMBER_SET(method, mBody, expr); - propertyDeclaration->SetSrcEnd(expr->GetSrcEnd()); + MEMBER_SET(propertyBodyExpr, mMutSpecifier, tokenNode); + tokenNode = ExpectTokenAfter(tokenNode, BfToken_FatArrow); } - methods.Add(method); + if (tokenNode != NULL) + { + MEMBER_SET(propertyBodyExpr, mFatTokenArrow, tokenNode); + + auto method = mAlloc->Alloc(); + 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); }