| 4297 | } |
| 4298 | |
| 4299 | void 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 |
no test coverage detected