From ed6959973a062b124eea6a90f05f4a9ee78ca1a8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 11 Jan 2022 12:02:23 -0500 Subject: [PATCH] Fixed some constraint lookups --- IDEHelper/Compiler/BfExprEvaluator.cpp | 22 +++++++++++++++-- IDEHelper/Compiler/BfReducer.cpp | 6 +++++ IDEHelper/Tests/src/Constraints.bf | 34 ++++++++++++++++++++++++++ 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index dadc1856..36a772c5 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -4228,7 +4228,8 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar { if ((target.mType != NULL && (target.mType->IsGenericParam()))) { - auto genericParamInst = mModule->GetGenericParamInstance((BfGenericParamType*)target.mType); + auto genericParamType = (BfGenericParamType*)target.mType; + auto genericParamInst = mModule->GetGenericParamInstance(genericParamType); if (target.mValue) { @@ -4242,10 +4243,20 @@ BfTypedValue BfExprEvaluator::LookupField(BfAstNode* targetSrc, BfTypedValue tar } } - if ((mModule->mCurMethodInstance != NULL) && (mModule->mCurMethodInstance->mIsUnspecialized)) + bool isUnspecializedSection = false; + if (genericParamType->mGenericParamKind == BfGenericParamKind_Method) + isUnspecializedSection = (mModule->mCurMethodInstance != NULL) && (mModule->mCurMethodInstance->mIsUnspecialized); + else + isUnspecializedSection = (mModule->mCurTypeInstance != NULL) && (mModule->mCurTypeInstance->IsUnspecializedType()); + + if (isUnspecializedSection) { if (genericParamInst->mTypeConstraint != NULL) + { target.mType = genericParamInst->mTypeConstraint; + if (target.mType->IsWrappableType()) + target.mType = mModule->GetWrappedStructType(target.mType); + } else target.mType = mModule->mContext->mBfObjectType; @@ -19600,6 +19611,13 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) if (!target.HasType()) return; + if (target.mType->IsGenericParam()) + { + auto genericParamInstance = mModule->GetGenericParamInstance((BfGenericParamType*)target.mType); + if (genericParamInstance->mTypeConstraint != NULL) + target.mType = genericParamInstance->mTypeConstraint; + } + BfCheckedKind checkedKind = BfCheckedKind_NotSet; bool isInlined = false; diff --git a/IDEHelper/Compiler/BfReducer.cpp b/IDEHelper/Compiler/BfReducer.cpp index 5dc1ae3d..d282aa69 100644 --- a/IDEHelper/Compiler/BfReducer.cpp +++ b/IDEHelper/Compiler/BfReducer.cpp @@ -697,6 +697,12 @@ bool BfReducer::IsTypeReference(BfAstNode* checkNode, BfToken successToken, int* } else if (checkToken == BfToken_RBracket) { + if (bracketDepth == 0) + { + // Not even an array + return false; + } + endBracket = checkIdx; } else if ((checkToken == BfToken_Star) || (checkToken == BfToken_Question)) diff --git a/IDEHelper/Tests/src/Constraints.bf b/IDEHelper/Tests/src/Constraints.bf index 04ddc3af..30784204 100644 --- a/IDEHelper/Tests/src/Constraints.bf +++ b/IDEHelper/Tests/src/Constraints.bf @@ -76,6 +76,40 @@ namespace Tests ClassA.DoAdd(val, val); } + struct StringViewEnumerator : IEnumerator + where C : const int + where TS : StringView[C] + { + private TS mStrings; + private int mIdx; + + public this(TS strings) + { + mStrings = strings; + mIdx = -1; + } + + public StringView Current + { + get + { + return mStrings[mIdx]; + } + } + + public bool MoveNext() mut + { + return ++mIdx != mStrings.Count; + } + + public Result GetNext() mut + { + if (!MoveNext()) + return .Err; + return Current; + } + } + [Test] public static void TestBasics() {