From 234b3064ff5c244f11033968f8c9a064f4da3320 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 8 Feb 2020 06:13:48 -0800 Subject: [PATCH] Added a fixit for adding a field from an identifier error --- IDEHelper/Compiler/BfAutoComplete.cpp | 5 +++- IDEHelper/Compiler/BfExprEvaluator.cpp | 38 ++++++++++++++++++++------ 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index f9c27ebe..2bdc0a37 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -2719,7 +2719,10 @@ void BfAutoComplete::FixitAddMember(BfTypeInstance* typeInst, BfType* fieldType, } } - AddEntry(AutoCompleteEntry("fixit", StrFormat("Create field '%s' in '%s'\taddField|%s||%s", fieldName.c_str(), fullName.c_str(), + const char* memberName = "field"; + if (isStatic) + memberName = "static field"; + AddEntry(AutoCompleteEntry("fixit", StrFormat("Create %s '%s' in '%s'\taddField|%s||%s", memberName, fieldName.c_str(), fullName.c_str(), FixitGetLocation(parser->mParserData, fileLoc).c_str(), fieldStr.c_str()).c_str())); } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 68e07c63..2e40bb92 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -3098,6 +3098,20 @@ void BfExprEvaluator::Visit(BfIdentifierNode* identifierNode) if ((!mResult) && (mPropDef == NULL)) { mModule->CheckTypeRefFixit(identifierNode); + if ((autoComplete != NULL) && (autoComplete->CheckFixit(identifierNode))) + { + if (mModule->mCurMethodInstance != NULL) + { + BfType* fieldType = mExpectingType; + if (fieldType == NULL) + fieldType = mModule->mContext->mBfObjectType; + + autoComplete->FixitAddMember(mModule->mCurTypeInstance, fieldType, identifierNode->ToString(), true, mModule->mCurTypeInstance); + if (!mModule->mCurMethodInstance->mMethodDef->mIsStatic) + autoComplete->FixitAddMember(mModule->mCurTypeInstance, fieldType, identifierNode->ToString(), false, mModule->mCurTypeInstance); + } + } + mModule->Fail("Identifier not found", identifierNode); } } @@ -6696,7 +6710,7 @@ BfTypedValue BfExprEvaluator::MatchMethod(BfAstNode* targetSrc, BfMethodBoundExp else if (target.mType != NULL) mModule->Fail(StrFormat("Method '%s' does not exist in type '%s'", methodName.c_str(), mModule->TypeToString(target.mType).c_str()), targetSrc); else - mModule->Fail(StrFormat("Method '%s' does not exist", methodName.c_str()), targetSrc); + mModule->Fail(StrFormat("Method '%s' does not exist", methodName.c_str()), targetSrc); return BfTypedValue(); } @@ -8903,9 +8917,13 @@ void BfExprEvaluator::Visit(BfDelegateBindExpression* delegateBindExpr) BfFunctionBindResult bindResult; bindResult.mSkipMutCheck = true; // Allow operating on copies - mFunctionBindResult = &bindResult; - DoInvocation(delegateBindExpr->mTarget, delegateBindExpr, args, methodGenericArguments); - mFunctionBindResult = NULL; + // + { + SetAndRestoreValue prevExpectingType(mExpectingType, methodInstance->mReturnType); + mFunctionBindResult = &bindResult; + DoInvocation(delegateBindExpr->mTarget, delegateBindExpr, args, methodGenericArguments); + mFunctionBindResult = NULL; + } SetMethodElementType(delegateBindExpr->mTarget); @@ -14531,10 +14549,15 @@ void BfExprEvaluator::AssignDeferrredTupleAssignData(BfAssignmentExpression* ass { AssignDeferrredTupleAssignData(assignExpr, *child.mInnerTuple, elementValue); delete child.mInnerTuple; + child.mInnerTuple = NULL; } else { - child.mExprEvaluator->PerformAssignment(assignExpr, true, elementValue); + if (child.mExprEvaluator->mResult) + { + child.mExprEvaluator->mBfEvalExprFlags = (BfEvalExprFlags)(child.mExprEvaluator->mBfEvalExprFlags | BfEvalExprFlags_NoAutoComplete); + child.mExprEvaluator->PerformAssignment(assignExpr, true, elementValue); + } } } @@ -14542,8 +14565,7 @@ void BfExprEvaluator::AssignDeferrredTupleAssignData(BfAssignmentExpression* ass { if (!elementValue) elementValue = mModule->GetDefaultTypedValue(fieldInstance->GetResolvedType()); - mModule->HandleVariableDeclaration(varDecl, elementValue); - + mModule->HandleVariableDeclaration(varDecl, elementValue); } } } @@ -16824,7 +16846,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfExpression* leftExpression, BfExp if (!leftValue) { if (!rightValue) - mModule->CreateValueFromExpression(rightExpression); + mModule->CreateValueFromExpression(rightExpression, mExpectingType); return; } if (leftValue.mType->IsRef())