From 7ddec857f66158ed4aa488193cd9bb820936cd08 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 25 Apr 2022 13:45:18 -0700 Subject: [PATCH] Fixed Emit marker in generic types where unspecialized has no emission --- .../Beefy2D/src/theme/dark/DarkEditWidget.bf | 15 +- IDE/src/ui/SourceEditWidgetContent.bf | 19 +- IDE/src/ui/SourceViewPanel.bf | 12 +- IDEHelper/Compiler/BfCompiler.cpp | 205 +++++++++++++----- IDEHelper/Compiler/BfExprEvaluator.cpp | 3 +- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 2 +- 6 files changed, 179 insertions(+), 77 deletions(-) diff --git a/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf b/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf index d0dd2e33..8a1d7975 100644 --- a/BeefLibs/Beefy2D/src/theme/dark/DarkEditWidget.bf +++ b/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); + } } } diff --git a/IDE/src/ui/SourceEditWidgetContent.bf b/IDE/src/ui/SourceEditWidgetContent.bf index 3bb9b23c..5ccb9e55 100644 --- a/IDE/src/ui/SourceEditWidgetContent.bf +++ b/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); diff --git a/IDE/src/ui/SourceViewPanel.bf b/IDE/src/ui/SourceViewPanel.bf index 29273d4b..4653f8e7 100644 --- a/IDE/src/ui/SourceViewPanel.bf +++ b/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)); } } } diff --git a/IDEHelper/Compiler/BfCompiler.cpp b/IDEHelper/Compiler/BfCompiler.cpp index ef909ef1..0da56eed 100644 --- a/IDEHelper/Compiler/BfCompiler.cpp +++ b/IDEHelper/Compiler/BfCompiler.cpp @@ -9759,8 +9759,54 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo SetAndRestoreValue prevCompilerResolvePassData(bfCompiler->mResolvePassData, resolvePassData); SetAndRestoreValue prevPassInstance(bfCompiler->mPassInstance, &bfPassInstance); + HashSet typeHashSet; + for (auto typeDef : bfParser->mTypeDefs) + typeHashSet.Add(typeDef); + Dictionary foundTypeIds; + struct _EmitSource + { + BfParser* mEmitParser; + bool mIsPrimary; + }; + Dictionary> 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* 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); - - auto typeDef = typeInst->mTypeDef; - if (partialIdx > 0) - typeDef = typeDef->mPartials[partialIdx]; - - 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; - - int startLine = 0; - int startLineChar = 0; - emitParser->GetLineCharAtIdx(kv.mValue.mSrcStart, startLine, startLineChar); - - int srcEnd = kv.mValue.mSrcEnd - 1; - while (srcEnd >= kv.mValue.mSrcStart) + for (auto& kv : typeInst->mCeTypeInfo->mEmitSourceMap) { - char c = emitParser->mSrc[srcEnd]; - if (!::isspace((uint8)c)) - break; - srcEnd--; + int partialIdx = (int)(kv.mKey >> 32); + int charIdx = (int)(kv.mKey & 0xFFFFFFFF); + + auto typeDef = typeInst->mTypeDef; + if (partialIdx > 0) + typeDef = typeDef->mPartials[partialIdx]; + + auto parser = typeDef->GetDefinition()->GetLastSource()->ToParser(); + if (parser == NULL) + continue; + + if (!FileNameEquals(parser->mFileName, bfParser->mFileName)) + continue; + + auto bfParser = typeDef->GetLastSource()->ToParser(); + auto emitParser = typeInst->mTypeDef->GetLastSource()->ToParser(); + if (emitParser == NULL) + continue; + + Dictionary* 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; - 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); + if (!FileNameEquals(parser->mFileName, bfParser->mFileName)) + return; + + Dictionary* 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); + } + } + }; + + _CheckTypeDef(typeInst->mTypeDef); + for (auto partialTypeDef : typeInst->mTypeDef->mPartials) + _CheckTypeDef(partialTypeDef); } } } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index bc1737bf..b5034475 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/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; diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index ab57b434..37f7cb60 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/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 += ":";