mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-10 12:32:20 +02:00
Better handling of this/base for autocomplete, colorization, goto def
This commit is contained in:
parent
b856f48006
commit
590df7aec7
6 changed files with 71 additions and 20 deletions
|
@ -977,6 +977,27 @@ bool BfAstNode::Equals(const StringImpl& str)
|
|||
return strncmp(str.GetPtr(), source->mSrc + mSrcStart, len) == 0;
|
||||
}
|
||||
|
||||
bool BfAstNode::Equals(const char* str)
|
||||
{
|
||||
auto source = GetSourceData();
|
||||
const char* ptrLhs = source->mSrc + mSrcStart;
|
||||
const char* ptrLhsEnd = source->mSrc + mSrcEnd;
|
||||
const char* ptrRhs = str;
|
||||
|
||||
while (true)
|
||||
{
|
||||
char cRhs = *(ptrRhs++);
|
||||
if (cRhs == 0)
|
||||
return ptrLhs == ptrLhsEnd;
|
||||
if (ptrLhs == ptrLhsEnd)
|
||||
return false;
|
||||
char cLhs = *(ptrLhs++);
|
||||
if (cLhs != cRhs)
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
|
||||
void BfBlock::Init(const SizedArrayImpl<BfAstNode*>& vec, BfAstAllocator* alloc)
|
||||
|
|
|
@ -1031,6 +1031,7 @@ public:
|
|||
StringView ToStringView();
|
||||
void ToString(StringImpl& str);
|
||||
bool Equals(const StringImpl& str);
|
||||
bool Equals(const char* str);
|
||||
void Init(BfParser* bfParser);
|
||||
void Accept(BfStructuralVisitor* bfVisitor);
|
||||
static void ClassAccept(BfAstNode* node, BfStructuralVisitor* bfVisitor) { bfVisitor->Visit(node); }
|
||||
|
|
|
@ -2333,6 +2333,8 @@ void BfAutoComplete::CheckLocalRef(BfIdentifierNode* identifierNode, BfLocalVari
|
|||
{
|
||||
if (varDecl->mNameNode != NULL)
|
||||
SetDefinitionLocation(varDecl->mNameNode);
|
||||
else if (varDecl->mIsThis)
|
||||
SetDefinitionLocation(mModule->mCurTypeInstance->mTypeDef->GetRefNode());
|
||||
}
|
||||
}
|
||||
else if (mResolveType == BfResolveType_GetSymbolInfo)
|
||||
|
@ -2351,9 +2353,13 @@ void BfAutoComplete::CheckLocalRef(BfIdentifierNode* identifierNode, BfLocalVari
|
|||
if (rootMethodInstance == NULL)
|
||||
return;
|
||||
|
||||
if (varDecl->mIsThis)
|
||||
return;
|
||||
|
||||
auto resolvePassData = mModule->mCompiler->mResolvePassData;
|
||||
mReplaceLocalId = varDecl->mLocalVarId;
|
||||
mDefType = mModule->mCurTypeInstance->mTypeDef;
|
||||
|
||||
mReplaceLocalId = varDecl->mLocalVarId;
|
||||
mDefMethod = rootMethodInstance->mMethodDef;
|
||||
if (mInsertStartIdx == -1)
|
||||
{
|
||||
|
|
|
@ -7170,7 +7170,7 @@ void BfExprEvaluator::LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ig
|
|||
bool wasBaseLookup = false;
|
||||
if (auto qualifiedLeftName = BfNodeDynCast<BfQualifiedNameNode>(nameNode->mLeft))
|
||||
{
|
||||
if ((qualifiedLeftName->mRight->GetSrcLength() == 4) && (qualifiedLeftName->mRight->ToStringView() == "base"))
|
||||
if (CheckIsBase(qualifiedLeftName->mRight))
|
||||
{
|
||||
wasBaseLookup = true;
|
||||
auto type = mModule->ResolveTypeRef(qualifiedLeftName->mLeft, NULL);
|
||||
|
@ -7338,7 +7338,7 @@ void BfExprEvaluator::LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ig
|
|||
if (mPropDef != NULL)
|
||||
{
|
||||
mOrigPropTarget = origResult;
|
||||
if ((nameNode->mLeft->ToString() == "base") || (wasBaseLookup))
|
||||
if ((CheckIsBase(nameNode->mLeft)) || (wasBaseLookup))
|
||||
{
|
||||
mPropDefBypassVirtual = true;
|
||||
}
|
||||
|
@ -7367,7 +7367,7 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode*
|
|||
bool wasBaseLookup = false;
|
||||
if (auto qualifiedLeftName = BfNodeDynCast<BfQualifiedNameNode>(nameLeft))
|
||||
{
|
||||
if (qualifiedLeftName->mRight->ToString() == "base")
|
||||
if (CheckIsBase(qualifiedLeftName->mRight))
|
||||
{
|
||||
wasBaseLookup = true;
|
||||
auto type = mModule->ResolveTypeRef(qualifiedLeftName->mLeft, NULL);
|
||||
|
@ -7549,7 +7549,7 @@ void BfExprEvaluator::LookupQualifiedName(BfAstNode* nameNode, BfIdentifierNode*
|
|||
if (mPropDef != NULL)
|
||||
{
|
||||
mOrigPropTarget = origResult;
|
||||
if ((nameLeft->ToString() == "base") || (wasBaseLookup))
|
||||
if ((CheckIsBase(nameLeft)) || (wasBaseLookup))
|
||||
{
|
||||
mPropDefBypassVirtual = true;
|
||||
}
|
||||
|
@ -7767,12 +7767,13 @@ void BfExprEvaluator::Visit(BfThisExpression* thisExpr)
|
|||
mModule->Fail("Static methods don't have 'this'", thisExpr);
|
||||
return;
|
||||
}
|
||||
//if (mResult.mType->IsTypedPrimitive())
|
||||
{
|
||||
|
||||
mResultLocalVar = mModule->GetThisVariable();
|
||||
mResultFieldInstance = NULL;
|
||||
}
|
||||
auto autoComplete = GetAutoComplete();
|
||||
if ((autoComplete != NULL) && (autoComplete->IsAutocompleteNode(thisExpr)))
|
||||
autoComplete->SetDefinitionLocation(mModule->mCurTypeInstance->mTypeDef->GetRefNode());
|
||||
|
||||
mResultLocalVar = mModule->GetThisVariable();
|
||||
mResultFieldInstance = NULL;
|
||||
}
|
||||
|
||||
void BfExprEvaluator::Visit(BfBaseExpression* baseExpr)
|
||||
|
@ -7787,6 +7788,11 @@ void BfExprEvaluator::Visit(BfBaseExpression* baseExpr)
|
|||
auto baseType = mModule->mCurTypeInstance->mBaseType;
|
||||
if (baseType == NULL)
|
||||
baseType = mModule->mContext->mBfObjectType;
|
||||
|
||||
auto autoComplete = GetAutoComplete();
|
||||
if ((autoComplete != NULL) && (autoComplete->IsAutocompleteNode(baseExpr)))
|
||||
autoComplete->SetDefinitionLocation(baseType->mTypeDef->GetRefNode());
|
||||
|
||||
mModule->PopulateType(baseType, BfPopulateType_Data);
|
||||
mResult = mModule->Cast(baseExpr, mResult, baseType, BfCastFlags_Explicit);
|
||||
}
|
||||
|
@ -13409,9 +13415,7 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
|
|||
|
||||
if (qualifiedName->mLeft->GetSrcLength() == 4)
|
||||
{
|
||||
StringT<16> leftName;
|
||||
qualifiedName->mLeft->ToString(leftName);
|
||||
if (leftName == "base")
|
||||
if (CheckIsBase(qualifiedName->mLeft))
|
||||
bypassVirtual = true;
|
||||
}
|
||||
|
||||
|
@ -14281,6 +14285,21 @@ void BfExprEvaluator::MakeResultAsValue()
|
|||
mResultFieldInstance = NULL;
|
||||
}
|
||||
|
||||
bool BfExprEvaluator::CheckIsBase(BfAstNode* checkNode)
|
||||
{
|
||||
if (checkNode == NULL)
|
||||
return false;
|
||||
|
||||
auto autoComplete = GetAutoComplete();
|
||||
if ((autoComplete != NULL) && (autoComplete->IsAutocompleteNode(checkNode)))
|
||||
{
|
||||
if ((mModule->mCurTypeInstance != NULL) && (mModule->mCurTypeInstance->mBaseType != NULL))
|
||||
autoComplete->SetDefinitionLocation(mModule->mCurTypeInstance->mBaseType->mTypeDef->GetRefNode());
|
||||
}
|
||||
|
||||
return checkNode->Equals("base");
|
||||
}
|
||||
|
||||
bool BfExprEvaluator::CheckModifyResult(BfTypedValue typedVal, BfAstNode* refNode, const char* modifyType, bool onlyNeedsMut)
|
||||
{
|
||||
BfLocalVariable* localVar = NULL;
|
||||
|
|
|
@ -336,6 +336,7 @@ public:
|
|||
void MarkResultUsed();
|
||||
void MarkResultAssigned();
|
||||
void MakeResultAsValue();
|
||||
bool CheckIsBase(BfAstNode* checkNode);
|
||||
bool CheckModifyResult(BfTypedValue typeValue, BfAstNode* refNode, const char* modifyType, bool onlyNeedsMut = false);
|
||||
bool CheckGenericCtor(BfGenericParamType* genericParamType, BfResolvedArgs& argValues, BfAstNode* targetSrc);
|
||||
BfTypedValue LookupField(BfAstNode* targetSrc, BfTypedValue target, const StringImpl& fieldName, BfLookupFieldFlags flags = BfLookupFieldFlag_None);
|
||||
|
|
|
@ -234,7 +234,10 @@ void BfSourceClassifier::Visit(BfIdentifierNode* identifier)
|
|||
|
||||
Visit(identifier->ToBase());
|
||||
|
||||
SetElementType(identifier, BfSourceElementType_Identifier);
|
||||
if ((identifier->Equals("this")) || (identifier->Equals("base")))
|
||||
SetElementType(identifier, BfSourceElementType_Keyword);
|
||||
else
|
||||
SetElementType(identifier, BfSourceElementType_Identifier);
|
||||
}
|
||||
|
||||
void BfSourceClassifier::Visit(BfQualifiedNameNode* qualifiedName)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue