From f33e65b56dc596031b23c735f495b50b9ba62444 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Fri, 11 Sep 2020 14:15:55 -0700 Subject: [PATCH] Support for static indexers --- IDEHelper/Compiler/BfExprEvaluator.cpp | 49 +++++++++++++++----------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 05e19934..84ce107b 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -17393,10 +17393,31 @@ void BfExprEvaluator::Visit(BfMemberReferenceExpression* memberRefExpr) void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) { - VisitChild(indexerExpr->mTarget); - ResolveGenericType(); - auto target = GetResult(true); - if (!target) + BfTypedValue target; + bool wantStatic = false; + // Try first as a non-static indexer, then as a static indexer + for (int pass = 0; pass < 2; pass++) + { + SetAndRestoreValue ignoreErrors(mModule->mIgnoreErrors, (mModule->mIgnoreErrors) || (pass == 0)); + VisitChild(indexerExpr->mTarget); + ResolveGenericType(); + target = GetResult(true); + if (target) + break; + + if (pass == 0) + { + auto staticType = mModule->ResolveTypeRef(indexerExpr->mTarget, {}); + if (staticType != NULL) + { + wantStatic = true; + target.mType = staticType; + break; + } + } + } + + if (!target.HasType()) return; BfCheckedKind checkedKind = BfCheckedKind_NotSet; @@ -17434,21 +17455,6 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) if (target.mType->IsTypeInstance()) { mIndexerValues.clear(); -// for (BfExpression* expr : indexerExpr->mArguments) -// { -// if (expr == NULL) -// return; -// auto argVal = mModule->CreateValueFromExpression(expr); -// if (!argVal) -// { -// mModule->AssertErrorState(); -// argVal = mModule->GetDefaultTypedValue(mModule->mContext->mBfObjectType); -// } -// BfResolvedArg resolvedArg; -// resolvedArg.mExpression = expr; -// resolvedArg.mTypedValue = argVal; -// mIndexerValues.push_back(resolvedArg); -// } SizedArray argExprs; BfSizedArray sizedArgExprs(indexerExpr->mArguments); @@ -17505,6 +17511,9 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) // For generic params - check interface constraints for an indexer, call that method BF_ASSERT(!target.mType->IsGenericParam()); + if (checkMethod->mIsStatic != wantStatic) + continue; + if (checkMethod->mExplicitInterface != NULL) continue; @@ -17528,7 +17537,7 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) if (!methodMatcher.IsMemberAccessible(curCheckType, checkMethod->mDeclaringType)) continue; - + methodMatcher.mCheckedKind = checkedKind; methodMatcher.mTarget = target; methodMatcher.CheckMethod(startCheckTypeInst, curCheckType, checkMethod, false);