From 4c40028b33c5944c19851e3ca9c3e7010cafcf69 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 19 Feb 2021 06:05:00 -0800 Subject: [PATCH] Fixed O^2 issue relative to method chain length --- IDEHelper/Compiler/BfSourceClassifier.cpp | 44 +++++++++++++++++------ 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/IDEHelper/Compiler/BfSourceClassifier.cpp b/IDEHelper/Compiler/BfSourceClassifier.cpp index 387671ca..fc073b17 100644 --- a/IDEHelper/Compiler/BfSourceClassifier.cpp +++ b/IDEHelper/Compiler/BfSourceClassifier.cpp @@ -1,5 +1,6 @@ #include "BfSourceClassifier.h" #include "BfParser.h" +#include "BeefySysLib/util/BeefPerf.h" USING_NS_BF; @@ -421,14 +422,22 @@ void BfSourceClassifier::Visit(BfTokenNode* tokenNode) void BfSourceClassifier::Visit(BfInvocationExpression* invocationExpr) { - BfElementVisitor::Visit(invocationExpr); + //BfElementVisitor::Visit(invocationExpr); + Visit(invocationExpr->ToBase()); + + //BP_ZONE("BfSourceClassifier BfInvocationExpression"); BfAstNode* target = invocationExpr->mTarget; if (target == NULL) return; - + + VisitChild(invocationExpr->mOpenParen); + VisitChild(invocationExpr->mCloseParen); + VisitChild(invocationExpr->mGenericArgs); + if (auto scopedTarget = BfNodeDynCast(target)) { + VisitChild(target); target = scopedTarget->mTarget; VisitChild(scopedTarget->mScopeName); } @@ -438,25 +447,33 @@ void BfSourceClassifier::Visit(BfInvocationExpression* invocationExpr) { VisitChild(qualifiedName->mLeft); VisitChild(qualifiedName->mDot); + VisitChild(qualifiedName->mRight); identifier = qualifiedName->mRight; } else if ((identifier = BfNodeDynCast(target))) { + VisitChild(target); // Leave as BfAttributedIdentifierNode if that's the case - identifier = target; + identifier = target; } else if (auto qualifiedName = BfNodeDynCast(target)) { VisitChild(qualifiedName->mLeft); VisitChild(qualifiedName->mDot); + VisitChild(qualifiedName->mRight); identifier = qualifiedName->mRight; } else if (auto memberRefExpr = BfNodeDynCast(target)) { VisitChild(memberRefExpr->mTarget); VisitChild(memberRefExpr->mDotToken); + VisitChild(memberRefExpr->mMemberName); identifier = memberRefExpr->mMemberName; } + else + { + VisitChild(target); + } if (identifier != NULL) { @@ -469,20 +486,25 @@ void BfSourceClassifier::Visit(BfInvocationExpression* invocationExpr) if (identifier != NULL) SetElementType(identifier, BfSourceElementType_Method); } + + for (auto& val : invocationExpr->mArguments) + VisitChild(val); + for (auto& val : invocationExpr->mCommas) + VisitChild(val); } void BfSourceClassifier::Visit(BfIndexerExpression* indexerExpr) { - BfElementVisitor::Visit(indexerExpr); + //BfElementVisitor::Visit(indexerExpr); + Visit(indexerExpr->ToBase()); VisitChild(indexerExpr->mTarget); VisitChild(indexerExpr->mOpenBracket); - for (int i = 0; i < (int) indexerExpr->mArguments.size(); i++) - { - if (i > 0) - VisitChild(indexerExpr->mCommas[i - 1]); - VisitChild(indexerExpr->mArguments[i]); - } + + for (auto& val : indexerExpr->mArguments) + VisitChild(val); + for (auto& val : indexerExpr->mCommas) + VisitChild(val); VisitChild(indexerExpr->mCloseBracket); } @@ -523,6 +545,8 @@ void BfSourceClassifier::Visit(BfMethodDeclaration* methodDeclaration) if (!IsInterestedInMember(methodDeclaration)) return; + //BP_ZONE("BfSourceClassifier BfMethodDeclaration"); + SetAndRestoreValue prevMember(mCurMember, methodDeclaration); BfElementVisitor::Visit(methodDeclaration);