From 1360afbea1c581db22ce0a0aa7d910e979556a94 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Wed, 1 Jun 2022 11:00:33 -0700 Subject: [PATCH] Improved cross-project emit markers --- IDE/src/IDEUtils.bf | 7 +++++ IDE/src/ui/SourceEditWidgetContent.bf | 4 +-- IDEHelper/Compiler/BfCompiler.cpp | 22 +++++++------- IDEHelper/Compiler/BfModule.cpp | 3 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 37 +++++++++++++++++------- IDEHelper/Compiler/BfResolvedTypeUtils.h | 3 +- 6 files changed, 50 insertions(+), 26 deletions(-) diff --git a/IDE/src/IDEUtils.bf b/IDE/src/IDEUtils.bf index b915ca2f..f39761fc 100644 --- a/IDE/src/IDEUtils.bf +++ b/IDE/src/IDEUtils.bf @@ -45,6 +45,13 @@ namespace IDE if (lc != rc) return false; + if (lc == ':') + { + // If one has a subproject specified then ignore that + li = lhs.LastIndexOf(':'); + ri = rhs.LastIndexOf(':'); + } + if (lc == '<') { SkipGeneric(lhs, ref li); diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index 0b66124c..f51d83ff 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/IDE/src/ui/SourceEditWidgetContent.bf @@ -302,7 +302,7 @@ namespace IDE.ui DeleteAndNullify!(mGenericTypeFilter); mIgnoreChange = true; - int colonPos = typeName.IndexOf(':'); + int colonPos = typeName.LastIndexOf(':'); if (colonPos != -1) mGenericTypeCombo.Label = typeName.Substring(colonPos + 1); else @@ -321,7 +321,7 @@ namespace IDE.ui EntryLoop: for (var entry in mGenericTypeData) { StringView useName = entry.mTypeName; - int colonPos = useName.IndexOf(':'); + int colonPos = useName.LastIndexOf(':'); if (colonPos != -1) useName.RemoveFromStart(colonPos + 1); diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index c54877cd..2c2d5df1 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -9132,11 +9132,13 @@ void BfCompiler::GetTypeDefs(const StringImpl& inTypeName, Array& ty BfProject* project = NULL; int idx = 0; - int sep = (int)inTypeName.IndexOf(':'); + int sep = (int)inTypeName.LastIndexOf(':'); if (sep != -1) { + int startProjName = (int)inTypeName.LastIndexOf(':', sep - 1) + 1; + idx = sep + 1; - project = mSystem->GetProject(inTypeName.Substring(0, sep)); + project = mSystem->GetProject(inTypeName.Substring(startProjName, sep - startProjName)); } String typeName; @@ -9271,10 +9273,11 @@ BfType* BfCompiler::GetType(const StringImpl& fullTypeName) BfProject* activeProject = NULL; String typeName = fullTypeName; - int colonPos = (int)typeName.IndexOf(':'); + int colonPos = (int)typeName.LastIndexOf(':'); if (colonPos != -1) { - activeProject = mSystem->GetProject(typeName.Substring(0, colonPos)); + int startProjName = (int)typeName.LastIndexOf(':', colonPos - 1) + 1; + activeProject = mSystem->GetProject(typeName.Substring(startProjName, colonPos - startProjName)); typeName.Remove(0, colonPos + 1); } @@ -9923,10 +9926,7 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo if ((emitParser == NULL) || (!emitParser->mIsEmitted)) { - String typeName; - outString += typeInst->mTypeDef->mProject->mName; - outString += ":"; - outString += bfCompiler->mContext->mScratchModule->TypeToString(typeInst, BfTypeNameFlags_None); + outString += bfCompiler->mContext->mScratchModule->TypeToString(typeInst, BfTypeNameFlag_AddProjectName); } else { @@ -10416,10 +10416,8 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetGenericTypeInstances(BfCompiler* continue; if (typeInst->mTypeDef->GetDefinition()->GetLatest() == lookupTypeInst->mTypeDef->GetDefinition()->GetLatest()) - { - outString += typeInst->mTypeDef->mProject->mName; - outString += ":"; - outString += bfCompiler->mContext->mScratchModule->TypeToString(typeInst, BfTypeNameFlags_None); + { + outString += bfCompiler->mContext->mScratchModule->TypeToString(typeInst, BfTypeNameFlag_AddProjectName); outString += "\n"; } } diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 68c5e56e..0bfa3095 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -13894,7 +13894,8 @@ BfModuleMethodInstance BfModule::GetMethodInstance(BfTypeInstance* typeInst, BfM else { methodInstGroup->mOnDemandKind = BfMethodOnDemandKind_Decl_AwaitingDecl; - mOnDemandMethodCount++; + if (!mIsScratchModule) + mOnDemandMethodCount++; } } } diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 2386649b..a2c10aca 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -2176,11 +2176,7 @@ BfCEParseContext BfModule::CEEmitParse(BfTypeInstance* typeInstance, BfTypeDef* BfLogSys(mSystem, "Emit typeDef for type %p created %p parser %p typeDecl %p\n", typeInstance, emitTypeDef, emitParser, emitTypeDef->mTypeDeclaration); - String typeName; - typeName += typeInstance->mTypeDef->mProject->mName; - typeName += ":"; - - typeName += TypeToString(typeInstance, BfTypeNameFlags_None); + String typeName = TypeToString(typeInstance, BfTypeNameFlag_AddProjectName); if ((mCompiler->mResolvePassData != NULL) && (!mCompiler->mResolvePassData->mEmitEmbedEntries.IsEmpty())) mCompiler->mResolvePassData->mEmitEmbedEntries.TryGetValue(typeName, &emitEmbedEntry); @@ -5933,11 +5929,7 @@ void BfModule::DoTypeInstanceMethodProcessing(BfTypeInstance* typeInstance) if (isCurrentEntry) { - String typeName; - typeName += typeInstance->mTypeDef->mProject->mName; - typeName += ":"; - typeName += TypeToString(typeInstance, BfTypeNameFlags_None); - + String typeName = TypeToString(typeInstance, BfTypeNameFlag_AddProjectName); if (mCompiler->mResolvePassData->mEmitEmbedEntries.ContainsKey(typeName)) { wantsOnDemandMethods = false; @@ -14809,6 +14801,31 @@ void BfModule::DoTypeToString(StringImpl& str, BfType* resolvedType, BfTypeNameF { BP_ZONE("BfModule::DoTypeToString"); + if ((typeNameFlags & BfTypeNameFlag_AddProjectName) != 0) + { + BfProject* defProject = NULL; + + auto typeInst = resolvedType->ToTypeInstance(); + if (typeInst != NULL) + { + defProject = typeInst->mTypeDef->mProject; + str += defProject->mName; + str += ":"; + } + + SizedArray projectList; + BfTypeUtils::GetProjectList(resolvedType, &projectList, 0); + if (!projectList.IsEmpty()) + { + if (defProject != projectList[0]) + { + str += projectList[0]->mName; + str += ":"; + } + } + typeNameFlags = (BfTypeNameFlags)(typeNameFlags & ~BfTypeNameFlag_AddProjectName); + } + // This is clearly wrong. If we pass in @T0 from a generic type, this would immediately disable the ability to get its name /*if (resolvedType->IsUnspecializedType()) typeNameFlags = (BfTypeNameFlags)(typeNameFlags & ~BfTypeNameFlag_ResolveGenericParamNames);*/ diff --git a/IDEHelper/Compiler/BfResolvedTypeUtils.h b/IDEHelper/Compiler/BfResolvedTypeUtils.h index 9e65c9cf..0e6fb28a 100644 --- a/IDEHelper/Compiler/BfResolvedTypeUtils.h +++ b/IDEHelper/Compiler/BfResolvedTypeUtils.h @@ -57,7 +57,8 @@ enum BfTypeNameFlags : uint16 BfTypeNameFlag_InternalName = 0x100, // Use special delimiters to remove ambiguities (ie: '+' for inner types) BfTypeNameFlag_HideGlobalName = 0x200, BfTypeNameFlag_ExtendedInfo = 0x400, - BfTypeNameFlag_ShortConst = 0x800 + BfTypeNameFlag_ShortConst = 0x800, + BfTypeNameFlag_AddProjectName = 0x1000 }; enum BfMethodNameFlags : uint8