Skip to content

Commit

Permalink
Better handling of this/base for autocomplete, colorization, goto def
Browse files Browse the repository at this point in the history
  • Loading branch information
bfiete committed Feb 21, 2020
1 parent b856f48 commit 590df7a
Show file tree
Hide file tree
Showing 6 changed files with 71 additions and 20 deletions.
21 changes: 21 additions & 0 deletions IDEHelper/Compiler/BfAst.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
1 change: 1 addition & 0 deletions IDEHelper/Compiler/BfAst.h
Original file line number Diff line number Diff line change
Expand Up @@ -1031,6 +1031,7 @@ class BfAstNode
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); }
Expand Down
14 changes: 10 additions & 4 deletions IDEHelper/Compiler/BfAutoComplete.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2330,9 +2330,11 @@ void BfAutoComplete::CheckLocalRef(BfIdentifierNode* identifierNode, BfLocalVari
if (mResolveType == BfResolveType_GoToDefinition)
{
if (IsAutocompleteNode(identifierNode))
{
{
if (varDecl->mNameNode != NULL)
SetDefinitionLocation(varDecl->mNameNode);
else if (varDecl->mIsThis)
SetDefinitionLocation(mModule->mCurTypeInstance->mTypeDef->GetRefNode());
}
}
else if (mResolveType == BfResolveType_GetSymbolInfo)
Expand All @@ -2351,15 +2353,19 @@ void BfAutoComplete::CheckLocalRef(BfIdentifierNode* identifierNode, BfLocalVari
if (rootMethodInstance == NULL)
return;

auto resolvePassData = mModule->mCompiler->mResolvePassData;
mReplaceLocalId = varDecl->mLocalVarId;
if (varDecl->mIsThis)
return;

auto resolvePassData = mModule->mCompiler->mResolvePassData;
mDefType = mModule->mCurTypeInstance->mTypeDef;

mReplaceLocalId = varDecl->mLocalVarId;
mDefMethod = rootMethodInstance->mMethodDef;
if (mInsertStartIdx == -1)
{
mInsertStartIdx = identifierNode->GetSrcStart();
mInsertEndIdx = identifierNode->GetSrcEnd();
}
}
}
}
}
Expand Down
49 changes: 34 additions & 15 deletions IDEHelper/Compiler/BfExprEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -7760,19 +7760,20 @@ void BfExprEvaluator::Visit(BfQualifiedNameNode* nameNode)
}

void BfExprEvaluator::Visit(BfThisExpression* thisExpr)
{
{
mResult = mModule->GetThis();
if (!mResult)
{
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)
Expand All @@ -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);
}
Expand Down Expand Up @@ -13408,10 +13414,8 @@ void BfExprEvaluator::DoInvocation(BfAstNode* target, BfMethodBoundExpression* m
GetAutoComplete()->CheckMemberReference(qualifiedName->mLeft, qualifiedName->mDot, qualifiedName->mRight);

if (qualifiedName->mLeft->GetSrcLength() == 4)
{
StringT<16> leftName;
qualifiedName->mLeft->ToString(leftName);
if (leftName == "base")
{
if (CheckIsBase(qualifiedName->mLeft))
bypassVirtual = true;
}

Expand Down Expand Up @@ -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;
Expand Down
1 change: 1 addition & 0 deletions IDEHelper/Compiler/BfExprEvaluator.h
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ class BfExprEvaluator : public BfStructuralVisitor
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);
Expand Down
5 changes: 4 additions & 1 deletion IDEHelper/Compiler/BfSourceClassifier.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down

0 comments on commit 590df7a

Please sign in to comment.