| 2436 | } |
| 2437 | |
| 2438 | void BfModule::UpdateCEEmit(CeEmitContext* ceEmitContext, BfTypeInstance* typeInstance, BfTypeDef* declaringType, const StringImpl& ctxString, BfAstNode* refNode, BfCeTypeEmitSourceKind emitSourceKind) |
| 2439 | { |
| 2440 | for (int ifaceTypeId : ceEmitContext->mInterfaces) |
| 2441 | typeInstance->mCeTypeInfo->mPendingInterfaces.Add(ifaceTypeId); |
| 2442 | |
| 2443 | if (ceEmitContext->mEmitData.IsEmpty()) |
| 2444 | return; |
| 2445 | |
| 2446 | String src; |
| 2447 | |
| 2448 | // if (typeInstance->mTypeDef->mEmitParent != NULL) |
| 2449 | // src += "\n\n"; |
| 2450 | |
| 2451 | // src += "// Code emission in "; |
| 2452 | // src += ctxString; |
| 2453 | // src += "\n\n"; |
| 2454 | src += ceEmitContext->mEmitData; |
| 2455 | ceEmitContext->mEmitData.Clear(); |
| 2456 | |
| 2457 | BfCEParseContext ceParseContext = CEEmitParse(typeInstance, declaringType, src, refNode, emitSourceKind); |
| 2458 | auto emitParser = typeInstance->mTypeDef->mSource->ToParser(); |
| 2459 | |
| 2460 | auto typeDeclaration = emitParser->mAlloc->Alloc<BfTypeDeclaration>(); |
| 2461 | |
| 2462 | BfReducer bfReducer; |
| 2463 | bfReducer.mSource = emitParser; |
| 2464 | bfReducer.mPassInstance = mCompiler->mPassInstance; |
| 2465 | bfReducer.mAlloc = emitParser->mAlloc; |
| 2466 | bfReducer.mSystem = mSystem; |
| 2467 | bfReducer.mCurTypeDecl = typeDeclaration; |
| 2468 | typeDeclaration->mDefineNode = emitParser->mRootNode; |
| 2469 | bfReducer.HandleTypeDeclaration(typeDeclaration, NULL); |
| 2470 | |
| 2471 | BfDefBuilder defBuilder(mSystem); |
| 2472 | defBuilder.mCurSource = emitParser; |
| 2473 | defBuilder.mCurTypeDef = typeInstance->mTypeDef; |
| 2474 | defBuilder.mCurDeclaringTypeDef = typeInstance->mTypeDef; |
| 2475 | |
| 2476 | defBuilder.mPassInstance = mCompiler->mPassInstance; |
| 2477 | defBuilder.mIsComptime = true; |
| 2478 | defBuilder.DoVisitChild(typeDeclaration->mDefineNode); |
| 2479 | defBuilder.FinishTypeDef(typeInstance->mTypeDef->mTypeCode == BfTypeCode_Enum); |
| 2480 | |
| 2481 | FinishCEParseContext(refNode, typeInstance, &ceParseContext); |
| 2482 | |
| 2483 | if (emitParser->mSourceClassifier != NULL) |
| 2484 | { |
| 2485 | emitParser->mSourceClassifier->VisitChild(emitParser->mRootNode); |
| 2486 | emitParser->mSourceClassifier->DeferNodes(emitParser->mSidechannelRootNode); |
| 2487 | emitParser->mSourceClassifier->DeferNodes(emitParser->mErrorRootNode); |
| 2488 | } |
| 2489 | |
| 2490 | if (typeInstance->mTypeDef->mEmitParent != NULL) |
| 2491 | { |
| 2492 | // Remove generated fields like the 'underlying type' enum field |
| 2493 | typeInstance->mFieldInstances.Resize(typeInstance->mTypeDef->mEmitParent->mFields.mSize); |
| 2494 | } |
| 2495 | } |
nothing calls this directly
no test coverage detected