diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 3218ac74..362d9382 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -21931,6 +21931,10 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) void BfExprEvaluator::HandleIndexerExpression(BfIndexerExpression* indexerExpr, BfTypedValue target) { + BfAstNode* refNode = indexerExpr->mOpenBracket; + if (refNode == NULL) + refNode = indexerExpr->mTarget; + bool wantStatic = false; // Try first as a non-static indexer, then as a static indexer @@ -22028,6 +22032,13 @@ void BfExprEvaluator::HandleIndexerExpression(BfIndexerExpression* indexerExpr, BfMethodDef* methodDef = NULL; auto startCheckTypeInst = target.mType->ToTypeInstance(); + auto lookupType = target.mType; + if (lookupType != NULL) + { + lookupType = BindGenericType(refNode, lookupType); + if (lookupType->IsGenericParam()) + startCheckTypeInst = NULL; + } for (int pass = 0; pass < 2; pass++) { @@ -22036,7 +22047,7 @@ void BfExprEvaluator::HandleIndexerExpression(BfIndexerExpression* indexerExpr, BfPropertyDef* foundProp = NULL; BfTypeInstance* foundPropTypeInst = NULL; - BfBaseClassWalker baseClassWalker(target.mType, NULL, mModule, true); + BfBaseClassWalker baseClassWalker(lookupType, NULL, mModule, true); while (true) { diff --git a/IDEHelper/Tests/src/Indexers.bf b/IDEHelper/Tests/src/Indexers.bf index 3c9c1e8a..1ffb810c 100644 --- a/IDEHelper/Tests/src/Indexers.bf +++ b/IDEHelper/Tests/src/Indexers.bf @@ -109,6 +109,22 @@ namespace Tests } } + class IndexTestExplicit : IIndexable + { + public float IIndexable.this[int index] + { + get + { + return index; + } + + set + { + + } + } + } + public static float Get(T indexable) where T : IIndexable { float f = indexable[4]; @@ -147,6 +163,10 @@ namespace Tests IndexTest it = scope .(); Test.Assert(it[5] == 5.0f); + Test.Assert(Get(it) == 4); + + IndexTestExplicit it2 = scope .(); + Test.Assert(Get(it2) == 4); } } }