1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-10 04:22:20 +02:00

Fixed Emit marker in generic types where unspecialized has no emission

This commit is contained in:
Brian Fiete 2022-04-25 13:45:18 -07:00
parent 1abccdedf8
commit 7ddec857f6
6 changed files with 179 additions and 77 deletions

View file

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

View file

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

View file

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

View file

@ -9759,8 +9759,54 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
SetAndRestoreValue<BfResolvePassData*> prevCompilerResolvePassData(bfCompiler->mResolvePassData, resolvePassData); SetAndRestoreValue<BfResolvePassData*> prevCompilerResolvePassData(bfCompiler->mResolvePassData, resolvePassData);
SetAndRestoreValue<BfPassInstance*> prevPassInstance(bfCompiler->mPassInstance, &bfPassInstance); SetAndRestoreValue<BfPassInstance*> prevPassInstance(bfCompiler->mPassInstance, &bfPassInstance);
HashSet<BfTypeDef*> typeHashSet;
for (auto typeDef : bfParser->mTypeDefs)
typeHashSet.Add(typeDef);
Dictionary<int, int> foundTypeIds; 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) for (auto typeDef : bfParser->mTypeDefs)
{ {
auto useTypeDef = typeDef; auto useTypeDef = typeDef;
@ -9771,6 +9817,34 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
continue; 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); auto type = bfCompiler->mContext->mScratchModule->ResolveTypeDef(useTypeDef);
if (type == NULL) if (type == NULL)
continue; continue;
@ -9778,9 +9852,6 @@ BF_EXPORT const char* BF_CALLTYPE BfCompiler_GetCollapseRegions(BfCompiler* bfCo
{ {
auto origTypeInst = typeInst; auto origTypeInst = typeInst;
if (typeInst->mCeTypeInfo == NULL)
continue;
for (auto checkIdx = explicitEmitTypes.mSize - 1; checkIdx >= 0; checkIdx--) for (auto checkIdx = explicitEmitTypes.mSize - 1; checkIdx >= 0; checkIdx--)
{ {
auto checkType = explicitEmitTypes[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); for (auto& kv : typeInst->mCeTypeInfo->mEmitSourceMap)
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)
{ {
char c = emitParser->mSrc[srcEnd]; int partialIdx = (int)(kv.mKey >> 32);
if (!::isspace((uint8)c)) int charIdx = (int)(kv.mKey & 0xFFFFFFFF);
break;
srcEnd--; 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<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; if (typeInst->IsGenericTypeInstance())
int endLineChar = 0; {
emitParser->GetLineCharAtIdx(srcEnd, endLine, endLineChar); String emitName;
int dollarPos = (int)emitParser->mFileName.LastIndexOf('$'); auto _CheckTypeDef = [&](BfTypeDef* typeDef)
if (dollarPos == -1)
continue;
int* keyPtr = NULL;
int* valuePtr = NULL;
if (foundTypeIds.TryAdd(typeInst->mTypeId, &keyPtr, &valuePtr))
{ {
*valuePtr = foundTypeIds.mCount - 1; auto parser = typeDef->GetDefinition()->GetLastSource()->ToParser();
outString += "+"; if (parser == NULL)
outString += emitParser->mFileName.Substring(dollarPos + 1); return;
outString += "\n";
}
outString += (kv.mValue.mKind == BfCeTypeEmitSourceKind_Method) ? 'm' : 't'; if (!FileNameEquals(parser->mFileName, bfParser->mFileName))
outString += StrFormat("%d,%d,%d,%d,%d,%d\n", *valuePtr, typeInst->mRevision, partialIdx, charIdx, startLine, endLine + 1); 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);
}
}
};
_CheckTypeDef(typeInst->mTypeDef);
for (auto partialTypeDef : typeInst->mTypeDef->mPartials)
_CheckTypeDef(partialTypeDef);
} }
} }
} }

View file

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