MCPcopy Create free account
hub / github.com/beefytech/Beef / ResolveConstField

Method ResolveConstField

IDEHelper/Compiler/BfModule.cpp:4299–4489  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

4297}
4298
4299void BfModule::ResolveConstField(BfTypeInstance* typeInstance, BfFieldInstance* fieldInstance, BfFieldDef* fieldDef, bool forceResolve)
4300{
4301 bool autoCompleteOnly = mCompiler->IsAutocomplete();
4302
4303 BfType* fieldType = NULL;
4304 if (fieldInstance != NULL)
4305 {
4306 fieldType = fieldInstance->GetResolvedType();
4307 if (fieldType == NULL)
4308 fieldType = ResolveTypeRef(fieldDef->mTypeRef);
4309 }
4310 else
4311 {
4312 BF_ASSERT(mCompiler->IsAutocomplete());
4313 SetAndRestoreValue<BfTypeInstance*> prevTypeInstance(mCurTypeInstance, typeInstance);
4314 if ((typeInstance->IsEnum()) && (fieldDef->mTypeRef == NULL))
4315 {
4316 fieldType = typeInstance;
4317 }
4318 else
4319 {
4320 auto isLet = (fieldDef->mTypeRef != NULL) && (fieldDef->mTypeRef->IsExact<BfLetTypeReference>());
4321 auto isVar = (fieldDef->mTypeRef != NULL) && (fieldDef->mTypeRef->IsExact<BfVarTypeReference>());
4322 if (isLet || isVar)
4323 fieldType = GetPrimitiveType(BfTypeCode_Var);
4324 else
4325 fieldType = ResolveTypeRef(fieldDef->mTypeRef, BfPopulateType_Identity, BfResolveTypeRefFlag_AllowInferredSizedArray);
4326 if (fieldType == NULL)
4327 fieldType = mContext->mBfObjectType;
4328 }
4329 }
4330
4331 if ((fieldInstance != NULL) && (fieldInstance->mConstIdx != -1) && (!forceResolve))
4332 return;
4333
4334 if (mContext->mFieldResolveReentrys.size() > 1)
4335 {
4336 if (mContext->mFieldResolveReentrys.IndexOf(fieldInstance, 1) != -1)
4337 {
4338 String failStr = "Circular data reference detected between the following fields:";
4339 for (int i = 1; i < (int)mContext->mFieldResolveReentrys.size(); i++)
4340 {
4341 if (i > 1)
4342 failStr += ",";
4343 failStr += "\n '" + TypeToString(typeInstance) + "." + mContext->mFieldResolveReentrys[i]->GetFieldDef()->mName + "'";
4344 }
4345 BfError* err = Fail(failStr, fieldDef->mFieldDeclaration);
4346 if (err)
4347 err->mIsPersistent = true;
4348 return;
4349 }
4350 }
4351
4352 mContext->mFieldResolveReentrys.push_back(fieldInstance);
4353 AutoPopBack<decltype (mContext->mFieldResolveReentrys)> popTypeResolveReentry(&mContext->mFieldResolveReentrys);
4354 if (fieldInstance == NULL)
4355 popTypeResolveReentry.Pop();
4356

Callers 3

DoPopulateTypeMethod · 0.80
LoadFieldMethod · 0.80

Calls 15

TypeToStringFunction · 0.85
FailFunction · 0.85
BfIRValueClass · 0.85
IsAutocompleteMethod · 0.80
GetResolvedTypeMethod · 0.80
GetFieldDefMethod · 0.80
GetInitializerMethod · 0.80
GetNameNodeMethod · 0.80
IsEnumCaseEntryMethod · 0.80
GetConstantByIdMethod · 0.80
CreateAddMethod · 0.80
IsEnumMethod · 0.45

Tested by

no test coverage detected