diff --git a/BeefLibs/corlib/src/Attribute.bf b/BeefLibs/corlib/src/Attribute.bf index f7df17f4..e536ff13 100644 --- a/BeefLibs/corlib/src/Attribute.bf +++ b/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 { diff --git a/IDE/src/ui/AutoComplete.bf b/IDE/src/ui/AutoComplete.bf index b95be587..9af94002 100644 --- a/IDE/src/ui/AutoComplete.bf +++ b/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, '|'); diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index cd6adf36..9ea883cf 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/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; diff --git a/IDEHelper/Compiler/BfPrinter.cpp b/IDEHelper/Compiler/BfPrinter.cpp index 36463b5b..02d18d6f 100644 --- a/IDEHelper/Compiler/BfPrinter.cpp +++ b/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)