diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index d3e0a5a9..0b66124c 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -5858,10 +5858,13 @@ namespace IDE.ui { if (entry.mParseRevision != data.mCollapseParseRevision) { - if (mEmbeds.GetAndRemove(entry.mAnchorLine) case .Ok(let val)) + if (mEmbeds.TryGet(entry.mAnchorLine, ?, var value)) { - //Debug.WriteLine($" Deleting(2) {val.value}"); - delete val.value; + if (!(value is EmitEmbed)) + { + mEmbeds.Remove(entry.mAnchorLine); + delete value; + } } @entry.Remove(); } @@ -6275,8 +6278,15 @@ namespace IDE.ui if (failed) { - if (mEmbeds.GetAndRemove(prevAnchorLine) case .Ok(let val)) - delete val.value; + if (mEmbeds.TryGet(prevAnchorLine, ?, var value)) + { + if (!(value is EmitEmbed)) + { + mEmbeds.Remove(prevAnchorLine); + delete value; + } + } + entry.mDeleted = true; } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index a45d8430..4d02735c 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -4843,7 +4843,7 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy typeInstance->mCeTypeInfo->mTypeIFaceMap = typeInstance->mCeTypeInfo->mNext->mTypeIFaceMap; typeInstance->mCeTypeInfo->mHash = typeInstance->mCeTypeInfo->mNext->mHash; } - + delete typeInstance->mCeTypeInfo->mNext; typeInstance->mCeTypeInfo->mNext = NULL; } @@ -4857,10 +4857,9 @@ void BfModule::DoPopulateType(BfType* resolvedTypeRef, BfPopulateType populateTy typeInstance->mCeTypeInfo->mTypeIFaceMap.Clear(); typeInstance->mCeTypeInfo->mHash = Val128(); } - - if ((typeInstance->mCeTypeInfo->mFailed) && - (prevHadEmissions) && - (typeInstance->mCeTypeInfo->mEmitSourceMap.IsEmpty())) + + if (((typeInstance->mCeTypeInfo->mFailed) || (typeInstance->mTypeDef->HasParsingFailed())) && + (prevHadEmissions)) { // Just add a marker to retain the previous open emits typeInstance->mCeTypeInfo->mEmitSourceMap[-1] = BfCeTypeEmitSource(); diff --git a/IDEHelper/Compiler/BfSystem.cpp b/IDEHelper/Compiler/BfSystem.cpp index 35235b06..57c1ef03 100644 --- a/IDEHelper/Compiler/BfSystem.cpp +++ b/IDEHelper/Compiler/BfSystem.cpp @@ -1030,6 +1030,22 @@ bool BfTypeDef::HasCustomAttributes() return false; } +bool BfTypeDef::HasParsingFailed() +{ + auto parser = mTypeDeclaration->GetParser(); + if ((parser != NULL) && (parser->mParsingFailed)) + return true; + + for (auto partial : mPartials) + { + parser = partial->mTypeDeclaration->GetParser(); + if ((parser != NULL) && (parser->mParsingFailed)) + return true; + } + + return false; +} + ////////////////////////////////////////////////////////////////////////// BfProject::BfProject() diff --git a/IDEHelper/Compiler/BfSystem.h b/IDEHelper/Compiler/BfSystem.h index d9c4ab7c..100efd8f 100644 --- a/IDEHelper/Compiler/BfSystem.h +++ b/IDEHelper/Compiler/BfSystem.h @@ -1219,6 +1219,7 @@ public: BfFieldDef* GetFieldByName(const StringImpl& name); bool HasAutoProperty(BfPropertyDeclaration* propertyDeclaration); bool ContainsPartial(BfTypeDef* partialTypeDef); + bool HasParsingFailed(); String GetAutoPropertyName(BfPropertyDeclaration* propertyDeclaration); BfAstNode* GetRefNode();