From 041a17cf894191c42895d86d86d17c90fb79ced6 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 27 Nov 2021 10:31:32 -0800 Subject: [PATCH] Support for autoprop initializers --- IDEHelper/Compiler/BfDefBuilder.cpp | 9 +++++++++ IDEHelper/Compiler/BfPrinter.cpp | 17 +++++++++-------- IDEHelper/Compiler/BfReducer.cpp | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/IDEHelper/Compiler/BfDefBuilder.cpp b/IDEHelper/Compiler/BfDefBuilder.cpp index febe5418..c6fe0375 100644 --- a/IDEHelper/Compiler/BfDefBuilder.cpp +++ b/IDEHelper/Compiler/BfDefBuilder.cpp @@ -962,12 +962,21 @@ void BfDefBuilder::Visit(BfPropertyDeclaration* propertyDeclaration) fieldDef->mTypeRef = refTypeRef->mElementType; fieldDef->mName = mCurTypeDef->GetAutoPropertyName(propertyDeclaration); fieldDef->mIdx = (int)mCurTypeDef->mFields.size(); + fieldDef->mInitializer = propertyDeclaration->mInitializer; mCurTypeDef->mFields.push_back(fieldDef); mCurTypeDef->mSignatureHash = HashString(fieldDef->mName, mCurTypeDef->mSignatureHash); } 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 (mCurTypeDef->mTypeCode == BfTypeCode_Interface) diff --git a/IDEHelper/Compiler/BfPrinter.cpp b/IDEHelper/Compiler/BfPrinter.cpp index eba25d73..da3536a6 100644 --- a/IDEHelper/Compiler/BfPrinter.cpp +++ b/IDEHelper/Compiler/BfPrinter.cpp @@ -2586,8 +2586,8 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration) if (indexerDeclaration != NULL) { - QueueVisitChild(indexerDeclaration->mThisToken); - QueueVisitChild(indexerDeclaration->mOpenBracket); + QueueVisitChild(indexerDeclaration->mThisToken); + QueueVisitChild(indexerDeclaration->mOpenBracket); for (int i = 0; i < (int)indexerDeclaration->mParams.size(); i++) { if (i > 0) @@ -2599,12 +2599,7 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration) } QueueVisitChild(indexerDeclaration->mCloseBracket); ExpectSpace(); - } - - QueueVisitChild(propertyDeclaration->mEqualsNode); - ExpectSpace(); - QueueVisitChild(propertyDeclaration->mInitializer); - FlushVisitChild(); + } if (auto block = BfNodeDynCast(propertyDeclaration->mDefinitionBlock)) { @@ -2628,6 +2623,12 @@ void BfPrinter::Visit(BfPropertyDeclaration* propertyDeclaration) } } + ExpectSpace(); + QueueVisitChild(propertyDeclaration->mEqualsNode); + ExpectSpace(); + QueueVisitChild(propertyDeclaration->mInitializer); + FlushVisitChild(); + //QueueVisitChild(propertyDeclaration->mTrailingSemicolon); // ??? QueueVisitErrorNodes(propertyDeclaration); diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 7b56b520..f9d9ee12 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -6971,6 +6971,20 @@ BfAstNode* BfReducer::ReadTypeMember(BfAstNode* node, bool declStarted, int dept MEMBER_SET(propertyDeclaration, mDefinitionBlock, block); ReadPropertyBlock(propertyDeclaration, block); + if (auto tokenNode = BfNodeDynCast(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(mVisitorPos.GetNext())) { if (tokenNode->mToken == BfToken_Tilde)