From 590df7aec73621ec7ebb28579e59d4b53a7c8130 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 21 Feb 2020 09:26:02 -0800 Subject: [PATCH] Better handling of this/base for autocomplete, colorization, goto def --- IDEHelper/Compiler/BfAst.cpp | 21 ++++++++++ IDEHelper/Compiler/BfAst.h | 1 + IDEHelper/Compiler/BfAutoComplete.cpp | 14 +++++-- IDEHelper/Compiler/BfExprEvaluator.cpp | 49 ++++++++++++++++------- IDEHelper/Compiler/BfExprEvaluator.h | 1 + IDEHelper/Compiler/BfSourceClassifier.cpp | 5 ++- 6 files changed, 71 insertions(+), 20 deletions(-) diff --git a/IDEHelper/Compiler/BfAst.cpp b/IDEHelper/Compiler/BfAst.cpp index 26498a77a..d0acb9275 100644 --- a/IDEHelper/Compiler/BfAst.cpp +++ b/IDEHelper/Compiler/BfAst.cpp @@ -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& vec, BfAstAllocator* alloc) diff --git a/IDEHelper/Compiler/BfAst.h b/IDEHelper/Compiler/BfAst.h index 4065fcfbc..7ac99b249 100644 --- a/IDEHelper/Compiler/BfAst.h +++ b/IDEHelper/Compiler/BfAst.h @@ -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); } diff --git a/IDEHelper/Compiler/BfAutoComplete.cpp b/IDEHelper/Compiler/BfAutoComplete.cpp index c75e2aa64..bf943ce10 100644 --- a/IDEHelper/Compiler/BfAutoComplete.cpp +++ b/IDEHelper/Compiler/BfAutoComplete.cpp @@ -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) @@ -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(); - } + } } } } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 4542945fe..5692c5707 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -7170,7 +7170,7 @@ void BfExprEvaluator::LookupQualifiedName(BfQualifiedNameNode* nameNode, bool ig bool wasBaseLookup = false; if (auto qualifiedLeftName = BfNodeDynCast(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(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; } @@ -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) @@ -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); } @@ -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; } @@ -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; diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index 87197c30c..7f4faba08 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -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); diff --git a/IDEHelper/Compiler/BfSourceClassifier.cpp b/IDEHelper/Compiler/BfSourceClassifier.cpp index 6123bffe1..3da074388 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.cpp +++ b/IDEHelper/Compiler/BfSourceClassifier.cpp @@ -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)