From e938ef3eabf426da0b576d64ea7732dab29a08b3 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sun, 23 Feb 2025 09:11:40 -0800 Subject: [PATCH] Fixed autocomplete in initializer expression over struct pointer --- IDEHelper/Compiler/BfExprEvaluator.cpp | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 6e5181cf..7389cfc5 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -12056,6 +12056,8 @@ void BfExprEvaluator::Visit(BfInitializerExpression* initExpr) if (!localDef->mResolvedType->IsVar()) mModule->AddLocalVariableDef(localDef, true, true); + auto autoComplete = mModule->mCompiler->GetAutoComplete(); + for (auto elementExpr : initExpr->mValues) { if ((mBfEvalExprFlags & BfEvalExprFlags_Comptime) != 0) @@ -12071,6 +12073,19 @@ void BfExprEvaluator::Visit(BfInitializerExpression* initExpr) BfTypedValue fieldResult; if (auto identifierNode = BfNodeDynCast(assignExpr->mLeft)) { + if ((autoComplete != NULL) && (autoComplete->IsAutocompleteNode(identifierNode))) + { + auto type = initValue.mType; + if (type->IsPointer()) + type = type->GetUnderlyingType(); + if (auto typeInst = type->ToTypeInstance()) + { + autoComplete->mInsertStartIdx = identifierNode->GetSrcStart(); + autoComplete->mInsertEndIdx = identifierNode->GetSrcEnd(); + autoComplete->AddTypeMembers(typeInst, false, true, identifierNode->ToString(), typeInst, false, true, false); + } + } + StringT<128> findName; identifierNode->ToString(findName); mResultFieldInstance = NULL; @@ -12138,17 +12153,18 @@ void BfExprEvaluator::Visit(BfInitializerExpression* initExpr) { BfBlock* block = BfNodeDynCast(elementExpr); - auto autoComplete = GetAutoComplete(); if ((autoComplete != NULL) && (autoComplete->IsAutocompleteNode(elementExpr))) { if (auto identiferNode = BfNodeDynCast(elementExpr)) { - auto typeInstance = initValue.mType->ToTypeInstance(); - if (typeInstance != NULL) + auto type = initValue.mType; + if (type->IsPointer()) + type = type->GetUnderlyingType(); + if (auto typeInst = type->ToTypeInstance()) { String filter; identiferNode->ToString(filter); - autoComplete->AddTypeMembers(typeInstance, false, true, filter, typeInstance, false, true, false); + autoComplete->AddTypeMembers(typeInst, false, true, filter, typeInst, false, true, false); } } }