diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 5ea75988..2984a042 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -16739,14 +16739,8 @@ void BfExprEvaluator::CreateObject(BfObjectCreateExpression* objCreateExpr, BfAs if (!needsCall) { - for (auto& fieldInst : typeInstance->mFieldInstances) - { - if (fieldInst.IsAppendedObject()) - { - needsCall = true; - break; - } - } + if (typeInstance->HasAppendedField(true)) + needsCall = true; } if (needsCall) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp index 9b8af084..c5145da0 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.cpp +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.cpp @@ -2483,6 +2483,20 @@ bool BfTypeInstance::BaseHasAppendCtor() return false; } +bool BfTypeInstance::HasAppendedField(bool checkBase) +{ + for (auto& fieldInstance : mFieldInstances) + { + if (fieldInstance.IsAppendedObject()) + return true; + } + + if ((checkBase) && (mBaseType != NULL)) + return mBaseType->HasAppendedField(checkBase); + + return false; +} + void BfTypeInstance::ReportMemory(MemReporter* memReporter) { if (mGenericTypeInfo != NULL) diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index cd27b64c..afba9027 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -1020,7 +1020,7 @@ public: BfExpression* GetParamInitializer(int paramIdx); BfTypeReference* GetParamTypeRef(int paramIdx); BfIdentifierNode* GetParamNameNode(int paramIdx); - int DbgGetVirtualMethodNum(); + int DbgGetVirtualMethodNum(); void GetIRFunctionInfo(BfModule* module, BfIRType& returnType, SizedArrayImpl& paramTypes, bool forceStatic = false); int GetIRFunctionParamCount(BfModule* module); @@ -2219,6 +2219,7 @@ public: bool IsAnonymousInitializerType(); bool HasAppendCtor(); bool BaseHasAppendCtor(); + bool HasAppendedField(bool checkBase); virtual void ReportMemory(MemReporter* memReporter) override; };