Quellcode durchsuchen

Support for expression-bodied properties with mut

Brian Fiete vor 3 Jahren
Ursprung
Commit
c0fe1d1c1b

+ 1 - 0
IDEHelper/Compiler/BfAst.h

@@ -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);
 
 

+ 3 - 0
IDEHelper/Compiler/BfDefBuilder.cpp

@@ -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();

+ 1 - 0
IDEHelper/Compiler/BfElementVisitor.cpp

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

+ 12 - 1
IDEHelper/Compiler/BfModule.cpp

@@ -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))
 	{
 	{

+ 7 - 0
IDEHelper/Compiler/BfPrinter.cpp

@@ -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);

+ 1 - 0
IDEHelper/Compiler/BfPrinter.h

@@ -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;

+ 22 - 10
IDEHelper/Compiler/BfReducer.cpp

@@ -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>();
-				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<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);
 			}
 			}