mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-08 19:48:20 +02:00
Better support for @ name prefixes
This commit is contained in:
parent
7691c414c3
commit
aa56542fae
12 changed files with 158 additions and 40 deletions
|
@ -27,8 +27,15 @@ AutoCompleteBase::~AutoCompleteBase()
|
|||
|
||||
AutoCompleteEntry* AutoCompleteBase::AddEntry(const AutoCompleteEntry& entry, const StringImpl& filter)
|
||||
{
|
||||
if (!DoesFilterMatch(entry.mDisplay, filter.c_str()))
|
||||
return NULL;
|
||||
if ((!DoesFilterMatch(entry.mDisplay, filter.c_str())) || (entry.mNamePrefixCount < 0))
|
||||
return NULL;
|
||||
return AddEntry(entry);
|
||||
}
|
||||
|
||||
AutoCompleteEntry* AutoCompleteBase::AddEntry(const AutoCompleteEntry& entry, const char* filter)
|
||||
{
|
||||
if ((!DoesFilterMatch(entry.mDisplay, filter)) || (entry.mNamePrefixCount < 0))
|
||||
return NULL;
|
||||
return AddEntry(entry);
|
||||
}
|
||||
|
||||
|
@ -44,9 +51,10 @@ AutoCompleteEntry* AutoCompleteBase::AddEntry(const AutoCompleteEntry& entry)
|
|||
{
|
||||
insertedEntry->mEntryType = entry.mEntryType;
|
||||
|
||||
int size = (int)strlen(entry.mDisplay) + 1;
|
||||
const char* display = entry.mDisplay;
|
||||
int size = (int)strlen(display) + 1;
|
||||
insertedEntry->mDisplay = (char*)mAlloc.AllocBytes(size);
|
||||
memcpy((char*)insertedEntry->mDisplay, entry.mDisplay, size);
|
||||
memcpy((char*)insertedEntry->mDisplay, display, size);
|
||||
}
|
||||
|
||||
return insertedEntry;
|
||||
|
@ -455,8 +463,15 @@ bool BfAutoComplete::IsAttribute(BfTypeInstance* typeInst)
|
|||
|
||||
void BfAutoComplete::AddMethod(BfTypeInstance* typeInstance, BfMethodDef* methodDef, BfMethodInstance* methodInstance, BfMethodDeclaration* methodDecl, const StringImpl& methodName, const StringImpl& filter)
|
||||
{
|
||||
int wantPrefixCount = 0;
|
||||
const char* filterStr = filter.c_str();
|
||||
while (filterStr[0] == '@')
|
||||
{
|
||||
filterStr++;
|
||||
wantPrefixCount++;
|
||||
}
|
||||
String replaceName;
|
||||
AutoCompleteEntry entry("method", methodName);
|
||||
AutoCompleteEntry entry("method", methodName, methodDef->mNamePrefixCount - wantPrefixCount);
|
||||
if (methodDecl != NULL)
|
||||
{
|
||||
if (methodDecl->mMixinSpecifier != NULL)
|
||||
|
@ -470,7 +485,7 @@ void BfAutoComplete::AddMethod(BfTypeInstance* typeInstance, BfMethodDef* method
|
|||
if (methodDef->mMethodType == BfMethodType_Extension)
|
||||
entry.mEntryType = "extmethod";
|
||||
|
||||
if (auto entryAdded = AddEntry(entry, filter))
|
||||
if (auto entryAdded = AddEntry(entry, filterStr))
|
||||
{
|
||||
if (methodDecl != NULL)
|
||||
{
|
||||
|
@ -654,8 +669,15 @@ void BfAutoComplete::AddCurrentTypes(BfTypeInstance* typeInst, const StringImpl&
|
|||
|
||||
void BfAutoComplete::AddField(BfTypeInstance* typeInst, BfFieldDef* fieldDef, BfFieldInstance* fieldInstance, const StringImpl& filter)
|
||||
{
|
||||
AutoCompleteEntry entry(GetTypeName(fieldInstance->mResolvedType), fieldDef->mName);
|
||||
if (auto entryAdded = AddEntry(entry, filter))
|
||||
int wantPrefixCount = 0;
|
||||
const char* filterStr = filter.c_str();
|
||||
while (filterStr[0] == '@')
|
||||
{
|
||||
filterStr++;
|
||||
wantPrefixCount++;
|
||||
}
|
||||
AutoCompleteEntry entry(GetTypeName(fieldInstance->mResolvedType), fieldDef->mName, fieldDef->mNamePrefixCount - wantPrefixCount);
|
||||
if (auto entryAdded = AddEntry(entry, filterStr))
|
||||
{
|
||||
auto documentation = (fieldDef->mFieldDeclaration != NULL) ? fieldDef->mFieldDeclaration->mDocumentation : NULL;
|
||||
if (CheckDocumentation(entryAdded, documentation))
|
||||
|
@ -693,11 +715,18 @@ void BfAutoComplete::AddField(BfTypeInstance* typeInst, BfFieldDef* fieldDef, Bf
|
|||
|
||||
void BfAutoComplete::AddProp(BfTypeInstance* typeInst, BfPropertyDef* propDef, const StringImpl& filter)
|
||||
{
|
||||
int wantPrefixCount = 0;
|
||||
const char* filterStr = filter.c_str();
|
||||
while (filterStr[0] == '@')
|
||||
{
|
||||
filterStr++;
|
||||
wantPrefixCount++;
|
||||
}
|
||||
BfCommentNode* documentation = NULL;
|
||||
if (propDef->mFieldDeclaration != NULL)
|
||||
documentation = propDef->mFieldDeclaration->mDocumentation;
|
||||
AutoCompleteEntry entry("property", propDef->mName);
|
||||
if (auto entryAdded = AddEntry(entry, filter))
|
||||
AutoCompleteEntry entry("property", propDef->mName, propDef->mNamePrefixCount - wantPrefixCount);
|
||||
if (auto entryAdded = AddEntry(entry, filterStr))
|
||||
{
|
||||
if (CheckDocumentation(entryAdded, documentation))
|
||||
{
|
||||
|
@ -1508,9 +1537,9 @@ void BfAutoComplete::CheckIdentifier(BfAstNode* identifierNode, bool isInExpress
|
|||
(*findIdx)++;
|
||||
}
|
||||
|
||||
if (*findIdx == varSkipCount)
|
||||
if (varSkipCount - local->mNamePrefixCount - *findIdx == 0)
|
||||
{
|
||||
if ((AddEntry(AutoCompleteEntry(GetTypeName(local->mResolvedType), local->mName), wantName)) && (mIsGetDefinition))
|
||||
if ((AddEntry(AutoCompleteEntry(GetTypeName(local->mResolvedType), local->mName, varSkipCount - local->mNamePrefixCount - *findIdx), wantName)) && (mIsGetDefinition))
|
||||
{
|
||||
}
|
||||
}
|
||||
|
@ -1628,8 +1657,16 @@ String BfAutoComplete::GetFilter(BfAstNode* node)
|
|||
auto bfParser = node->GetSourceData()->ToParser();
|
||||
int cursorIdx = bfParser->mCursorIdx;
|
||||
filter = filter.Substring(0, BF_CLAMP(cursorIdx - node->GetSrcStart(), 0, (int)filter.length()));
|
||||
mInsertEndIdx = cursorIdx;
|
||||
mInsertEndIdx = cursorIdx;
|
||||
}
|
||||
|
||||
const char* cPtr = filter.c_str();
|
||||
while (cPtr[0] == '@')
|
||||
{
|
||||
mInsertStartIdx++;
|
||||
cPtr++;
|
||||
}
|
||||
|
||||
return filter;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue