2
0
Эх сурвалжийг харах

Fixit for brace-to-paren for object initializers

Brian Fiete 5 жил өмнө
parent
commit
10421d99ca

+ 2 - 2
BeefLibs/corlib/src/Attribute.bf

@@ -318,13 +318,13 @@ namespace System
 		}
 	}
 
-	[AttributeUsage(.Field | .Method /*2*/)]
+	[AttributeUsage(.Field | .Method | .Property /*2*/)]
 	public struct NoShowAttribute : Attribute
 	{
 
 	}
 
-	[AttributeUsage(.Field | .Method /*2*/)]
+	[AttributeUsage(.Field | .Method | .Property /*2*/)]
 	public struct HideAttribute : Attribute
 	{
 

+ 10 - 0
IDE/src/ui/AutoComplete.bf

@@ -2277,6 +2277,16 @@ namespace IDE.ui
 
 		void ApplyFixit(String data)
 		{
+			int splitIdx = data.IndexOf('\x01');
+			if (splitIdx != -1)
+			{
+				String lhs = scope String(data, 0, splitIdx);
+				String rhs = scope String(data, splitIdx + 1);
+				ApplyFixit(lhs);
+				ApplyFixit(rhs);
+				return;
+			}
+
 			UndoBatchStart undoBatchStart = null;
 
 			var parts = String.StackSplit!(data, '|');

+ 16 - 3
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -18,6 +18,7 @@
 #include "BfUtil.h"
 #include "BfDeferEvalChecker.h"
 #include "BfVarDeclChecker.h"
+#include "BfFixits.h"
 
 #pragma warning(pop)
 
@@ -7420,7 +7421,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp
 					paramTypes.Add(resolvedArg.mTypedValue.mType);
 				}
 
-				autoComplete->FixitAddMethod(typeInst, methodName, mExpectingType, paramTypes, wantStatic);				
+				autoComplete->FixitAddMethod(typeInst, methodName, mExpectingType, paramTypes, wantStatic);
 			}			
 		}
 
@@ -11683,8 +11684,20 @@ void BfExprEvaluator::Visit(BfObjectCreateExpression* objCreateExpr)
 		autoComplete->CheckTypeRef(objCreateExpr->mTypeRef, false, true);
 	}
 
-	//if (objCreateExpr->mArraySizeSpecifier == NULL)
-		CheckObjectCreateTypeRef(mExpectingType, objCreateExpr->mNewNode);			
+	if ((autoComplete != NULL) && (objCreateExpr->mOpenToken != NULL) && (objCreateExpr->mCloseToken != NULL) &&
+		(objCreateExpr->mOpenToken->mToken == BfToken_LBrace) && (autoComplete->CheckFixit(objCreateExpr->mOpenToken)))
+	{		
+		auto refNode = objCreateExpr->mOpenToken;
+		BfParserData* parser = refNode->GetSourceData()->ToParserData();
+		if (parser != NULL)
+		{			
+			autoComplete->AddEntry(AutoCompleteEntry("fixit", StrFormat("Change initializer braces to parentheses\treformat|%s|%d-1|(\x01|%s|%d-1|)", 
+				parser->mFileName.c_str(), refNode->mSrcStart,
+				parser->mFileName.c_str(), objCreateExpr->mCloseToken->mSrcStart).c_str()));
+		}
+	}
+
+	CheckObjectCreateTypeRef(mExpectingType, objCreateExpr->mNewNode);			
 
 	BfAttributeState attributeState;	
 	attributeState.mTarget = BfAttributeTargets_Alloc;

+ 10 - 2
IDEHelper/Compiler/BfPrinter.cpp

@@ -1613,7 +1613,15 @@ void BfPrinter::Visit(BfObjectCreateExpression* newExpr)
 		ExpectSpace();
 	}
 
-	VisitChild(newExpr->mOpenToken);
+	auto _WriteToken = [&](BfAstNode* node, BfToken token)
+	{
+		if (node == NULL)
+			return;
+		Visit(node);
+		Write(BfTokenToString(token));
+	};
+
+	_WriteToken(newExpr->mOpenToken, BfToken_LParen);
 	for (int i = 0; i < (int)newExpr->mArguments.size(); i++)
 	{
 		if (i > 0)
@@ -1623,7 +1631,7 @@ void BfPrinter::Visit(BfObjectCreateExpression* newExpr)
 		}
 		VisitChild(newExpr->mArguments[i]);		
 	}
-	VisitChild(newExpr->mCloseToken);			
+	_WriteToken(newExpr->mCloseToken, BfToken_RParen);	
 }
 
 void BfPrinter::Visit(BfBoxExpression* boxExpr)