فهرست منبع

Fixed Emit marker in generic types where unspecialized has no emission

Brian Fiete 3 سال پیش
والد
کامیت
7ddec857f6

+ 10 - 5
BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf

@@ -826,11 +826,16 @@ namespace Beefy.theme.dark
 
 			if (mLineRange != null)
 			{
-				var lineAndColumn = CursorLineAndColumn;
-				if (lineAndColumn.mLine < mLineRange.Value.Start)
-					CursorLineAndColumn = .(mLineRange.Value.Start, lineAndColumn.mColumn);
-				else if (lineAndColumn.mLine >= mLineRange.Value.End)
-					CursorLineAndColumn = .(mLineRange.Value.End - 1, lineAndColumn.mColumn);
+				if (mLineRange.Value.Length == 0)
+					CursorLineAndColumn = .(0, 0);
+				else
+				{
+					var lineAndColumn = CursorLineAndColumn;
+					if (lineAndColumn.mLine < mLineRange.Value.Start)
+						CursorLineAndColumn = .(mLineRange.Value.Start, lineAndColumn.mColumn);
+					else if (lineAndColumn.mLine >= mLineRange.Value.End)
+						CursorLineAndColumn = .(mLineRange.Value.End - 1, lineAndColumn.mColumn);
+				}
 			}
 		}
 

+ 5 - 14
IDE/src/ui/SourceEditWidgetContent.bf

@@ -229,7 +229,6 @@ namespace IDE.ui
 
 					mSourceViewPanel.Show(emitPath, false, null);
 					mSourceViewPanel.mEditWidget.mEditWidgetContent.mIsReadOnly = true;
-					mSourceViewPanel.mEmitRevision = emitEmbed.mRevision;
 					AddWidget(mSourceViewPanel);
 
 					mSourceViewPanel.mEditWidget.mOnGotFocus.Add(new (val1) =>
@@ -381,7 +380,8 @@ namespace IDE.ui
 							mAwaitingLoad = true;
 					}
 
-					if (mSourceViewPanel.mEditWidget.mEditWidgetContent.mData.mTextLength == 0)
+					var ewc = (SourceEditWidgetContent)mSourceViewPanel.mEditWidget.mEditWidgetContent;
+					if ((ewc.mLineRange.GetValueOrDefault().Length != 0) && (mSourceViewPanel.mEditWidget.mEditWidgetContent.mData.mTextLength == 0))
 						mAwaitingLoad = true;
 
 					if ((mAwaitingLoad) && (gApp.mUpdateCnt % 4 == 0))
@@ -499,8 +499,6 @@ namespace IDE.ui
 			public float mOpenPct;
 			public int32 mAnchorId;
 			public int32 mCollapseIndex;
-			public int32 mRevision;
-			public int32 mPartialIdx;
 			public int32 mStartLine;
 			public int32 mEndLine;
 			public View mView;
@@ -563,11 +561,10 @@ namespace IDE.ui
 				case Type = 'T';
 				case UsingNamespaces = 'U';
 				case Unknown = '?';
-				case EmitInType = 't';
-				case EmitInMethod = 'm';
+				case Emit = 'e';
 				case EmitAddType = '+';
 
-				public bool IsEmit => (this == .EmitInType) || (this == .EmitInMethod);
+				public bool IsEmit => (this == .Emit);
 			}
 
 			public Kind mKind;
@@ -597,8 +594,6 @@ namespace IDE.ui
 		{
 			public SourceEditWidgetContent.CollapseEntry.Kind mKind;
 			public int32 mTypeNameIdx;
-			public int32 mRevision;
-			public int32 mPartialIdx;
 			public int32 mAnchorIdx;
 			public int32 mStartLine;
 			public int32 mEndLine;
@@ -5706,9 +5701,7 @@ namespace IDE.ui
 					emitEmbed.mAnchorId = emitData.mAnchorId;
 					emitEmbed.mEmitKind = emitData.mKind;
 					emitEmbed.mTypeName = mCollapseTypeNames[emitData.mTypeNameIdx];
-					emitEmbed.mRevision = emitData.mRevision;
-					emitEmbed.mPartialIdx = emitData.mPartialIdx;
-
+					
 					if (emitEmbed.mView != null)
 					{
 						Range range = .(emitData.mStartLine, emitData.mEndLine);
@@ -6296,8 +6289,6 @@ namespace IDE.ui
 					EmitData emitData;
 					emitData.mKind = kind;
 					emitData.mTypeNameIdx = int32.Parse(itr.GetNext().Value);
-					emitData.mRevision = int32.Parse(itr.GetNext().Value);
-					emitData.mPartialIdx = int32.Parse(itr.GetNext().Value);
 					emitData.mAnchorIdx = int32.Parse(itr.GetNext().Value);
 					emitData.mStartLine = int32.Parse(itr.GetNext().Value);
 					emitData.mEndLine = int32.Parse(itr.GetNext().Value);

+ 6 - 6
IDE/src/ui/SourceViewPanel.bf

@@ -2182,12 +2182,12 @@ namespace IDE.ui
 						for (var emitEmbedData in resolveParams.mEmitEmbeds)
 						{
 							var data = resolvePassData.GetEmitEmbedData(emitEmbedData.mTypeName, var srcLength, var revision);
-							if (srcLength > 0)
-							{
-								emitEmbedData.mCharData = new EditWidgetContent.CharData[srcLength+1] (?);
-								emitEmbedData.mCharData[srcLength] = default;
-								Internal.MemCpy(emitEmbedData.mCharData.Ptr, data, srcLength * strideof(EditWidgetContent.CharData));
-							}
+							if (srcLength < 0)
+								srcLength = 0;
+
+							emitEmbedData.mCharData = new EditWidgetContent.CharData[srcLength+1] (?);
+							emitEmbedData.mCharData[srcLength] = default;
+							Internal.MemCpy(emitEmbedData.mCharData.Ptr, data, srcLength * strideof(EditWidgetContent.CharData));
 						}
 					}
 				}

+ 152 - 45
IDEHelper/Compiler/BfCompiler.cpp

@@ -9759,8 +9759,54 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
 	SetAndRestoreValue<BfResolvePassData*> prevCompilerResolvePassData(bfCompiler->mResolvePassData, resolvePassData);
 	SetAndRestoreValue<BfPassInstance*> prevPassInstance(bfCompiler->mPassInstance, &bfPassInstance);
 
+	HashSet<BfTypeDef*> typeHashSet;
+	for (auto typeDef : bfParser->mTypeDefs)
+		typeHashSet.Add(typeDef);
+
 	Dictionary<int, int> foundTypeIds;
 
+	struct _EmitSource
+	{
+		BfParser* mEmitParser;
+		bool mIsPrimary;
+	};
+	Dictionary<BfTypeDef*, Dictionary<int, _EmitSource>> emitLocMap;
+	
+	for (auto type : bfCompiler->mContext->mResolvedTypes)
+	{
+		auto typeInst = type->ToTypeInstance();
+		if (typeInst == NULL)
+			continue;
+
+		if (typeHashSet.Contains(typeInst->mTypeDef->GetLatest()))
+		{
+			if (typeInst->IsSpecializedType())
+			{
+				if (typeInst->mCeTypeInfo == NULL)
+					continue;
+
+				for (auto& kv : typeInst->mCeTypeInfo->mEmitSourceMap)
+				{
+					int partialIdx = (int)(kv.mKey >> 32);
+					int charIdx = (int)(kv.mKey & 0xFFFFFFFF);
+
+					auto typeDef = typeInst->mTypeDef;
+					if (partialIdx > 0)
+						typeDef = typeDef->mPartials[partialIdx];
+				
+					auto emitParser = typeInst->mTypeDef->GetLastSource()->ToParser();
+
+					Dictionary<int, _EmitSource>* map = NULL;
+					emitLocMap.TryAdd(typeDef->GetLatest(), NULL, &map);
+					_EmitSource emitSource;
+					emitSource.mEmitParser = emitParser;
+					emitSource.mIsPrimary = false;
+					(*map)[charIdx] = emitSource;
+				}
+			}
+		}
+	}
+
 	for (auto typeDef : bfParser->mTypeDefs)
 	{
 		auto useTypeDef = typeDef;
@@ -9771,6 +9817,34 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
 				continue;
 		}
 
+		auto _GetTypeEmbedId = [&](BfTypeInstance* typeInst, BfParser* emitParser)
+		{			
+			int* keyPtr = NULL;
+			int* valuePtr = NULL;
+			if (foundTypeIds.TryAdd(typeInst->mTypeId, &keyPtr, &valuePtr))
+			{
+				*valuePtr = foundTypeIds.mCount - 1;
+				outString += "+";
+
+				if (emitParser == NULL)
+				{					
+					String typeName;
+					outString += typeInst->mTypeDef->mProject->mName;
+					outString += ":";
+					outString += bfCompiler->mContext->mScratchModule->TypeToString(typeInst, BfTypeNameFlags_None);																
+				}
+				else
+				{
+					int dollarPos = (int)emitParser->mFileName.LastIndexOf('$');
+					if (dollarPos == -1)
+						return -1;
+					outString += emitParser->mFileName.Substring(dollarPos + 1);
+				}
+				outString += "\n";
+			}
+			return *valuePtr;
+		};
+
 		auto type = bfCompiler->mContext->mScratchModule->ResolveTypeDef(useTypeDef);
 		if (type == NULL)
 			continue;
@@ -9778,9 +9852,6 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
 		{
 			auto origTypeInst = typeInst;
 
-			if (typeInst->mCeTypeInfo == NULL)
-				continue;
-			
 			for (auto checkIdx = explicitEmitTypes.mSize - 1; checkIdx >= 0; checkIdx--)
 			{
 				auto checkType = explicitEmitTypes[checkIdx];
@@ -9792,59 +9863,95 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
 				}
 			}
 
-			for (auto& kv : typeInst->mCeTypeInfo->mEmitSourceMap)
+			if (typeInst->mCeTypeInfo != NULL)
 			{
-				int partialIdx = (int)(kv.mKey >> 32);
-				int charIdx = (int)(kv.mKey & 0xFFFFFFFF);
+				for (auto& kv : typeInst->mCeTypeInfo->mEmitSourceMap)
+				{
+					int partialIdx = (int)(kv.mKey >> 32);
+					int charIdx = (int)(kv.mKey & 0xFFFFFFFF);
 
-				auto typeDef = typeInst->mTypeDef;
-				if (partialIdx > 0)
-					typeDef = typeDef->mPartials[partialIdx];
+					auto typeDef = typeInst->mTypeDef;
+					if (partialIdx > 0)
+						typeDef = typeDef->mPartials[partialIdx];
 
-				auto parser = typeDef->GetDefinition()->GetLastSource()->ToParser();
-				if (parser == NULL)
-					continue;
+					auto parser = typeDef->GetDefinition()->GetLastSource()->ToParser();
+					if (parser == NULL)
+						continue;
 
-				if (!FileNameEquals(parser->mFileName, bfParser->mFileName))
-					continue;
-				
-				auto emitParser = typeInst->mTypeDef->GetLastSource()->ToParser();
-				if (emitParser == NULL)
-					continue;
+					if (!FileNameEquals(parser->mFileName, bfParser->mFileName))
+						continue;
 
-				int startLine = 0;
-				int startLineChar = 0;
-				emitParser->GetLineCharAtIdx(kv.mValue.mSrcStart, startLine, startLineChar);
+					auto bfParser = typeDef->GetLastSource()->ToParser();
+					auto emitParser = typeInst->mTypeDef->GetLastSource()->ToParser();
+					if (emitParser == NULL)
+						continue;
 
-				int srcEnd = kv.mValue.mSrcEnd - 1;
-				while (srcEnd >= kv.mValue.mSrcStart)
-				{
-					char c = emitParser->mSrc[srcEnd];
-					if (!::isspace((uint8)c))
-						break;
-					srcEnd--;
+					Dictionary<int, _EmitSource>* map = NULL;
+					if (emitLocMap.TryGetValue(typeDef, &map))
+					{
+						_EmitSource emitSource;
+						emitSource.mEmitParser = emitParser;
+						emitSource.mIsPrimary = true;
+						(*map)[charIdx] = emitSource;
+					}
+
+					int startLine = 0;
+					int startLineChar = 0;
+					emitParser->GetLineCharAtIdx(kv.mValue.mSrcStart, startLine, startLineChar);
+
+					int srcEnd = kv.mValue.mSrcEnd - 1;
+					while (srcEnd >= kv.mValue.mSrcStart)
+					{
+						char c = emitParser->mSrc[srcEnd];
+						if (!::isspace((uint8)c))
+							break;
+						srcEnd--;
+					}
+
+					int embedId = _GetTypeEmbedId(typeInst, emitParser);
+					if (embedId == -1)
+						continue;
+
+					int endLine = 0;
+					int endLineChar = 0;
+					emitParser->GetLineCharAtIdx(srcEnd, endLine, endLineChar);
+					outString += StrFormat("e%d,%d,%d,%d\n", embedId, charIdx, startLine, endLine + 1);
 				}
+			}
 
-				int endLine = 0;
-				int endLineChar = 0;
-				emitParser->GetLineCharAtIdx(srcEnd, endLine, endLineChar);
-				
-				int dollarPos = (int)emitParser->mFileName.LastIndexOf('$');
-				if (dollarPos == -1)
-					continue;
+			if (typeInst->IsGenericTypeInstance())
+			{
+				String emitName;
 
-				int* keyPtr = NULL;
-				int* valuePtr = NULL;
-				if (foundTypeIds.TryAdd(typeInst->mTypeId, &keyPtr, &valuePtr))
+				auto _CheckTypeDef = [&](BfTypeDef* typeDef)
 				{
-					*valuePtr = foundTypeIds.mCount - 1;
-					outString += "+";
-					outString += emitParser->mFileName.Substring(dollarPos + 1);
-					outString += "\n";
-				}
+					auto parser = typeDef->GetDefinition()->GetLastSource()->ToParser();
+					if (parser == NULL)
+						return;
+
+					if (!FileNameEquals(parser->mFileName, bfParser->mFileName))
+						return;
+
+					Dictionary<int, _EmitSource>* map = NULL;
+					if (emitLocMap.TryGetValue(typeDef, &map))
+					{
+						for (auto kv : *map)
+						{
+							if (kv.mValue.mIsPrimary)
+								continue;
+
+							int embedId = _GetTypeEmbedId(typeInst, NULL);
+							if (embedId == -1)
+								continue;
+
+							outString += StrFormat("e%d,%d,%d,%d\n", embedId, kv.mKey, 0, 0);
+						}
+					}
+				};
 
-				outString += (kv.mValue.mKind == BfCeTypeEmitSourceKind_Method) ? 'm' : 't';
-				outString += StrFormat("%d,%d,%d,%d,%d,%d\n", *valuePtr, typeInst->mRevision, partialIdx, charIdx, startLine, endLine + 1);
+				_CheckTypeDef(typeInst->mTypeDef);
+				for (auto partialTypeDef : typeInst->mTypeDef->mPartials)
+					_CheckTypeDef(partialTypeDef);
 			}
 		}
 	}

+ 1 - 2
IDEHelper/Compiler/BfExprEvaluator.cpp

@@ -5869,8 +5869,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr
 			auto argValue = exprEvaluator.mResult;			
 			if (argValue)
 			{
-				//resolvedArg.mResolvedType = mModule->ResolveGenericType(argValue.mType);
-
+				mModule->mBfIRBuilder->PopulateType(argValue.mType);
 				resolvedArg.mResolvedType = argValue.mType;
 				if (resolvedArg.mResolvedType->IsRef())
 					argValue.mKind = BfTypedValueKind_Value;

+ 1 - 1
IDEHelper/Compiler/BfModuleTypeUtils.cpp

@@ -2079,7 +2079,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;		
+		String typeName;
 		typeName += typeInstance->mTypeDef->mProject->mName;
 		typeName += ":";