1
0
Fork 0
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:
Brian Fiete 2020-02-21 09:26:02 -08:00
parent b856f48006
commit 590df7aec7
6 changed files with 71 additions and 20 deletions

View file

@ -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)

View file

@ -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); }

View file

@ -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)
{

View file

@ -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;

View file

@ -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);

View file

@ -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)